嵌入式系统B复习提纲_第1页
嵌入式系统B复习提纲_第2页
嵌入式系统B复习提纲_第3页
嵌入式系统B复习提纲_第4页
嵌入式系统B复习提纲_第5页
已阅读5页,还剩98页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、嵌入式系统B复习试卷说明 闭卷,时间19周周3上午 题型-填空 分析 术语解释 简答嵌入式系统的定义 “以应用为中心,计算机技术为基础,软硬件可裁剪,以适应应用系统对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统。”嵌入式系统的层次结构嵌入式微处理器分类嵌入式操作系统发展阶段:1、无操作系统的嵌入算法阶段2、专用嵌入式实时操作系统3、通用嵌入式实时操作系统4、基于internet的嵌入式系统 RTOS内核提供的基本服务是任务切换。它负责管理各个任务,或者说为每个任务分配CPU时间,并且负责任务之间的通信。 常用嵌入式操作系统 Vxworks,clinux,qnx,c/os,wince

2、, 实时os 和通用os的区别 设计目标不同 通用操作系统的设计目标是追求最大的系统吞吐率、获得最好的整体性能 实时操作系统的设计目标是采用各种算法和策略,始终保证系统行为的可预测性 调度原则不同 通用操作系统的设计目标是达到最佳整体性能,其调度原则是保证公平 实时系统多采用基于优先级的占先的调度策略,其调度原则是尽可能保证系统的设计约束条件 内存管理不同 通用操作系统广泛使用了虚拟内存技术,为用户提供功能强大的虚拟机器 虚存机制引起的缺页调页现象会造成系统的不确定性,在实时系统中使用虚拟内存技术的情况很少或者非常有限 两种实时系统及其区别 硬实时(强实时hard real-time ):系统

3、必须对事件做出及时的反应,绝对不能错过对事件处理的时限,否则将造成巨大的损失和灾难。如:c/os-II满足硬实时要求 软实时(弱实时soft real-time ):系统负荷较重时允许对事件处理发生错过时限的现象。如屏幕刷新。如wince属于软实时系统 基于优先级的内核有两种工作方式不可剥夺型(非抢先式)可剥夺型(抢先式)不可剥夺型内核(非占先式 Non-Preemptive)低优先级任务低优先级任务ISR高优先级任务高优先级任务(1)(2)(3)(4)(5)(6)(7)中断服务程序使中断服务程序使高优先级任务就绪高优先级任务就绪低优先级任务释放低优先级任务释放CPU使用权使用权TIME非占先

4、式内核要求每个任务自我放弃CPU 的所有权。非占先式调度法也称作合作型多任务,各个任务彼此合作共享一个CPU。异步事件还是由中断服务来处理。中断服务可以使一个高优先级的任务由挂起状态变为就绪状态。但中断服务以后控制权还是回到原来被中断了的那个任务,直到该任务主动放弃CPU的使用权时,那个高优先级的任务才能获得CPU的使用权。非占先式内核可剥夺型内核(占先式 Preemptive)低优先级任务低优先级任务ISR高优先级任务高优先级任务(1)(2)(3)(4)(5)(6)中断服务程序使中断服务程序使高优先级任务就绪高优先级任务就绪高优先级任务得到高优先级任务得到CPU使用权使用权TIME当系统响应

5、时间很重要时,要使用占先式内核。因此绝大多数商业上销售的实时内核都是占先式内核。最高优先级的任务一旦就绪,总能得到CPU的控制权。当一个运行着的任务使一个比它优先级高的任务进入了就绪状态,当前任务的CPU使用权就被剥夺了,或者说被挂起了,那个高优先级的任务立刻得到了CPU的控制权。如果是中断服务子程序使一个高优先级的任务进入就绪态,中断完成时,中断了的任务被挂起,优先级高的那个任务开始运行。占先式内核嵌入式系统开发考虑的一些问题1.软硬件协同设计2.嵌入式处理器的选择3.操作系统的选择4.嵌入式系统的交叉开发环境5.嵌入式系统的调试嵌入式系统的交叉开发环境嵌入式系统通常是一个资源受限的系统,其

