资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,2014,级 研究生,嵌入式系统体系结构与开发,2014,级 研究生嵌入式系统体系结构与开发,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,2014,级 研究生嵌入式系统体系结构与开发,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,2014,级 研究生,嵌入式系统体系结构与开发,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,嵌入式系统体系构造与开发嵌入式处理器,ARM,指令系统,ARM体系的构造版本,ARM体系的构造版本,ARM体系构造共有6个版本,版本号1-6,指令集功能不断扩大,特定功能:,T支持Thumb指令集,M支持长乘法指令,E支持增加型DSP指令,Jjava,SIMDARM媒体功能扩展,ARM微处理器工作模式与存放器,ARM微处理器指令集,ARM,THUMB,ARM微处理器工作模式,用户模式,特权模式系统模式与特殊模式,模式切换,存放器组织,存放器定义,模式与存放器,ARM,与,THUMB,从编程的角度看,ARM微处理器有两种指令集,可在两种指令集之间切换:,ARM指令集,处理器执行32位的字对齐的ARM指令;,Thumb指令集,处理器执行16位的、半字对齐Thumb指令。,THUMB指令是ARM指令的子集,可以相互调用,只要遵循确定的调用规章,Thumb指令与ARM指令的时间效率和空间效率关系为:,存储空间约为ARM代码的6070,指令数比ARM代码多约3040,存储器为32位时,ARM代码比Thumb代码快约40,存储器为16位时,Thumb比ARM代码快约4050,使用Thumb代码,存储器的功耗会降低约30,ARM,与,THUMB,指令,指令切换方法,ARM指令集和Thumb指令集均有切换处理器状态的指令,,在开头执行代码时,应当处于ARM指令集,指令集切换分状态位设置和特殊处理两种,进入Thumb指令,当操作数存放器的状态位位0为1时,承受执行BX指令的方法,使微处理器从ARM指令集切换到Thumb指令集,当处理器处于Thumb指令时,发生特殊如IRQ、FIQ、Undef、Abort、SWI等,则特殊处理返回时,自动切换到Thumb指令。,切换到ARM指令,当操作数存放器的状态位位0为0时,执行BX指令时可以使微处理器从Thumb切换到ARM,在处理器进展特殊处理时,把PC指针放入特殊模式链接存放器中,并从特殊向量地址开头执行程序,也可以使处理器切换到ARM。,ARM,微处理器运行模式,User,模式,用户程序不能访问有些受疼惜的资源,只能通过特殊的形式来转变CPU的当前运行模式,特权模式,可以存取系统中的任何资源,System,模式,系统模式,与,User,模式的运行环境一样,但是它可以不受任何限制的访问任何资源,该模式主要用于运行系统中的一些特权任务,FIQ,模式,IRQ,模式,Supervisor,模式,Abort,模式,Undefined,模式,特殊模式:主要是在外部中断或者程序执行非法操作时会触发,用户模式,处理器模式,用户模式。,usr:ARM处理器正常的程序执行状态,特权模式特殊模式,fiq:用于高速数据传输或通道处理,irq:用于通用的中断处理,svc:操作系统使用的疼惜模式,abt:用于虚拟存储及存储疼惜,und:当消逝未定义指令终止时进入该模式,sys:运行具有特权的操作系统任务,ARM,微处理器运行模式,ARM,处理器运行模式图,ARM,微处理器的指令系统,ARM微处理器的指令集是加载/存储型的,指令集仅能处理存放器中的数据,,处理结果都要放回存放器中,对系统存储器的访问则需要通过特地的加载/存储指令来完成。,ARM微处理器的指令集可以分为六大类,跳转指令,数据处理指令,程序状态存放器PSR处理指令,加载/存储指令,协处理器指令和特殊产生指令,OpCode指令助记符,Cond:执行条件,S:是否影响状态存放器,Rd:目标存放器,Rn:第1个操作数存放器,Operand2:第2个操作数,ARM指令根本语法格式,S,例子,LDR R0,R1;无条件执行,BEQ LOOP;等于条件,ADDS R2,R2,#1;影响状态位,R2-R2+1,指令编码格式,ARM指令编码构造条件域,ARM,指令编码的条件域,当处理器工作在ARM状态时,几乎全部的指令均依据CPSR中条件码的状态和指令的条件域有条件的执行。当指令的执行条件满足时,指令被执行,否则指令被无视。,每一条ARM指令包含4位的条件码,位于指令的最高4位31:28。,条件码共有16种,每种条件码可用两个字符表示,这两个字符可以添加在指令助记符的后面和指令同时使用。例如,跳转指令B可以加上后缀EQ变为BEQ表示“相等则跳转”,即当CPSR中的Z标志置位时发生跳转。,ARM,指令编码的条件域,条件编码,条件码,后缀,标 志,含 义,0000,EQ,Z,置位,相等,0001,NE,Z,清零,不相等,0010,CS,C,置位,无符号数大于或等于,0011,CC,C,清零,无符号数小于,0100,MI,N,置位,负数,0101,PL,N,清零,正数或零,0110,VS,V,置位,溢出,0111,VC,V,清零,未溢出,ARM,指令编码的条件域,条件编码,条件码,后缀,标 志,含 义,1001,LS,C,清零,Z,置位,无符号数小于或等于,1010,GE,N,等于,V,带符号数大于或等于,1011,LT,N,不等于,V,带符号数小于,1100,GT,Z,清零且(,N,等于,V,),带符号数大于,1101,LE,Z,置位或(,N,不等于,V,),带符号数小于或等于,1110,AL,忽略,无条件执行,ARM,微处理器指令表,-1,助记符,指令功能描述,ADC,带进位加法指令,ADD,加法指令,AND,逻辑与指令,B,跳转指令,B,IC,位清零指令,B,L,带返回的跳转指令,B,LX,带返回和状态切换的跳转指令,B,X,带状态切换的跳转指令,ARM,微处理器指令表,-2,助记符,指令功能描述,CDP,协处理器数据操作指令,CMN,比较反值指令,CMP,比较指令,EOR,异或指令,L,DC,存储器到协处理器的数据传输指令,L,DM,加载多个寄存器指令,L,DR,存储器到寄存器的数据传输指令,M,CR,ARM,寄存器到协处理器寄存器数据传输,ARM,微处理器指令表,-3,助记符,指令功能描述,MLA,乘加运算指令,M,OV,数据传送指令,M,RC,协处理器寄存器到,ARM,寄存器数据传输,M,RS,传送,CPSR,或,SPSR,的内容到通用寄存器,M,SR,传送通用寄存器到,CPSR,或,SPSR,的指令,MUL,32,位乘法指令,MLA,32,位乘加指令,M,VN,数据取反传送指令,ARM,微处理器指令表,-4,助记符,指令功能描述,ORR,逻辑或指令,RSB,逆向减法指令,RSC,带借位的逆向减法指令,SBC,带借位减法指令,ST,C,协处理器寄存器写入存储器指令,ST,M,批量内存字写入指令,ST,R,寄存器到存储器的数据传输指令,SUB,减法指令,ARM,微处理器指令表,-5,助记符,指令功能描述,SWI,软件中断指令,SWP,交换指令,TEQ,相等测试指令,TST,位测试指令,ARM寻址方式,ARM寻址方式,马上寻址,存放器寻址,存放器间接寻址,基址变址寻址,多存放器寻址,相对寻址,堆栈寻址,ARM,指令的寻址方式,ARM指令系统支持如下几种常见的寻址方式:,马上寻址,存放器寻址,存放器间接寻址,基址变址寻址,多存放器寻址,相对寻址,堆栈寻址,ARM指令的寻址方式-马上寻址,马上寻址,操作数本身就在指令中给出,只要取出指令也就取到了操作数。这个操作数被称为马上数。,例如以下指令:,ADD R0,R0,1/*R0R01*/,ADD R0,R0,0x3f/*R0R00x3f*/,马上操作数,在以上两条指令中,其次个源操作数即为马上数,要求以“”为前缀,对于以十六进制表示的马上数,还要求在“”后加上“0x”。,ARM指令的寻址方式-存放器寻址,存放器寻址,利用存放器中的数值作为操作数,这种寻址方式是各类微处理器常常承受的一种方式,也是一种执行效率较高的寻址方式。以下指令:,ADDR0,R1,R2/*R0R1R2*/,该指令的执行效果是将存放器R1和R2的内容相加,其结果存放在存放器R0中。,ARM指令的寻址方式-存放器间接寻址,存放器间接寻址,以存放器中的值作为操作数的地址,而操作数本身存放在存储器中。例如以下指令:,ADD R0,R1,R2/*R0R1R2*/,LDRR0,R1/*R0R1*/,STRR0,R1/*R1R0*/,第一条指令中,以存放器R2的值作为操作数的地址,在存储器中取得一个操作数后与R1相加,结果存入存放器R0中;,其次条指令将以R1的值为地址的存储器中的数据传送到R0中。,第三条指令将R0的值传送到以R1的值为地址的存储器中。,ARM,指令的寻址方式,-,基址变址寻址,基址变址寻址,将基址存放器的内容与指令中给出的地址偏移量相加,从而得到一个操作数的有效地址。变址寻址方式常用于访问某基地址四周的地址单元。承受变址寻址方式的指令常见有以下几种形式,如下所示:,LDR R0,R1,4;R0R14,LDR R0,R1,4!;R0R14、R1R14,LDR R0,R1 ,4;R0R1、R1R14,LDR R0,R1,R2;R0R1R2,在第一条指令中,将存放器R1的内容加上4形成操作数的有效地址,从而取得操作数存入存放器R0中。,在其次条指令中,将存放器R1的内容加上4形成操作数的有效地址,从而取得操作数存入存放器R0中,然后,R1的内容自增4个字节。,在第三条指令中,以存放器R1的内容作为操作数的有效地址,从而取得操作数存入存放器R0中,然后,R1的内容自增4个字节。,在第四条指令中,将存放器R1的内容加上存放器R2的内容形成操作数的有效地址,从而取得操作数存入存放器R0中。,ARM指令的寻址方式-多存放器寻址,多存放器寻址方式,一条指令可以完成多个存放器值的传送。这种寻址方式可以用一条指令完成传送最多16个通用存放器的值。以下指令:,LDMIA R0,R1,R2,R3,R4;R1R0,;R2R04,;R3R08,;R4R012,该指令的后缀IA表示在每次执行完加载/存储操作后,R0按字长度增加,因此,指令可将连续存储单元的值传送到R1R4。,STMIA R0!,R1-R4 ;R0R1,;R0+4R2,;R08 R3,;R012 R4,ARM,指令的寻址方式,-,相对寻址,与基址变址寻址方式相类似,相对寻址以程序计数器PC的当前值为基地址,指令中的地址标号作为偏移量,将两者相加之后得到操作数的有效地址。以下程序段完成子程序的调用和返回,跳转指令BL承受了相对寻址方式:,BL NEXT;跳转到子程序NEXT处执行,NEXT,MOVPC,LR;从子程序返回,ARM,指令的寻址方式,-,堆栈寻址,堆栈是一种数据构造,按先进后出First In Last Out,FILO的方式工作,使用一个称作堆栈指针的专用存放器指示当前的操作位置,堆栈指针总是指向栈顶。,当堆栈指针指向最终压入堆栈的数据时,称为满堆栈Full Stack,而当堆栈指针指向下一个将要放入数据的空位置时,称为空堆栈Empty Stack。,ARM,指令的寻址方式,-,堆栈寻址,堆栈的生成方式:,递增堆栈Ascending Stack当堆栈由低地址向高地址生成时,称为递增堆栈;,递减堆栈Decending Stack,当堆栈由高地址向低地址生成时,称为递减堆栈。,四种类型的堆栈工作方式 :,满递增堆栈:堆栈指针指向最终压入的数据,且由低地址向高地址生成。,满递减堆栈:堆栈指针指向最终压入的数据,且由高地址向低地址生成。,空递增堆栈:堆栈指针指向下一个将要放入数据的空位置,且由低地址向高地址生成。,空递减堆栈:堆栈指针指向下一个将要放入数据的空位置,且由高地址向低地址生成,ARM伪指令,ARM伪指令,数据定义伪指令,把握伪指令,地址加载伪指令,声明引用,段域伪指令,ARM,的伪指令,定义数据伪指令,DCB安排连续的字节存储单元,并设置初值,DCW/DCWU安排连续的半字存储单元,并设置初值,DCD/DCDU安排连续的字存储单元,并设置初值,DCQ/DCQU安排8字节为块存储单元,并设置初值,DCFS/DCFSU为单精度浮点数安排连续存储单元,并设置初值,DCFD/DCFDU为双精度浮点数安排连续的字存储单元,并设置初值,SPACE安排一块连续的存储单元,FIELD安排一块连续的存储单元,MAP定义一个构造化的内存表的首地址,ARM,的伪指令,把握伪指令,IF 指令序列 ELSE 指令序列 ENDIF 条件编译指令,WHILE WEND 条件循环执行指令,地址加载伪指令,ADR 小范围的地址读取,ADRL 中范围的地址读取,LDR 大范围的地址读取,NOP,ARM,的伪指令,声明引用,EQU定义字符名称,EXPORT声明全局标号,IMPORT在其他源文件中定义标号,EXTERN在其他源文件中定义标号,GET(或Include)包含源文件指令,INCBIN包含目标文件和数据文件包指令,RN定义存放器别名,ROUT定义局部变量的作用范围,ARM,的伪指令,段域伪指令,FILED和MAP 构造化内存表中的数据域指令,AREA定义代码段和数据段指令,CODE:代码段,DATA:数据段,READONLY,READWRITE,ALIGN,COMMON:通用段,ALIGN对齐指令,CODE16和CODE32指示指令序列类型指令,ENTRY指定入口点指令,END应用程序结尾指令,程序举例,ENTRY,start,MOV R0,#0xFF,MOV R1,#0xEF000000,MOV R2,#0x2F000000,MOV R3,#0xFF,ADD R4,R2,R1;不转变状态位,R4=0X1E000000,ADDS R5,R2,R1;转变状态位 CPSR=0x2023003d,结果不变,ADCS R6,R2,R1; 结果R4=0X1E000001,SUB R4,R2,R1;不转变状态位, R4=0X40000000,SUBS R4,R2,R1; 转变状态位 CPSR=0x0000003d,RSB R5,R2,R1; R5=0XC0000000,RSBS R5,R2,R1;转变状态位 CPSR=0xA000003d,SBC R6,R1,R2; R6=0XC0000000,RSC R7,R1,R2;R7=0x40000000,不转变状态位,stop,B stop,END,2,GPIO,I/O,定义,ARM中的I/O接口定义,2410硬件上的引线,系统上的可编程存放器,程序上的应用,各类接口的定义,接口的主要功能,硬件上信号线,可编程硬件存放器,应用程序的设计,各类接口的程序组织,系统局部,公共局部,共性局部,ARM,中的,I/O,接口定义,ARM中的I/O接口定义,2410硬件上的引线,系统上的可编程存放器,程序上的应用,2410,硬件上的引线,有117个通用的IO接口,PROT A(23),PROT B(11),PROT C(16),PROT D(16),PROT E(16),PROT F(8),PROT G(16),PROT H(11),ARM公司将每个IO接口作成复用信号线,见图Mini2410 P1-3,每个应用可以依据实际状况选用,Port A,组的引脚功能,Port B,组的引脚功能,Port C,组的引脚功能,Port D,组的引脚功能,Port E,组的引脚功能,Port F,组的引脚功能,Port G,组的引脚功能,Port H,组的引脚功能,系统上的可编程存放器,可编程的几种存放器,接口配置存放器,PORT CONFIGURATION REGISTER (GPACON-GPHCON),接口数据存放器,PORT DATA REGISTER (GPADAT-GPHDAT),接口上拉存放器,PORT PULL-UP REGISTER (GPBUP-GPHUP),杂项存放器,MISCELLANEOUS CONTROL REGISTER,外部中断把握存放器,EXTERNAL INTERRUPT CONTROL REGISTER (EXTINTN),电源关闭模式和I/O接口,POWER_OFF MODE AND I/O PORTS,通用状态存放器,GENERAL STATUS REGISTER (GSTATUSn),系统上的可编程存放器,可编程的几种存放器地址GPX,每组有四个可编程存放器:CON,DAT,UP,RESERVED,地址连续:00,04,08,0C,分组存放器编址,Port A 0X5600 0000-0X5600 000C,Port B 0X5600 0010-0X5600 001C,Port C 0X5600 0020-0X5600 002C,Port D 0X5600 0030-0X5600 003C,Port E 0X5600 0040-0X5600 004C,Port F 0X5600 0050-0X5600 005C,Port G 0X5600 0060-0X5600 006C,Port H 0X5600 0070-0X5600 007C,接口配置存放器 (GPACON)0X56000000,只有,输出,地址线,接口配置存放器 (GPB-HCON)0X56000010,输入,输出,专用,信号线,保存,接口数据存放器(GPADAT-GPHDAT) 0X560000X4,接口数据存放器定义,引脚被定义为输出时,数据存放器作为输出锁存,引脚被定义为输入时,数据存放器作为输入锁存,引脚被定义为专用功能时,数据存放器依据功能线定义,留意:,输出数据是写入的把握命令或数据,输入数据是读入的状态或数据,接口上拉存放器 (GPBUP-GPHUP) X560000X8,上拉存放器,当相应的位为=0时,表示该位上拉信号使能,当相应的位为=1时,表示该位上拉信号无效,留意,上拉是为引脚供给电流,假设不使用上拉,需要外接上拉电压来供给电流,接口杂项存放器 (MISCELLANEOUS) X56000080,程序上的定义,定义存放器名和端口地址定义,2410addr.h,初始化存放器端口初值,2410lib.C,void port_init(void),正常调用关系,Main,SysInit,port_init,APP_TEST,系统初始化,void sys_init,change_clock_divider(1,1);/ 1:2:4,change_value_MPLL(M_MDIV, M_PDIV, M_SDIV);/ Fin=12MHz FCLK=202.8MHz,delay(0);/ adjust the delay count,port_init;,interrupts_init;,uart_init(PCLK, 115200, UART0);,uart_init(PCLK, 115200, UART1);,uart_init(PCLK, 115200, UART2);,#ifdef CLK124_200M,change_value_MPLL(88,1,1);/ Fin=12MHz FCLK=192MHz,uart_init(192023000/4, 115200, UART0);,uart_init(192023000/4, 115200, UART1);,#endif,uart_select(UART1);,print_infor;,delay(500);,port_init(void),void port_init(void),/CAUTION:Follow the configuration order for setting the ports.,/ 1) setting control register (GPnCON),/ * (bitn) - means this pin not use on circuit, and set as default function,/ 2) configure pull-up resistor (GPnUP),/ 3) setting value (GPnDAT),/= PORT A GROUP,rGPACON = 0x5fbfff;,/=* PORT B GROUP,/Ports : GPB10 GPB9 GPB8 GPB7 GPB6 GPB5 GPB4 GPB3 GPB2 GPB1 GPB0,/Signal : GPB10 GPB9 GPB8 GPB7 GPB6 DIS_OFF L3CLOCK L3DATA L3MODE PWM2 PWM1,/Setting: Output Output Output Output Output Output Output Output Output TOUT1 TOUT0,/Binary : 01, 01 *01, *01 *01, 01 01, 01 01, 10 10,rGPBCON = 0x155559;,各类接口的定义,各类接口的定义,接口的主要功能,硬件上信号线,可编程硬件存放器,应用程序的设计,接口功能,接口功能,系统板上信号指示灯,三个指示灯接在锁存器的,D2-D0,上,电路引脚,电路关系,CPLD-138-,或门,-8D,输出锁存器,CPLD,选通信号线,EXCS:A25-A21(01000),3-8,译码器片选使能接,EXCS,3-8,译码器译码信号,ABC:A20-A18(110),Y6,输出,输出锁存器的数据接,LED,负端,正端接上拉电阻,Y6,和,WE,信号或作用输出锁存器,LED,属于无条件输出,输出地址,A25-A18=01 0001 1000 0000 0000 0000 0000,0X21180000,可编程硬件存放器,LED编程存放器,#define rCPLDLEDADDR (*(volatile unsigned char*)0x21180000),LED,接口的主要功能,LED显示灯,输出接口,数据位低四位连接,灯亮电平为低,灯灭电平为高,LED_TEST函数,led_on;,led_off;,led_on_off;,led_on函数,void led_on(void),int i,nOut;,nOut = 0xFF;,rCPLDLEDADDR = nOut ,与操作,1000,for(i = 0; i 100000; i+);,延时,rCPLDLEDADDR = nOut ,与操作,1011,for(i = 0; i 100000; i+);,rCPLDLEDADDR = nOut ,与操作,1101,for(i = 0; i 500000; i+);,rCPLDLEDADDR = nOut ,与操作,1110,for(i = 0; i 500000; i+);,led_off(void),void led_off(void),int i,nOut;,nOut = 0xF0;,rCPLDLEDADDR = nOut | 0x01;,或操作,0001,for(i = 0; i 100000; i+);,rCPLDLEDADDR = nOut | 0x03;,或操作,0011,for(i = 0; i 100000; i+);,rCPLDLEDADDR = nOut | 0x07;,或操作,0111,for(i = 0; i 100000; i+);,rCPLDLEDADDR = nOut | 0x0F;,或操作,1111,for(i = 0; i 100000; i+);,led_on_off(void),void led_on_off(void),int i;,rCPLDLEDADDR = 0xF0;,全亮,for(i = 0; i 100000; i+);,rCPLDLEDADDR = 0xFF;,全灭,for(i = 0; i 100000; i+);,
展开阅读全文