欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    北工大-嵌入式系统复习.ppt

    • 资源ID:6102841       资源大小:2.94MB        全文页数:142页
    • 资源格式: PPT        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    北工大-嵌入式系统复习.ppt

    1,体系结构,体系结构:CISC RISC CISC指令集 Intel 及其兼容的处理器用最少的机器语言指令来完成所需的计算任务 RISC:Reduced Instructions Set Computing嵌入式系统:RISC 处理器速度比内存快寄存器,流水线 思想:针对流水线化的处理器优化,2,RISC和CISC之间的区别,3,Samsung S3C44B0X,Samsung S3C44B0X微处理器是三星公司专为手持设备和一般应用提供的高性价比和高性能的微控制器解决方案,它使用ARM7TDMI核,工作在66MHZ。为了降低系统总成本和减少外围器件,这款芯片中还集成了下列部件:,4,体系结构变化,THUMB指令集(T)THUMB 指令集:32位ARM指令集的子集,按16位指令重新编码代码尺寸小(up to 40%compression)简化设计,5,ARM体系结构版本,ARM/Thumb体系版本命名格式ARMv4xM ARMv字符串 体系结构版本号 18表示变种的字符:M D T E J I S 内核的命名:ARM7 T D M I-S,6,ARM编程模型,1.ARM流水线技术2.存储模式I/O空间3.工作模式和寄存器组4.异常和异常向量表5.AMBA总线6.JTAG调试接口,7,指令流水线(Pipeline),指令流水线是RISC结构的共同点ARM7 3级ARM9 5级ARM10 6级ARM Cortex A8 13级,8,按照冯诺依曼型计算机执行程序的原理,指令必须是按顺序方式逐条串行执行的。比如加法指令可以分成取指令、指令译码、取操作数、ALU运算、写结果五个步骤,如果有程序中有连续两条这样的指令,在传统的计算机里必须等第一条指令完全结束才能开始执行流水线的好处是:第一条指令开始译码的时候,第二条就可以开始取指令了。,9,指令流水线(Pipeline),允许多个操作同时处理,比逐条指令执行快PC指向正被取指的指令,而非正在执行的指令,寄存器读(从寄存器Bank)移位及ALU操作寄存器写(到寄存器Bank),Fetch,Decode,Execute,从存储器中读取指令,解码指令,PC PC,PC-4 PC-2,PC-8 PC-4,ARM Thumb,10,三级流水线:,Fetch,Decode,Execute,Fetch,Decode,Execute,Fetch,Decode,Execute,11,指令流水线(Pipeline),更多级的Pipeline,ARM10采用了6级流水线,但是处于兼容考虑,直接读取PC值依然等于“当前指令地址+8”。,12,13,多周期指令:时间片 1 2 3 4 5 6 7 81.取ADD 译码 执行2.取STR 译码 算地址 存数 3.取ADD 译码 执行4.取ADD 译码 执行5.取ADD 译码.,冯 诺依曼结构:不能同时访问指令和数据存储器,14,ARM9 5级流水线:哈佛结构数据和指令分别进行独立编址步骤:取指、译码、执行、缓冲、写回取指:从程序存储器中取指令流水线译码:读取寄存器操作数执行:如果是LDRSTR,则计算地址缓冲:LDRSTR访问数据存储器,否则缓冲写回:结果写到寄存器中,15,16,指令流水线(Pipeline),流水线的效率也可能低下,两个原因:1.相关性问题:一是如果第一条指令的结果是第二条指令执行所需要的,那么就出现了相关性问题。这就导致流水线必须停下来等前面的运算结束才能够继续后面的指令。解决这个问题的办法有乱序执行技术。,17,指令流水线(Pipeline),2.程序转移问题:由于无法事先判断转移指令会走那一边,所以必须等待结果出现。由于这样的指令在程序中数量众多,通常会导致流水线的停顿状况非常严重。解决的方法:一般是通过风险的预测执行或强行并行执行来解决。,18,ARM编程模型,1.ARM流水线技术2.存储模式I/O空间3.工作模式和寄存器组4.异常和异常向量表5.AMBA总线6.JTAG调试接口,19,处理器的工作状态,ARM7TDMI 处理器有两种工作状态:ARM-32-bit,按字排列的ARM指令集Thumb-16-bit,按半字排列的Thumb指令集ARM7TDMI 核的操作状态可能通过BX指令(分支和交换指令)在ARM状态和Thumb状态之间切换,20,例:从ARM状态切换到Thumb状态:LDR R0,=Label+1 BX R0从Thumb状态切换到ARM状态:LDR R0,=Label BX R0,21,存储器模式,1.I/O存储空间ARM 32位架构,I/O空间采用统一编址方式地址从0 x00000000开始以字节为单位的线性组合地址空间:232,(4GB)0232-1 230个32位的字单元 231个16位的半字单元地址:32位无符号数,可加减运算结果232取模,22,数据和指令类型ARM 32位地址线/数据线,支持如下数据类型:Byte:8 bitsHalfword:16 bits(2 byte),必须对齐2字节边界Word:32 bits(4 byte),必须对齐4字节边界有符号数,无符号数 共6种数据类型,23,存储器模式,2.ARM存储器工作模式(ENDIAN管脚)(1)Big Endian 大端模式字数据的高位字节存储在低地址中字数据的低字节则存放在高地址中,24,存储器模式,(2)Little Endian 小端模式(默认)低地址中存放字数据的低字节高地址中存放字数据的高字节,25,存储器模式举例,26,ARM编程模型,1.ARM流水线技术2.存储模式I/O空间3.工作模式和寄存器组4.异常和异常向量表5.AMBA总线6.JTAG调试接口,27,工作模式和寄存器,ARM有7个基本工作模式USR FIQ IRQ SVC ABT UND SYS 1、User:用户模式,一般的非特权任务运行的模式正常程序执行的模式2、FIQ快中断模式:当一个高优先级(fast)中断产生时将会进入这种模式高速数据传输和通道处理3、IRQ中断模式:当一个低优先级(normal)中断产生时将会进入这种模式通常的中断处理,28,工作模式和寄存器,4、Supervisor管理员(特权)模式(SVC):当复位或软中断指令执行时将会进入这种模式供操作系统使用的一种保护模式5、Abort中止模式:当存取异常时将会进入这种模式虚拟存储及存储保护6、Undef未定义模式:当执行未定义指令时会进入这种模式软件仿真硬件协处理器7、System系统模式:使用和User模式相同寄存器集,权限比用户模式高系统级的操作系统任务,29,工作模式,工作模式的类型用户模式:程序不能访问受操作系统保护的资源,也不能改变模式特权模式:除User之外的其他6种,处理异常和监控调用,可自由访问系统资源和改变模式异常模式:除系统模式外其他5中特权模式,处理异常和中断系统模式:不能通过异常进入,操作系统的任务可以访问所需系统和用户资源,不能访问异常寄存器组。确保异常不会破坏任务状态。,30,工作模式,工作模式的切换:软件切换 外部中断或异常OS控制系统整个资源,31,寄存器,ARM处理器共有37个寄存器(32位)31个通用寄存器6个状态寄存器每种工作模式对应一组寄存器:15个通用寄存器 R0R14 一个或两个状态寄存器 一个程序计数器R15(PC),32,通用寄存器,R0 到 R15 可以直接访问R0 到 R14 是通用寄存器R13:堆栈指针(sp)(通常)每种处理器模式都有单独的堆栈R14:链接寄存器(LR)R15 包含程序计数器(PC),33,程序状态寄存器,CPSR 当前程序状态寄存器,包括代码标志状态和当前模式位5个SPSRs-(程序状态保存寄存器)当异常发生时保存CPSR状态,34,程序状态寄存器,ARM7TDMI 包含当前程序状态寄存器(CPSR),加上5个程序状态保存寄存器SPSR,当异常发生时,用于保存CPSR的状态 这些寄存器的功能是:保存ALU当前操作信息控制允许和禁止中断设置处理器操作模式,35,程序状态寄存器,CPSR格式:,36,1.条件标志位Negative Zero Carry oVerflowN=1 结果为负,0-结果为正或0Z=1 结果为0,0 结果不为0C=1-有进位无借位,否则 0V=1-结果溢出,0结果没溢出,程序状态寄存器,37,2.Q位:bit(27)仅ARM 5TE/J架构支持指示增强型DSP指令是否溢出J位:bit(24)仅ARM 5TE/J架构支持J=1:处理器处于Jazelle状态,程序状态寄存器,38,控制位 中断禁止位:I=1:禁止 IRQ.F=1:禁止 FIQ.T Bit仅ARM xT架构支持T=0:处理器处于 ARM 状态T=1:处理器处于 Thumb 状态,程序状态寄存器,39,M控制位 处理器模式0b10000User0b10001FIQ0b10010IRQ0b10011Supervisor0b10111Abort0b11011Undefined0b11111System,程序状态寄存器,40,ARM编程模型,1.ARM流水线技术2.存储模式I/O空间3.工作模式和寄存器组4.异常和异常向量表5.AMBA总线6.JTAG调试接口,41,异常和异常向量表,1.异常(Exceptions)内部或外部中断源产生并引起处理器处理一个事件,如外部中断或试图执行未定义指令都会引起异常。程序流程控制的3种方式:(1).顺序执行(2).跳转指令(3).异常中断,处理异常之前必须保留处理器的状态,42,异常和异常向量表,2.异常的产生直接异常:软件中断,未定义指令(包括所要求的协处理器不存在时的协处理器命令)和预取指令间接异常:数据中止(在Load和Store数据访问时的存储器故障)外部异常:复位,IRQ和FIQ,43,异常和异常向量表,3.异常类型:7种RESET 复位UND 未定义的指令SWI 软件中断PABT 指令预取中止DABT 数据访问中止IRQ 外部中断请求FIQ 快速中断请求,44,异常和异常向量表,5.异常的优先级异常同时发生时,处理顺序(1)Reset(highest priority)(2)Data abort(3)FIQ(4)IRQ(5)Prefetch abort(6)未定义指令,Software interrupt(最低优先级),45,异常和异常向量表,6.异常向量表指定各异常中断及其处理程序的对应关系,RESET可以从0 x00000000开始或0 xffff0000开始,因此异常向量表可以放在上述地址,46,本章内容,ARM指令分类与格式,3.1,寻址方式,3.2,ARM 指令集介绍,3.3,4,47,1.ARM指令分类与格式,Load/Store 结构:在通用寄存器中操作 Load/Store从存储器中读取数据,操作后再放回存储器 把寄存器和存储器分开,48,1.ARM指令分类与格式,指令分类(6类)数据处理指令 使用和改变寄存器的值数据传送指令 把存储器的值拷贝到寄存器中(load)or 把寄存器中的值拷贝到存储器中(store)CPSR与通用寄存器间的传送指令跳转指令异常中断指令协处理器指令,49,1.ARM指令分类与格式,指令格式:3 地址指令格式 在ARM状态中使用2 地址指令格式 在 ARM和 THUMB 状态下使用,50,1.ARM指令分类与格式,ARM指令的一般编码格式:,31 28 27 25 24 21 20 19 16 15 12 11 8 7 0,S,例:ANDENS R0,R1,#0X0F,51,条件码域,ARM指令根据CPSR中的条件位自动判断是否执行指令,在条件满足时,指令执行,否则指令被忽略。在ARM的指令编码表中,统一占用编码的最高四位31:28来表示“条件码”(即“cond”)。,52,条件码域-1(P117),53,条件码域-2,54,ARM指令中的操作符号,1.立即数符号:“#”2.二进制符号:“2_”or“%”3.十六进制符号:“0 x”#0 xFF#%10010101,55,移位操作,移位:作为指令的选项 1.逻辑左移:LSL 低位补零2.算数左移:ASL 低位补零 MOV R0,R1,LSL#2 MOV R0,R1,ASL#23.逻辑右移:LSR 高位补零4.算数右移:ASR 高位用31位值填充5.循环右移:ROR 左端用右端移出数据补5.扩展循环右移:RRX 循环包括C位,56,57,本章内容,ARM指令分类与格式,1,寻址方式,2,ARM 指令集介绍,3,4,58,ARM寻址方式,处理器根据指令中的地址信息寻找物理地址的方式寻址方式种类:1 立即寻址2 寄存器寻址3 寄存器间接寻址4 基址加偏址寻址 5 堆栈寻址 6 块拷贝寻址 7 相对寻址,59,ARM寻址方式,立即寻址操作数直接通过指令给出,数据包含在32位编码中ADD R0,R0,#1AND R8,R7,#OxFF立即数:由一个8位常数循环右移偶数位得到,60,ARM寻址方式,寄存器寻址操作数为寄存器中的数值,指令中地址码为寄存器编号ADD R0,R1,R2ADD R3,R2,R1,LSR#2ADD R3,R2,R1,LSR R4,61,ARM寻址方式,寄存器间接寻址寄存器的值作为存储器地址 LDR R0,R1 STR R0,R1,62,ARM寻址方式,基址加偏址寻址基址寄存器内容与偏移量相加前变址模式LDR R0,R1,#4;R0=R1+4自动变址模式LDR R0,R1,#4!;R0=R1+4;R1=R1+4 后变址模式LDR R0,R1,#4;R0=R1;R1=R1+4,63,ARM寻址方式,基址加偏址寻址寄存器用作偏移地址LDR R0,R1,R2LDR R0,R1,R2,LSL#2传送数据类型LDRB R0,R1LDRH R1,R0,#20,64,ARM寻址方式,堆栈寻址,堆栈是一种数据结构,按先进后出(First In Last Out,FILO)的方式工作,65,ARM寻址方式,四种类型的堆栈工作方式:满递增堆栈:堆栈指针指向最后压入的数据,且由低地址向高地址生成。满递减堆栈:堆栈指针指向最后压入的数据,且由高地址向低地址生成。空递增堆栈:堆栈指针指向下一个将要放入数据的空位置,且由低地址向高地址生成。空递减堆栈:堆栈指针指向下一个将要放入数据的空位置,且由高地址向低地址生成。,66,ARM寻址方式,堆栈寻址ARM指令中,通过Load/Store指令来实现STMFD SP!R1-R7,LRLDMFD SP!R1-R7,LRThumb指令中,通过Push/Pop指令来实现PUSH R1-R7,LRPOP R1-R7,PC,67,ARM寻址方式,块拷贝寻址多寄存器传送指令LDM/STM的寻址方式LDMIA R0!,R2-R9;将数据加载到R2-R9,R0为基址STMIA R1!,R2-R9;将数据存入到存储器,R1为基址,68,ARM寻址方式,相对寻址 以PC当前值为基址,以指令中的地址标号为偏移量BL SUBA SUBA MOV PC,R14,69,本章内容,ARM指令分类与格式,1,寻址方式,2,ARM 指令集介绍,3,4,70,3.ARM指令集介绍,指令分类(6类)数据处理指令 Load/Store指令状态寄存器访问指令跳转指令异常中断指令协处理器指令,71,3.1数据处理指令,数据处理指令的类别(1)算术操作(2)按位逻辑操作(3)寄存器数据传送操作(4)比较操作,72,3.1数据处理指令,操作数:32-bits;3种指定操作数方式(寻址)来自寄存器第二操作数可以是常数(立即数)移位寄存器操作数结果:32-bits 宽,放在寄存器中长乘法产生64位结果,73,3.1数据处理指令,算术操作,74,3.1数据处理指令,按位逻辑操作,75,3.1数据处理指令,寄存器数据传送,比较操作,76,3.2 Load/Store指令,示例:LDMFD R13!,R0,R4-R12,PC将堆栈中的内存恢复到寄存器,用于函数返回LDMIA R13!,R0,R4-R12,PC读取数据到寄存器同时,进行SPSR到CPSR的数据传输,77,3.2 Load/Store指令,单寄存器交换指令(SWP SWPB)在寄存器和外部存储器之间交换字节或字格式:SWP,RnSWP R0,R1,R2 将R2指向的存储器的字送给R0,同时将R1中的字数据传送到R2指向的存储器中SWP R0,R0,R2,78,SWPB R1,R2,R0将R0指向的内存字节读到R1低8位,其余24为置0;将R2低8为数据传送到R0,79,3.ARM指令集介绍,指令分类(6类)数据处理指令 Load/Store指令状态寄存器访问指令跳转指令异常中断指令协处理器指令,80,3.3 状态寄存器访问指令,程序状态寄存器访问指令(MRS,MSR)MRS 程序状态寄存器到通用寄存器的数据传送指令MRS R0,CPSRMSR 通用寄存器到程序状态寄存器的数据传送指令MSR CPSR,R0,81,3.4 跳转指令,流程的转移ARM中有两种方式实现流程的跳转:1.直接向PC寄存器写入目标地址(4GB)2.跳转指令(前后32MB),82,3.4 跳转指令,根据完成的功能它可以分为以下4种:B 转移指令 BL 带链接的转移指令 BX 带状态切换的转移指令 BLX 带链接和状态切换的转移指令,83,3.4 跳转指令,B和BL指令分支指令 BB LabelCMP R1,#0BEQ Label分支连接 BL跳到希望的指令中保存当前的PC至R14并返回BL FUNCTION1,84,本章内容,汇编语言的伪操作与伪指令,1,ARM汇编语言程序格式,2,汇编语言程序设计,3,CC+与汇编语言的混合编程,4,85,汇编语言的伪操作与伪指令,ARM伪操作(Derective)不像机器指令在计算机运行期间由机器执行,是汇编程序对源程序汇编期间由汇编程序处理的。宏指令展开,指令替换等,86,汇编语言的伪操作与伪指令,ARM伪操作(Derective)符号定义伪操作数据定义伪操作汇编控制伪操作其他常用伪操作,87,符号定义伪操作1.GBLA GBLL GBLS2.LCLA LCLL LCLS3.SETA SETL SETS4.RLIST,88,符号定义伪操作(Symbol definition)1.GBLA GBLL GBLS作用:用于声明一个全局变量并初始化格式:GBLA 全局数字变量名()GBLL全局逻辑变量名(F)GBLS全局字符串变量名(空),89,.LCLA LCAL LCAS作用:用于声明一个局部变量并初始化 LCLA 声明局部算术变量,初始化为0;LCLL 声明局部逻辑变量,初始化为FALSE;LCLS 声明局部的字符串变量,初始化为空;一般只用于宏代码中,90,3.SETA SETL SETS作用:给已定义的全局或局部变量赋值格式:变量 表达式例:GBLA inta0inta0 SETA 0 xEFGBLL logica1logica1 SETL TRUE,91,数据定义伪操作(Data Definition)作用:为特定数据分配存储空间以及初始化1.SPACE2.DCD DCB DCDU DCQ DCQU DCW DCWU3.DCFD DCFDU4.DCFS DCFSU5.DCDO6.MAP FEILD,92,数据定义伪操作1.SPACE 用于分配一块连续内存单元,并用0初始化,可用“%”代替格式:Label SPACE expr 例:Data0 SPACE 100;分配100个字节的内存单元,并用0初始化,93,2.DCB 分配一段连续的字节内存单元,并初始化可用“=”代替格式:label DCB expr,expr;expr可以为-128255的数值或字符串举例:string0 DCB“university”;构造一个字符串,并以字节为单位分配,94,3.DCD(DCDU)分配一段连续字内存单元,并初始化可用“expr可以为数字表达式或为程序中的标号,95,9.MAP-定义一个结构化的内存表的首地址MAP可以用“”代替格式:MAP expr,base-register说明:expr:为程序中的标号或数学表达式 无基址寄存器:表达式的值为内存表首地址,此时内存表的位置计数器VAR 设置成该地址值;有基址寄存器:表达式与基址寄存器值的和用于定义数据结构,并不分配内存,96,10.FIELD 定义结构化内存表中的数据域可用“”代替格式:label FIELD expr;expr为本数据域所占的字节数,97,MAP和FIELD 配合使用来定义结构化的内存表结构MAP伪操作中的base-register寄存器对其后所有FIELD定义的数据域是默认使用的,直到遇到新的包含base-register的MAP伪操作。注意:MAP和FIELD仅仅定义数据结构,并不实际分配内存单元,98,MAP和FIELD 配合定义的内存表有3种:基于绝对地址的内存表基于相对地址的内存表基于PC的内存表,99,汇编控制伪操作(Assembly control)IF ELSE ENDIF(|)WHILE WENDMACRO MENDMEXIT,100,分支,1.IF ELSE ENDIF(|)根据条件选择把一段源代码包括或排除格式:IF 逻辑表达式 指令或伪操作 ELSE 指令或伪操作 ENDIF,101,循环,2.WHILE WEND根据条件重复汇编相同或几乎相同的一段代码示例:count SETA 1 WHILE count=4 count SETA count+1;codes WEND,102,其他常用伪操作CODE16 CODE32 Thumb or ARMAREA 定义一个代码段或数据段EQU 为数字常量,寄存器值和标号定义名称ENTRY 程序的入口点END 源程序结尾在程序结构中讲,103,ARM伪指令,ARM伪指令(pseudo-instruction)伪指令:不是真正指令,编译时替换成对于的指令ADR 小范围地址读取指令ADRL中等范围地址读取指令LDR 大范围地址读取指令NOP 空操作,104,3.LDR 大范围地址读取伪指令,将一个32位立即数或地址值读取到寄存器中 格式:LDR cond register,=expr|label-expr expr为32位的常量。编译器将会根据expr取值的情况,做如下处理:当expr地址值未超过MOV或MVN指令中地址:用MOV或MVN指令替代;当expr表示的地址值超过了MOV或MVN指令中地址,用一条基于PC的LDR指令读取该常数;,105,LDR cond register,=expr|label-expr,Label-expr为基于PC的地址表达式或是外部表达式。当Label-expr为基于PC的地址表达式时,编译器将其表示的数值放在数据缓冲区中,同时用一条基于PC的LDR指令读取该数值。当Label-expr为外部表达式,或非当前段的表达式时,汇编器将在目标文件中插入链接重定位的伪操作,这样链接器将在链接时生成该地址。,106,LDR 伪指令有以下两种用途:当需要读取到寄存器中的数据超过了MOV及MVN指令可以操作的范围时,可以使用LDR伪指令将该数据读取到寄存器中;将一个基于PC的地址值或外部地址值读取到寄存器中。由于这种地址是在链接时确定的,所以这种代码不是位置无关的。同时LDR伪指令处的PC值到数据缓冲区中的目标数据所在的地址的偏移量要小于4KB。,107,内容,C/OS-II简介,1,内核结构,2,任务管理,3,中断、时间节拍管理,4,任务同步与通信,5,系统移植,6,108,RTOS在嵌入式系统中的位置,嵌入式硬件平台,BSP,KERNEL,FS,TCP/IP,设备驱动,设备I/O,调试工具,其它组件,应 用,RTOS,C/C+,109,RTOS是32位的嵌入式CPU的软件基础,RTOS内核 提供CPU的管理硬件初时化,MMU,定时器,中断RTOS 内核提供任务,内存管理RTOS提供设备管理,文件和网络的支持RTOS提供C/C+,JAVA,图形模块等编程接口,110,公开源代码可移植性(Portable)绝大部分 C/OS-II的源码是用移植性很强的ANSI C写的。和微处理器硬件相关的那部分是用汇编语言写的。汇编语言写的部分已经压到最低限度,使得 C/OS-II便于移植到其他微处理器上。C/OS-II可以在绝大多数8位、16位、32位以至64位微处理器、微控制器、数字信号处理器(DSP)上运行。可固化(ROMable)C/OS-II是为嵌入式应用而设计的,这就意味着,只要读者有固化手段(C编译、连接、下载和固化),C/OS-II可以嵌入到读者的产品中成为产品的一部分。可裁剪(Scalable)可以只使用 C/OS-II中应用程序需要的那些系统服务。也就是说某产品可以只使用很少几个 C/OS-II调用,而另一个产品则使用了几乎所有 C/OS-II的功能,这样可以减少产品中的 C/OS-II所需的存储器空间(RAM和ROM)。这种可剪裁性是靠条件编译实现的。,C/OS的性能特点(一),111,占先式(Preemptive)多任务 C/OS-II可以管理64个任务,然而,目前这一版本保留8个给系统。应用程序最多可以有56个任务可确定性 全部 C/OS-II的函数调用与服务的执行时间具有可确定性。任务栈 每个任务有自己单独的栈,C/OS-II允许每个任务有不同的栈空间,以便压低应用程序对RAM的需求。系统服务 C/OS-II提供很多系统服务,例如邮箱、消息队列、信号量、块大小固定的内存的申请与释放、时间相关函数等。中断管理 中断可以使正在执行的任务暂时挂起,如果优先级更高的任务被该中断唤醒,则高优先级的任务在中断嵌套全部退出后立即执行,中断嵌套层数可达255层。稳定性与可靠性,C/OS的性能特点(二),112,内容,C/OS-II简介,1,内核结构,2,任务管理,3,4,任务同步与通信,5,6,中断、时间节拍管理,系统移植,113,5.3 任务管理,任务管理,114,5.3 任务管理定义,5.3.1 什么是任务?完成特定功能的程序实体。线程:解决用户问题的函数及相关数据结构典型的任务:,void mytask(void*pdata)for(;)do something;waiting;do something;是一个无限循环,void YourTask(void*pdata)/*用户代码*/OSTaskDel(OS_PRIO_SELF);,115,5.3 任务管理类型,用户任务:应用程序设计者编写的任务,解决应用问题系统任务:系统提供,为应用程序提供服务 空闲任务 OSTaskIdle()运行次数计数 统计任务 OSTaskstat()计数CUP利用率,116,5.3 任务管理优先级,C/OS-II规定:每个任务都必须有一个唯一的优先级,是识别任务的唯一标识符 C/OS II 2.5版本支持64个任务:063 在OS_CFG.H 中设置常数:OS_LOWEST_PRIO系统占用了8个任务,保留优先级为0、1、2、3、OS_LOWEST_PRIO-3、OS_LOWEST_PRIO-2、OS_LOWEST_PRIO-1、OS_LOWEST_PRIO-0。,117,5.3 任务管理存储结构,任务的存储结构:任务程序代码、任务堆栈和任务控制块(TCB),118,任务控制块(TCB),任务控制块 OS_TCB是一个数据结构,保存任务相关参数:,TCB结构的主要成员typedef struct os_tcb OS_STK*OSTCBStkPtr;/任务堆栈指针 INT8U OSTCBStat;/任务当前状态标志 INT8U OSTCBPrio;/优先级 struct os_tcb*OSTCBNext;/指向后面任务块 struct os_tcb*OSTCBNPrev;/指向前面任务块 OS_TCB;,119,5.3 任务管理TCB链表,120,5.3 任务管理任务的状态,没有TCB,具备了运行的充分条件,运行态任务,需要等待一段时间或事件,把CPU的使用权让出,一个正在运行的任务一旦响应中断申请就会中止运行而去执行中断服务程序,处于就绪状态的任务如果获得了CPU的使用权,121,任务的状态转换,122,5.3 任务管理,任务管理,123,5.3 任务管理任务调度,调度:通过算法在多任务中确定运行哪个任务调度器:实现调度的函数,124,C/OS-II调度思想:近似地每时每刻总是让优先级最高的就绪任务处于运行状态依据:任务就绪表,5.3 任务管理任务调度,125,1.任务就绪表的结构一维数组:INT8U OSRdyTbl8变量:INT8U OSRdyGrp,5.3 任务管理任务就绪表,126,为加快访问任务就绪表的速度,系统定义了一个变量OSRdyGrp来表明就绪表每行中是否存在就绪任务。,127,OSRdyTbl,1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0,1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0,1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0,1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0,1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0,1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0,1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0,1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0,OSRdyGrp,D7 D6 D5 D4 D3 D2 D1 D0,1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0,任务就绪表的示意图,0,1,2,3,4,5,6,7,x,y,0,1,2,3,4,5,6,7,128,5.3 任务管理任务就绪表,2.任务就绪表操作:置位:某个优先级的任务进入就绪状态清零:某个优先级的任务脱离就绪状态查询:最高优先级的就绪任务,129,D7 D6 D5 D4 D3 D2 D1 D0,1,1,1,1,0,0,0,0,prio=29,把prio为29的任务置为就绪状态,OSRdyGrp|=OSMapTblprio3;,OSRdyTblprio3|=OSMapTblprio,130,在程序中,可以用类似下面的代码把优先级别为prio的任务置为就绪状态:OSRdyGrp|=OSMapTblprio3;OSRdyTblprio3|=OSMapTblprio,如果要使一个优先级别为prio的任务脱离就绪状态则可使用如下类似代码:if(OSRdyTblprio3,就绪表的操作置位与清零,131,内容,C/OS-II简介,1,内核结构,2,任务管理,3,时间管理,4,任务同步与通信,5,系统移植,6,132,任务间通信手段,C/OS中,采用多种方法保护任务之间的共享数据和提供任务之间的通信。提供OS_ENTER_CRITICAL和OS_EXIT_CRITICAL来对临界资源进行保护OSSchedLock()禁止调度保护任务级的共享资源。提供了经典操作系统任务间通信方法:信号量、邮箱、消息队列,事件标志。,133,事件控制块ECB,程序4.5 ECB的结构如下-typedef struct void*OSEventPtr;/*指向消息或消息队列的指针*/INT8U OSEventTblOS_EVENT_TBL_SIZE;/*等待任务列表*/INT16U OSEventCnt;/*计数器(当事件是信号量时)*/INT8U OSEventType;/*事件类型:信号量、邮箱等*/INT8U OSEventGrp;/*等待任务组*/OS_EVENT;与TCB类似的结构,使用两个链表,空闲链表与使用链表,所有的通信信号都被看成是事件(event),一个称为事件控制块(ECB,Event Control Block)的数据结构来表征每一个具体事件,ECB的结构如下,134,事件控制块ECB的操作,对事件控制块进行的操作包括初始化一个事件控制块OS_EventWaitListInit();使一个任务进入就绪态OS_EventTaskRdy();使一个任务进入等待某事件的状态OS_EventTaskWait();因为等待超时而使一个任务进入就绪态OS_EventTO()。,135,信号量semaphore,信号量在多任务系统中用于:控制共享资源的使用权、标志事件的发生、使两个任务的行为同步。uC/OS中信号量由两部分组成:信号量的计数值和等待该信号任务的等待任务表。信号量的计数值可以为二进制,也可以是其他整数。系统通过OSSemPend()和OSSemPost()来支持信号量的两种原子操作P()和V()。P()操作减少信号量的值,如果新的信号量的值不大于0,则操作阻塞;V()操作增加信号量的值。,136,互斥信号量,优先级反转问题由于多进程共享资源,具有最高优先权的进程被低优先级进程阻塞,反而使具有中优先级的进程先于高优先级的进程执行,导致系统的崩溃。这就是所谓的优先级反转(Priority Inversion)。,137,优先级反转是在高优级(假设为A)的任务要访问一个被低优先级任务(假设为C)占有的资源时,被阻塞.而此时又有优先级高于占有资源的任务(C)而低于被阻塞的任务(A)的优先级的任务(假设为B)时,于是,占有资源的任务就被挂起(占有的资源仍为它占有),因为占有资源的任务优先级很低,所以,它可能一直被另外的任务挂起.而它占有的资源也就一直不能释放,这样,引起任务A一直没办法执行.而比它优先低的任务却可以执行.所以,一个解决办法就是提高占有资源任务的优先级,让它正常执行,然后释放资源,以让任务A能正常获取资源而得以执行.,138,解决方法:优先级继承(priority inheritance);优先级极限(priority ceilings),139,邮 箱,邮箱是C/OS-II中另一种通讯机制,它可以使一个任务或者中断服务子程序向另一个任务发送一个指针型的变量。该指针指向一个包含了特定“消息”的数据结构。为了在C/OS-II中使用邮箱,必须将OS_CFG.H中的OS_MBOX_EN常数置为1。使用邮箱之前,必须先建立该邮箱。该操作可以通过调用OSMboxCreate()函数来完成,并且要指定指针的初始值。C/OS-II提供了5种对邮箱的操作:OSMboxCreate(),OSMboxPend(),OSMboxPost(),OSMboxAccept()和OSMboxQuery()函数,140,任务、中断服务子程序和邮箱之间的关系,141,消息队列,消息队列是C/OS-II中另一种通讯机制,它可以使一个任务或者中断服务子程序向另一个任务发送以指针方式定义的变量。因具体的应用有所不同,每个指针指向的数据结构变量也有所不同。为了使用C/OS-II的消息队列功能,需要在OS_CFG.H 文件中,将OS_Q_EN常数设置为1,并且通过常数OS_MAX_QS来决定C/OS-II支持的最多消息队列数。在使用一个消息队列之前,必须先建立该消息队列。这可以通过调用OSQCreate()函数,并定义消息队列中的单元数(消息数)来完成。C/OS-II提供了7个对消息队列进行操作的函数:OSQCreate(),OSQPend(),OSQPost(),OSQPostFront(),OSQAccept(),OSQFlush()和OSQQuery()函数,142,任务、中断服务子程序和消息队列之间的关系,

    注意事项

    本文(北工大-嵌入式系统复习.ppt)为本站会员(牧羊曲112)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开