6、开发需要交叉编译和在线调试的开发环境,主要包括: 宿主机 目标机(评估电路板) 基于JTAG的ICD仿真器、或调试监控软件、或在线仿真器ICE 运行于宿主机的交叉编译器和链接器、以及开发工具链或软件开发环境 嵌入式操作系统ARM公司提供的ADS和AXD ADS:Arm Developer Suite AXD:Arm eXtended Debugger仿真驱动有两种:ADP硬件仿真驱动ARMUL软件仿真驱动ARM7处理器 冯诺依曼结构 三级流水线(取指、译码、执行),由此导致:指令读出的pc值是指令地址值加8个字节 ARM7TDMI的含义:T:支持16位压缩指令集Thumb;D:支持片上Debu

7、g;M:内嵌硬件乘法器(Multiplier)I:嵌入式ICE,支持片上断点和调试点;Samsung公司的S3C44B0X即属于该系列的处理器。冯冯诺伊曼结构诺伊曼结构 也称普林斯顿普林斯顿结构结构,是一种将程序指令存储器和数据存储器合并在一起的电脑设计概念结构。 Arm7采用了冯诺依曼结构哈佛结构 是一种将程序指令储存和数据储存分开的电脑设计概念结构。 Arm9采用了哈佛结构ARM9处理器 五级流水线 哈佛结构 包含MMU(与ARM7不同) 流水线允许几个操作同时进行,并允许处理和存储系统连续操作。ARM核使用流水线技术以提高处理器指令的执行速度。 ARM7三级流水线结构的指令执行顺序PC指

8、令1指令2指令3指令4程序存储器PC-4PC-8PC+4周期1周期2周期3周期4周期5周期6取指 译码 执行取指 译码 执行取指 译码 执行取指 译码 执行周期周期2周期周期1周期周期3周期周期4 在第1个周期,PC指向指令1,此时指令1进入三级流水线的取指阶段。1 在第2个周期,PC指向指令2,此时指令1进入三级流水线的译码阶段,同时取出指令2。2 在第3个周期,PC指向指令3,此时指令1进入三级流水线的执行阶段,指令2进入译码阶段,取出指令3。3 在第4个周期,指令1执行完成,指令2和指令3流水线推进一级,同时开始指令4的取指处理。4处理器执行一条指令的三个阶段ARM 处理器支持的数据类型

9、 字节(8位)-char,unsigned char 半字(16位)-short,unsigned short 字(32位)-int,unsigned int其中,字需要4字节对齐(地址的低两位为0)、半字需要2字节对齐(地址的最低位为0)。汇编指令中,LDR/STR采用后缀区分(LDRB,LDRH,LDR) C语言中,采用不同类型的指针(强制类型转换)ARM体系结构可以用两种方法存储字数据:大端格式大端格式(big-endian):字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中。小端格式小端格式(little-endian):低地址中存放的是字数据的低字节,高地址存放的是字数

10、据的高字节。ARM7TDMI核通过bigend引脚选择大端或小端格式。S3C44B0X对应的引脚为ENDIAN(=1选择大端,否则小端)地址增加24241A3C781A3C78小端模式大端模式字数据0 x783C1A24的存储格式如下 : ARM7TDMI 处理器有两种工作状态(对应于2种指令集):uARM 状态uThumb状态 ARM处理器总是从ARM状态开始执行代码。处理器工作状态的转变并不影响处理器的工作模式和相应寄存器中的内容。 ARM7TDMI 核的操作状态可以通过BX指令在ARM状态和Thumb状态之间切换 ARMThumb LDR r0,=label+1 BX r0 ThumbA

11、RM LDR r0,=label BX r0 ARM ARM 处理器有处理器有7 7种工作模式种工作模式: :l用户模式(usr)- 正常的程序执行模式l快速中断模式(fiq) - 支持高速数据传输或通道处理l中断模式(irq) - 用于通用中断处理l管理员模式(svc) - 操作系统的保护模式.l中止模式(abt) - 支持虚拟内存和/或内存保护l系统模式(sys) - 支持操作系统的特殊用户模式(运行操作系统任务)l未定义模式(und) - 支持硬件协处理器的软件仿真 除了用户模式外,其他模式均可视为特权模式; Usr/Sys mode不是异常模式,没有SPSR。在这2种模式中使用读写SP

12、SR的指令时,结果不可预知。 ARM状态下的寄存器组织n R0 R0 到到 R15 R15 可以直接访问可以直接访问n R0 R0 到到 R14 R14 是通用寄存器是通用寄存器n R13: R13: 堆栈指针堆栈指针 (sp) (sp) (通常通常) )u每种处理器模式都有单独的堆栈每种处理器模式都有单独的堆栈n R14: R14: 链接寄存器链接寄存器 (lr) (lr)n R15 R15 包含程序计数器包含程序计数器 (PC)(PC)n CPSR CPSR 当前程序状态寄存器当前程序状态寄存器,包括代码标志状态和当前模,包括代码标志状态和当前模式位式位n 5 5个个SPSRs-SPSRs

13、-( (程序状态保存寄存器程序状态保存寄存器) ) 当异常发生时保存当异常发生时保存CPSRCPSR状态状态程序状态寄存器程序状态寄存器N, Z, C and V 条件码标志 可以在处理器中作为数学和逻辑操作改变 可以被所有的指令测试,以决定指令是否被执行 N : Negative. Z : Zero. C : Carry. V : oVerflow *I and F 位是中断禁止位 *M0, M1, M2, M3 and M4 位是模式位 N, Z, C and V 条件码标志 可以在处理器中作为数学和逻辑操作改变 可以被所有的指令测试,以决定指令是否被执行 N : Negative. Z

14、: Zero. C : Carry. V : oVerflow 注意借位的设置: 减法运算发生借位时c=0,否则c=1 指令SBC,RSC的操作能感受到此种设置的影响 I and F 位是中断禁止位 I=1禁止IRQ,I=0允许IRQ T位反映处理器的运行状态 T=1指示Thumb状态,T=0指示ARM状态 与BX指令有联系禁止中断(OS_ENTER_CRITICAL()在ARM上的实现):MRS R0,CPSR ;读出ORR R0,R0,#0 xC0 ;修改MSR CPSR_c,R0 ;写回开放中断(OS_EXIT_CRITICAL()在ARM上的实现) :MRS R0,CPSRBIC R0

15、,R0,#0 xC0MSR CPSR_c,R0ARM体系的异常 异常:由内部或外部源产生并引起处理器处理的一个事件 异常向量表占据内存最低端的32个字节(00 x1F) 注意异常类型和处理器模式的关系地址地址异常异常进入时的模式进入时的模式进入时进入时I的状态的状态进入时进入时F的状态的状态0 x00000000复位管理禁止禁止0 x00000004未定义指令未定义IF0 x00000008软件中断异常管理禁止F0 x0000000C中止(预取)中止IF0 x00000010中止(数据)中止IF0 x00000014保留保留0 x00000018IRQ中断禁止F0 x0000001CFIQ快速

16、中断禁止禁止注:表中的I和F表示不对该位有影响,保留原来的值。 异常的响应 异常处理的返回 哪些自动完成,哪些要手动编程实现当一个异常导致模式切换时,内核自动的做如下处理: 将异常处理程序的返回地址(加固定的偏移量)保存到相应异常模式下的LR; 将CPSR的当前值保存到相应异常模式下的SPSR; 设置CPSR为相应的异常模式; 设置PC为相应异常处理程序的中断入口向量地址,跳转到相应的异常中断处理程序执行;用户模式SPSR异常模式CPSRR15(PC)R14(LR)R0R13BackAddrJumpAddrUserModeExceptionMode程序代码正常运行在用户模式下。 异常的进入异常

17、的进入 异常的进入当一个异常导致模式切换时,内核自动的做如下处理: 将异常处理程序的返回地址(加固定的偏移量)保存到相应异常模式下的LR; 将CPSR的当前值保存到相应异常模式下的SPSR; 设置CPSR为相应的异常模式; 设置PC为相应异常处理程序的中断入口向量地址,跳转到相应的异常中断处理程序执行;异常的退出 当异常处理程序结束时,异常处理程序必须: 返回到发生异常中断的指令的下一条指令处执行,即就是说将LR中的值减去偏移量后移入PC; 将SPSR的值复制回CPSR;SPSR异常模式用户模式CPSRR15(PC)R14(LR)R0R13BackAddrCurrentAddrUserMode

18、ExceptionModeBackAddrOff异常的退出 当异常处理程序结束时,异常处理程序必须: 返回到发生异常中断的指令的下一条指令处执行,即就是说将LR中的值减去偏移量后移入PC; 将SPSR的值复制回CPSR; 清零在入口处置位的中断禁止标志。ARM指令集和寻址方式理解并记忆: 寻址方式(块拷贝寻址应归入多寄存器寻址) 几乎所有指令都可条件执行(条件码助记符)无 条 件 执 行 ( 指 令 默 认 条 件 )操 作 码条 件 码助 记 符标 志含 义操 作 码条 件 码助 记 符标 志含 义00000001001000110100010101100111EQN EC S/H SC C

19、 /LOM IPLV SV CZ=1Z=0C =1C =0负 数正 数 或 零溢 出没 有 溢 出N =1N =0V =1V =010001001101010111100110111101111C =1,Z=0H ILSG ELTG TLEA LN VC =0,Z=1N =VN !=VZ=0,N =VZ=1,N !=V任 意任 意相 等不 相 等无 符 号 数 大 于 或 等 于无 符 号 数 小 于无 符 号 数 大 于无 符 号 数 小 于 或 等 于有 符 号 数 大 于 或 等 于有 符 号 数 小 于有 符 号 数 大 于有 符 号 数 小 于 或 等 于从 不 执 行 ( 不 要

20、使 用 )任何数据都要通过load/store指令(LDR,STR,LDM,STM)加载到寄存器中,方可进行运算处理,LDMxx/STMxx指令归纳: 数据块传送: I =向地址增大方向处理数据传送(Increment) D =向地址减小方向处理数据传送(Decrement) A =先传送数据后改变地址(after) B =先改变地址后传送数据(before) 堆栈操作: F =满栈顶指针(full) E =空栈顶指针(empty) A =堆栈向高地址方向增长(ascending stack) D =堆栈向低地址方向增长(decending stack) 指令写法上的变化可以控制是否影响标志位

21、(注意哪些不加S后缀也要影响标志位的指令),比如:cmpC代码:代码:if(a b) a+;else b+;对应的汇编代码:对应的汇编代码:CMP R0,R1;R0与与R1比较比较ADDHI R0,R0,#1;若若R0R1,则,则R0=R0+1ADDLS R1,R1,#1;若若R0R1,则,则R1=R1+1示例:示例:条件执行计算R1和R2差的绝对值,将结果放到R0中,用条件执行实现:CMP R1,R2SUBGT R0,R1,R2SUBLT R0,R2,R1C语言代码为:语言代码为:int gcd (int a,int b) while (a!=b) if (ab) a=a-b; else b

22、=b-a; return a; 对应的对应的ARM汇编代码段。(代码执行汇编代码段。(代码执行前前R0中存放中存放a,R1中存放中存放b;代码执行;代码执行后后R0中存放最大公约数。中存放最大公约数。gcd CMP R0,R1 ;比较比较a和和b的大小的大小 SUBGT R0,R0,R1 ;if(ab) a=a-b SUBLT R1,R1,R0 ;if(ba) b=b-a BNE gcd ;if(a!=b)跳转到跳转到gcd继续执行继续执行 MOV PC,LR ;子程序结束,返回子程序结束,返回实现类似于实现类似于C语言中的语言中的if-else功能的代码段。下例的功能的代码段。下例的功能为求

23、最大公约数。功能为求最大公约数。例:编写一具有完整汇编格式的程序,实现冒泡法排序功能。设无符号字数据存放在从0 x400004开始的区域,字数据的数目字存放在0 x400000中。AREA SORT,CODE,READONLYENTRYSTART MOV R0,#0 x400000 ldr r1,r0 ;counterLPSUBS R1,R1,#1BEQ EXITMOV R7,R1LDR R0,=0 x400004LP1LDR R2,R0,#4LDR R3,R0CMP R2,R3 STRLO R3,R0, # -4STRLO R2,R0SUBS R7,R7,#1BNE LP1B LPEXITE

24、ND 一个嵌入式控制器自己是不能独立工作的,必须给它提供电源,加上时钟信号、复位信号,如果芯片没有片内程序存储器,则还要加上存储器系统,然后嵌入式控制器才可能工作。原理框图如下:嵌入式控制器时钟系统调试测试接口复位及其配置系统存储器系统供电系统(电源)嵌入式最小系统S3C44B0X最小系统S3C44B0X CPU 电源电路电源电路 晶振电路晶振电路 复位电路复位电路 JTAG接口电路接口电路n程序可运行于程序可运行于S3C44B0X内部的内部的8KB RAM中。中。n程序大小有限,掉电后无法保存,只能通过程序大小有限,掉电后无法保存,只能通过JTAG接口调试程序接口调试程序最小系统最小系统S3

25、C44B0X扩展系统nS3C44B0X最小系统最小系统 + SDRAM + FLASH电路可构电路可构成一个完全的嵌入式系统(扩展系统)成一个完全的嵌入式系统(扩展系统)n可运行可运行SDRAM中的程序,也可以运行中的程序,也可以运行NOR FLASH中中的程序的程序n程序大小可以很大,如果将程序保存到程序大小可以很大,如果将程序保存到FLASH中,掉中,掉电后不会丢失,因此,既可以通过电后不会丢失,因此,既可以通过JTAG接口调试程序,也接口调试程序,也可以将程序烧写到可以将程序烧写到FLASH,然后运行,然后运行FLASH中的程序中的程序n在扩展系统基础上加入必要的接口及其他电路,就构在扩

26、展系统基础上加入必要的接口及其他电路,就构成了具体的成了具体的S3C44B0X应用系统应用系统2022-4-1350S3C44b0 x的存储分配的存储分配nS3C44b0内置存储器控制器内置存储器控制器n支持最多支持最多8个存储器个存储器Bank,每个,每个Bank最多最多支持支持32MBn启动代码必须安排在启动代码必须安排在Bank0n0 x01c000000 x02000000地址区间为特殊功地址区间为特殊功能寄存器(能寄存器(SFR)。事实上,这就是)。事实上,这就是I/O空空间。间。ARM架构中,架构中,I/O和存储器统一编址和存储器统一编址(或称(或称I/O是存储器映射式的)是存储器

27、映射式的)2022-4-1351S3C44B0X存储空间存储空间分配分配并非所有的组都要使用,但并非所有的组都要使用,但BANK0为必须(启动代码)为必须(启动代码)通过汇编读写内存或I/O的典型写法Ldr r2,=0 x0c00000Ldr r3,=0 x55aa55aaStr r3,r2 ;以字方式写Ldr r3,=0 x55aaStrh r3,r2;以半字方式写Ldr r3,=0 x55Strb r3,r2;以字节方式写通过C语言访问内存或I/O的典型写法通过指针定义用宏简化#define rBANKSIZE(*(volatile unsigned *)0 x48000028)读存储器或

28、IOaa=rBANKSIZE;写存储器或IOrBANKSIZE=0 x02;/* name:Led_Display* func:Led Display control function* para:LedStatus - leds status*/#define rPDATB(*(volatile unsigned *)0 x1d2000c)void Led_Display(int LedStatus)led_state = LedStatus;if(LedStatus&0 x01)=0 x01)rPDATB=rPDATB&0 x5ff;elserPDATB=rPDATB|0

29、x200;if(LedStatus&0 x02)=0 x02)rPDATB=rPDATB&0 x3ff;elserPDATB=rPDATB|0 x400;Volitile的作用 当读取一个变量时,为提高存取速度,编译器优化时有时会先把变量读取到一个寄存器中;以后,再取变量值时,就直接从寄存器中取值。而存储器映射的硬件寄存器,每次对它的读写都可能有不同意义。这时可以用volatile关键字禁止做这些优化。 当使用volatile声明变量值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据。Bootloader的作用 Boot Loader是在嵌入式系

30、统复位启动时,操作系统内核运行前,执行的第一段程序。通过Boot Loader,初始化硬件设备,建立内存和I/O空间映射图,为最终加载操作系统内核调整好适当的系统软硬件环境。 Bootloader中的异常向量表 ENTRY b ResetHandler ;for debug b HandlerUndef ;handlerUndef b HandlerSWI ;SWI interrupt handler b HandlerPabort ;handlerPAbort b HandlerDabort ;handlerDAbort b . ;handlerReserved;* b HandlerIRQ

31、 b HandlerFIQBootloader中指向用户程序的链接IMPORT _main :LNOT:THUMBCODEBL_main ;Dont use main() because .B . 看门狗WatchDog WatchDog属于一种定时器,计时时间到时除了产生系统中断之外,还可以发出系统重启的信号。 嵌入式系统运行时受到外部干扰或者系统错误,程序有时会出现“跑飞”,导致整个系统瘫痪。看门狗的作用就是当系统”跑飞“而进入死循环时,恢复系统的运行。看门狗的工作原理 设系统程序完整运行一个周期的时间是Tp,看门狗的定时周期为Ti(Ti Tp),在程序正常运行周期内修改定时器的计数值(“

32、喂狗”),只要程序正常运行,WD定时器就不会溢出(“狗不叫”);若由于干扰等原因使系统不能在Tp时刻修改定时器的计数值,定时器将在Ti时刻溢出(“狗叫”),引发系统复位,使系统得以重新运行,从而起到监控作用。c/OS-II 基于优先级的抢先式调度,不支持时间片轮转调度(该算法适用于调度分时操作系统中优先级平等的任务),总是让处在就绪状态的优先级最高的任务先运行,可满足硬实时要求。 最多64个任务,任务编号063,0号优先级最高,63号优先级最低任务设计任务设计 在基于实时操作系统的应用程序设计中,任务设计是整个应用程序的基础,其它软件设计工作都是围绕任务设计来展开。任务设计应用程序设计“任务函

33、数”和相关的数据结构其他软件工作任务的分类任务的分类按照执行方式分类任务(任务(tasktask) 典型的任务(除了单次执行的任务以典型的任务(除了单次执行的任务以外):一个无限循环,无返回值外):一个无限循环,无返回值void mytask(void *pdata) for (;) do something; waiting; do something; 任务完成后的自我删除任务完成后的自我删除 当任务完成后,任务可以自我删除当任务完成后,任务可以自我删除 任务代码并非真的删除了,系统只是简单地不再理会任务代码并非真的删除了,系统只是简单地不再理会这个任务这个任务 这个任务的代码也不会再运行

34、了,即使任务调用了这个任务的代码也不会再运行了,即使任务调用了OSTaskDelOSTaskDel(),这个任务也绝不会返回(),这个任务也绝不会返回 void YourTask (void *pdata) /* 用户代码 */ OSTaskDel(OS_PRIO_SELF); 任务状态任务状态 在任一给定的时刻,任务的状态一定是在任一给定的时刻,任务的状态一定是以下五种状态之一:以下五种状态之一: 睡眠态(睡眠态(task dormanttask dormant) 就绪态(就绪态(task readytask ready) 运行态(运行态(task runningtask running)

35、等待状态(等待状态(task waitingtask waiting) 中断服务态(中断服务态(ISR running)ISR running)睡眠态(睡眠态(task dormanttask dormant) 指任务驻留在程序空间(指任务驻留在程序空间(ROMROM或或RAMRAM),还没有),还没有交给系统来管理的状态交给系统来管理的状态 任务交给系统通过调用以下函数之一来实现:任务交给系统通过调用以下函数之一来实现: OSTaskCreateOSTaskCreate()() OSTaskCreateExtOSTaskCreateExt()() 告知系统:告知系统: 任务的起始地址任务的起

36、始地址 任务建立时,用户给任务赋予的优先级任务建立时,用户给任务赋予的优先级 任务要使用的栈空间大小等任务要使用的栈空间大小等就绪态(就绪态(task readytask ready) 任务一旦创建就进入就绪态,准备运行任务一旦创建就进入就绪态,准备运行 任务的创建可以是在多任务开始之前,也可以任务的创建可以是在多任务开始之前,也可以动态地由一个运行着的任务创建动态地由一个运行着的任务创建 若刚创建任务的优先级高于创建它的任务的优若刚创建任务的优先级高于创建它的任务的优先级,它将立即获得先级,它将立即获得cpucpu的使用权的使用权 任务可通过任务可通过OSTaskDelOSTaskDel()

37、返回睡眠态;或调()返回睡眠态;或调用该函数让另一个任务进入睡眠态用该函数让另一个任务进入睡眠态运行态(运行态(task runningtask running) 就绪的任务只有当所有优先级高于它的任务都转为等就绪的任务只有当所有优先级高于它的任务都转为等待状态,或被删除后,才能进入运行态待状态,或被删除后,才能进入运行态 任何时刻只有一个任务处于运行态任何时刻只有一个任务处于运行态 调用调用OSStartOSStart()可以启动多任务。该函数只能在启动()可以启动多任务。该函数只能在启动时调用一次时调用一次 OSStartOSStart()运行用户初始化代码中已经建立的、进入()运行用户初

38、始化代码中已经建立的、进入就绪态的优先级最高的任务就绪态的优先级最高的任务等待状态(等待状态(task waitingtask waiting)正在运行的任务可以通过下面的调用进入等待状态。延迟时间到,正在运行的任务可以通过下面的调用进入等待状态。延迟时间到,立即强制执行任务切换,让下一个优先级最高、并进入就绪态的任立即强制执行任务切换,让下一个优先级最高、并进入就绪态的任务执行。务执行。 OSTimeDlyOSTimeDly()() OSTimeDlyHMSMOSTimeDlyHMSM()()等待时间过去后,系统服务(内部)函数等待时间过去后,系统服务(内部)函数OSTimeTickOSTi

39、meTick()使延迟了()使延迟了的任务进入就绪态的任务进入就绪态用户无需在应用程序代码中调用这个函数用户无需在应用程序代码中调用这个函数等待状态(续)等待状态(续) 正在运行的任务可能需要通过调用函数等待某正在运行的任务可能需要通过调用函数等待某一事件(标志、信号量、互斥信号量、消息邮一事件(标志、信号量、互斥信号量、消息邮箱)发生。如果该事件并未发生,任务就进入箱)发生。如果该事件并未发生,任务就进入等待状态等待状态 OSFlagPendOSFlagPend();();OSMutexPendOSMutexPend()() OSSemPendOSSemPend();();OSMboxPen

40、dOSMboxPend()() 当事件发生或等待超时,被挂起的任务就进入当事件发生或等待超时,被挂起的任务就进入就绪态就绪态中断服务态(中断服务态(ISR running)ISR running) 正在执行的任务是可以被中断的正在执行的任务是可以被中断的,除非该,除非该任务将中断关闭,或系统将中断关闭。被任务将中断关闭,或系统将中断关闭。被中断的任务便进入了中断服务态中断的任务便进入了中断服务态 响应中断后,正在运行的任务被挂起,中响应中断后,正在运行的任务被挂起,中断服务子程序控制了断服务子程序控制了CPUCPU的使用权的使用权中断服务态(中断服务态(ISR running)ISR runn

41、ing) 中断服务子程序可能会报告一个或多个事件的发生,中断服务子程序可能会报告一个或多个事件的发生,而使一个或多个任务进入就绪态而使一个或多个任务进入就绪态 上述情况下,从中断服务子程序返回之前,上述情况下,从中断服务子程序返回之前, C/OSC/OS IIII 要判定:要判定: 被中断的任务是否还是就绪态任务中优先级最高的被中断的任务是否还是就绪态任务中优先级最高的 如果中断服务子程序使另一个优先级更高的任务进入了如果中断服务子程序使另一个优先级更高的任务进入了就绪态,则新进入就绪态的这个优先级更高的任务将得就绪态,则新进入就绪态的这个优先级更高的任务将得以运行;否则,原来被中断了的任务将

42、继续运行。以运行;否则,原来被中断了的任务将继续运行。任务状态任务状态 当所有的任务都在等待时间发生或等待延迟时间结束时,C/OS II 执行被称为空闲任务(Idle Task)的内部函数,即:OSTaskIdle()任务状态任务的任务的CPU使用权使用权被剥夺被剥夺中断中断恢复恢复任务任务c/os-II初始化 调用OSInit() 做了哪些事儿?任务创建 调用OSTaskCreate()或OSTaskCreateExt()c/os-II启动 调用OSStart()c/os-ii任务调度的实现 任务级的调度由函数OSSched()完成,中断级的调度由函数OSIntExit()完成,OSSche

43、d()详解参见教材P234关于C/OS的移植要使C/OS-能正常运行,处理器必须具备的条件是:1、处理器的C编译器能产生可重入代码 2、处理器支持中断,并且能产生定时中断3、用C语言就可以打开或者关闭中断 4、处理器支持能够容纳一定量数据的硬件堆栈5、处理器有将堆栈指针和其他CPU寄存器读出,并保存到堆栈或内存中去的指令对于实验平台UPTerm-ARM3000而言,S3C44b0 x CPU可以满足第2、4、5点要求,使用ADS1.2的C编译器可以满足第1、3点要求什么是可重入代码什么是可重入代码 可重入的代码指的是一段可以被多个任务同时调用,而不必担心会破坏数据的代码(比如:一个函数) 即:

44、可重入型函数在任何时候都可以被中断执行,过一段时间以后又可以继续运行,而不会因为在函数中断的时候被其他的任务重新调用,而影响函数中的数据 可重入代码举例可重入代码举例程序1:可重入型函数void swap(int *x, int *y)int temp;temp=*x;*x=*y;*y=temp;非可重入代码举例非可重入代码举例程序2:非可重入型函数int temp;void swap(int *x, int *y)temp=*x;*x=*y;*y=temp;不可重入函数被中断破坏不可重入函数被中断破坏如何使函数具有可重入性如何使函数具有可重入性 使Swap()函数具有可重入性的条件:把Tem

45、p定义为局部变量调用Swap()函数之前关中断,调用 后再开中断用信号量禁止该函数在使用过程中 被再次调用任务设计任务设计 在基于实时操作系统的应用程序设计中,任务设计是整个应用程序的基础,其它软件设计工作都是围绕任务设计来展开。任务设计应用程序设计“任务函数”和相关的数据结构其他软件工作任务设计任务设计任务的划分任务的划分 对一个嵌入式应用系统进行“任务划分”,是实时操作系统应用软件设计的关键,任务划分是否合理将直接影响软件设计的质量。以以CPU为中心为中心“关键关键”功功能能“紧迫紧迫”功能功能消耗机时消耗机时关系密切关系密切相同事件触发相同事件触发运行周期相同运行周期相同任务划分固定顺序

46、执行固定顺序执行 任务划分原则如下:首先,以CPU为中心,将与各种输入/输出设备(或端口)相关的功能分别划分为独立的任务发现“关键”功能,将其最“关键”部分“剥离”出来,用一个独立任务(或ISR)完成,剩余部分用另外一个任务实现,两者之间通过通信机制沟通发现“紧迫”功能,将其最“紧迫”部分“剥离”出来,用一个独立的高优先级任务(或ISR)完成,剩余部分用另外一个任务实现,两者之间通过通信机制沟通将消耗机时较多的数据处理功能划分出来,封装为低优先级任务对于既“关键”又“紧迫”的功能,按“紧迫”功能处理将关系密切的若干功能组合成为一个任务,达到功能聚合的效果将由相同事件触发的若干功能组合成为一个任

47、务,从而免除事件分发机制将运行周期相同的功能组合成为一个任务,从而免除时间事件分发机制将若干按固定顺序执行的功能组合成为一个任务,从而免除同步接力通信的麻烦举例:电脑自动打铃器举例:电脑自动打铃器功能需求:l 具有实时时钟功能,能显示时分秒,年月日星期(采用8位数码管显示)l 具有 键盘 输入功能 l 可以设置若干个闹钟,以及闹钟的禁止与使能l 可设置每个闹钟发生时的输出动作(一共四路输出,可独立设置每路输出的时间和电平状态)电脑自动打铃器电脑自动打铃器 LPC2000系列ARM具有RTC功能,RTC掉电后仍可使用电池继续运行,从而保证了系统掉电后时钟的准确性。ZLG7290是一款键盘和LED

48、驱动芯片,最多支持64个按键和8个共阴极数码管。系统框图:任务的划分任务的划分 电脑自动打铃器任务划分如下:RTC中断中断显示任务显示任务键盘任务键盘任务输出控制任务输出控制任务电脑打铃器电脑打铃器 电脑自动打铃器具有键盘输入功能,用于设置时钟和闹钟,因此需要一个键盘任务。 电脑自动打铃器需要有显示功能,用来显示时钟和闹钟,因此需要一个显示任务。 电脑自动打铃器需要一个输出控制任务,用来控制闹钟时间到后各路的输出。 电脑自动打铃器具有实时时钟功能,需要一个RTC中断。任务设计任务设计任务的优先级设计任务的优先级设计人机接口,实时性低键盘任务键盘任务1输出控制任务输出控制任务3显示任务显示任务2RTC中断中断4电电脑脑自自动动打打铃铃器器控制接口,实时性高任务的优先级设计任务的优先级设计键盘任务键盘任务1输出控制任务输出控制任务3显示任务显示任务2RTC中断中断4电电脑脑自自动动打打铃铃器器优先级:6优先级:12优先级:13多任务之间的同步与互斥多任务之间的同步与互斥资源互斥 在电脑自动打铃器的设计中,ZLG7290是通过I2C总线与cpu连接的,I2C总线是键盘任务和显示任务的共享资源,必须遵循资源

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论