《第4章 基于ARM9和μCOS-II嵌入式系统设计.ppt》由会员分享,可在线阅读,更多相关《第4章 基于ARM9和μCOS-II嵌入式系统设计.ppt(130页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第4章章基于基于ARM9和和C/OS-II嵌入式系统设计嵌入式系统设计第4章 基于ARM9和COS-II嵌入式系统设计 Still waters run deep.流静水深流静水深,人静心深人静心深 Where there is life,there is hope。有生命必有希望。有生命必有希望第第4章章基于基于ARM9和和C/OS-II嵌入式系统设计嵌入式系统设计4.1 C/OS-II4.1 C/OS-II的内核的内核多多任任务务系系统统中中,内内核核负负责责管管理理各各个个任任务务,或或者者说说为为每每个个任任务务分分配配CPU时时间间,并并且且负负责责任任务务之之间间的的通通讯讯。内
2、内核核提提供供的的基基本本服服务务是是任任务务切切换换。之之所所以以使使用用实实时时内内核核可可以以大大大大简简化化应应用用系系统统的的设设计计,是是因因为为实实时时内内核核允允许许将将应应用用分分成成若若干干个个任任务务,由由实实时时内内核核来来管管理理它它们们。内内核核本本身身也也增增加加了了应应用用程程序序的的额额外外负负荷荷,代代码码空空间间增增加加ROM的的用用量量,内内核核本本身身的的数数据据结结构构增增加加了了RAM的的用用量量。但但更更主主要要的的是是,每每个个任任务务要要有有自自己己的的栈栈空空间间,这这一一块块吃吃起起内内存存来来是是相相当当厉厉害害的的。内内核核本本身身对
3、对CPU的的占占用用时时间间一一般般在在2到到5个百分点之间。个百分点之间。UC/OS-II有有一一个个精精巧巧的的内内核核调调度度算算法法,实实时时内内核核精精小小,执执行效率高,算法巧妙,代码空间很少。行效率高,算法巧妙,代码空间很少。第第4章章基于基于ARM9和和C/OS-II嵌入式系统设计嵌入式系统设计4.1.1C/OS-II内核调度特点内核调度特点C/OS-IIC/OS-II内核调度主要有如下特点:内核调度主要有如下特点:只支持基于优先级的抢占式调度算法,不支持时间片轮训。只支持基于优先级的抢占式调度算法,不支持时间片轮训。64 64个优先级,只能创建个优先级,只能创建6464个任务
4、,用户只能创建个任务,用户只能创建5656个任务。个任务。每个任务优先级都不相同。每个任务优先级都不相同。不支持优先级逆转。不支持优先级逆转。READY READY队列通过内存映射表实现快速查询。效率非常高。队列通过内存映射表实现快速查询。效率非常高。支持时钟节拍。支持时钟节拍。支支持持信信号号量量,消消息息队队列列,事事件件控控制制块块,事事件件标标志志组组,消消息息邮邮箱任务通讯机制。箱任务通讯机制。第第4章章基于基于ARM9和和C/OS-II嵌入式系统设计嵌入式系统设计 支支持持中中断断嵌嵌套套,中中断断嵌嵌套套层层数数可可达达255255层层,中中断断使使用用当当前前任任务务的堆栈保存
5、上下文。的堆栈保存上下文。每个任务有自己的堆栈,堆栈大小用户自己设定。每个任务有自己的堆栈,堆栈大小用户自己设定。支持动态修改任务优先级。支持动态修改任务优先级。任任务务TCBTCB为为静静态态数数组组,建建立立任任务务只只是是从从中中获获得得一一个个TCBTCB,不不用用动态分配,释放内存。动态分配,释放内存。任任务务堆堆栈栈为为用用户户静静态态或或者者动动态态创创建建,在在任任务务创创建建外外完完成成,任任务务创建本身不进行动态内存分配。创建本身不进行动态内存分配。任务的总个数(任务的总个数(OS_MAX_TASKSOS_MAX_TASKS)由用户决定。)由用户决定。0 0优先级最高,优先
6、级最高,6363优先级最低;优先级最低;有一个优先级最低的空闲任务,在没有用户任务运行时运行。有一个优先级最低的空闲任务,在没有用户任务运行时运行。第第4章章基于基于ARM9和和C/OS-II嵌入式系统设计嵌入式系统设计4.1.2 4.1.2 任务控制块任务控制块 OS_TCB OS_TCB描述描述 UC/OS-IIUC/OS-II的的TCBTCB数数据据结结构构简简单单,内内容容容容易易理理解解,保保存存最最基基本本的的任任务务信信息息,同同时时还还支支持持裁裁减减来来减减小小内内存存消消耗耗,TCBTCB是是事事先先根根据据用用户户配配置置,静静态态分分配配内内存存的的结结构构数数组组,通
7、通过过优优先先级级序序号号进进行行添添加加,查查找找,删删除除等等功功能能。减减少少动动态态内内存存分分配配和和释释放放。因因为为依依靠靠优优先先级级进进行行TCBTCB分分配配,每每个个任任务务必必须须有有自自己己的的优优先先级级,不能和其他任务具有相同的优先级。不能和其他任务具有相同的优先级。第第4章章基于基于ARM9和和C/OS-II嵌入式系统设计嵌入式系统设计typedefstructos_tcbOS_STK*OSTCBStkPtr;#ifOS_TASK_CREATE_EXT_EN0void*OSTCBExtPtr;OS_STK*OSTCBStkBottom;INT32UOSTCBSt
8、kSize;INT16UOSTCBOpt;INT16UOSTCBId;#endifstructos_tcb*OSTCBNext;structos_tcb*OSTCBPrev;第第4章章基于基于ARM9和和C/OS-II嵌入式系统设计嵌入式系统设计#if(OS_Q_EN&(OS_MAX_QS=2)|OS_MBOX_EN|OS_SEM_EN)OS_EVENT*OSTCBEventPtr;#endif#if(OS_Q_EN&(OS_MAX_QS=2)|OS_MBOX_EN)void*OSTCBMsg;#endifINT16UOSTCBDly;INT8UOSTCBStat;INT8UOSTCBPrio
9、;INT8UOSTCBX;第第4章章基于基于ARM9和和C/OS-II嵌入式系统设计嵌入式系统设计INT8UOSTCBY;INT8UOSTCBBitX;INT8UOSTCBBitY;#ifOS_TASK_DEL_ENBOOLEANOSTCBDelReq;#endifOS_TCB;第第4章章基于基于ARM9和和C/OS-II嵌入式系统设计嵌入式系统设计其中:其中:OSTCBStkPtrOSTCBStkPtr是指向当前任务栈顶的指针。是指向当前任务栈顶的指针。*OSTCBExtPtr*OSTCBExtPtr是任务扩展模块使用;是任务扩展模块使用;*OSTCBStkBottom*OSTCBStkBo
10、ttom指向任务堆栈栈底的指针;指向任务堆栈栈底的指针;OSTCBStkSizeOSTCBStkSize存有栈中可容纳的指针元数目;存有栈中可容纳的指针元数目;OSTCBOptOSTCBOpt把把“选选 择择 项项”传传 给给 函函 数数 OSTashCreaktExtOSTashCreaktExt()。只只 有有 当当 用用 户户 将将 OS_CFG.HOS_CFG.H 文文 件件 中中 的的OS_TASK_CREATE_EXTOS_TASK_CREATE_EXT设设为为1 1时时,这这个个变变量量才才有有效;效;OSTCBIdOSTCBId用用于于存存储储任任务务的的识识别别码码(IDID
11、)。这这个个变量现在没有用,保留给将来扩展用;变量现在没有用,保留给将来扩展用;第第4章章基于基于ARM9和和C/OS-II嵌入式系统设计嵌入式系统设计OSTCBNextOSTCBNext和和 OSTCBPrevOSTCBPrev用用 于于 任任 务务 控控 制制 块块OS_TCBsOS_TCBs的的双双向向链链表表的的前前后后链链接接,该该链链表表在在时时钟钟节拍函数节拍函数OSTimerTick()OSTimerTick()中使用;中使用;OSTCBEventPtrOSTCBEventPtr是指向事件控制块的指针;是指向事件控制块的指针;OSTCBMsgOSTCBMsg是指向传给任务的消息
12、的指针;是指向传给任务的消息的指针;OSTCBDlyOSTCBDly当当需需要要把把任任务务延延时时若若干干时时钟钟节节拍拍时时要要用用到到这这个个变变量量,或或者者需需要要把把任任务务挂挂起起一一段段时时间间以等待某事件的发生;以等待某事件的发生;OSTCBStatOSTCBStat是任务的状态字;是任务的状态字;OSTCBPrioOSTCBPrio是是任任务务优优先先级级,高高优优先先级级任任务务的的OSTCBPrioOSTCBPrio值小;值小;第第4章章基于基于ARM9和和C/OS-II嵌入式系统设计嵌入式系统设计OSTCBDelReqOSTCBDelReq是是一一个个布布尔尔量量,用
13、用于于表表示示该该任任务是否需要删除;务是否需要删除;OSTCBXOSTCBX,OSTCBYOSTCBY,OSTCBBitXOSTCBBitX和和 OSTCBBitYOSTCBBitY用用于于加加速速任任务务进进入入就就绪绪态态的的过过程程或或进进入入等等待待事事件件发发生生状状态态的的过过程程。这这些些值值是是在在任任务务建建立立时时算算好好的的,或或者者是是在在改改变变任任务务优优先先级级时时算出的。这些值的算法可由下面程序实现。算出的。这些值的算法可由下面程序实现。OSTCBY=priority 3OSTCBY=priority 3;OSTCBBitY=OSMapTblpriority
14、3OSTCBBitY=OSMapTblpriority 3;OSTCBX=priority&0 x07OSTCBX=priority&0 x07;OSTCBBitX=OSMapTblpriority&0 x07OSTCBBitX=OSMapTblpriority&0 x07;第第4章章基于基于ARM9和和C/OS-II嵌入式系统设计嵌入式系统设计4.1.3就绪表(就绪表(ReadyList)UC/OS-IIUC/OS-II采采用用内内存存映映射射的的方方式式来来实实现现READYREADY队队列列的的加加入入,查查找找,删删除除功功能能,效效率率非非常常高高。但但是是也也因因此此只只能能支支持
15、持6464个个任任务务,每每个个任任务务都都有有自自己己的的优优先先级级,不不能和其他任务优先级相同。能和其他任务优先级相同。每每个个任任务务的的就就绪绪态态标标志志都都放放入入就就绪绪表表中中的的,就就绪绪表表 中中 有有 两两 个个 变变 量量 OSRdyGrpOSRdyGrp和和 OSRdyTblOSRdyTbl。在在OSRdyGrpOSRdyGrp中中,任任务务按按优优先先级级分分组组,8 8个个任任务务为为一一组组。OSRdyGrpOSRdyGrp中中的的每每一一位位表表示示8 8组组任任务务中中每每一一组组中中是是否否有有进进入入就就绪绪态态的的任任务务。任任务务进进入入就就绪绪态
16、态时时,就就绪绪表表OSRdyTblOSRdyTbl 中中的的相相应应元元素素的的相相应应位位也也置置为为1 1。就就绪绪表表OSRdyTblOSRdyTbl数数 组组 的的 大大 小小 取取 决决 于于 OS_LOWEST_PRIO(OS_LOWEST_PRIO(见见 文文 件件OS_CFG.H)OS_CFG.H)。第第4章章基于基于ARM9和和C/OS-II嵌入式系统设计嵌入式系统设计 为为确确定定下下次次该该哪哪个个优优先先级级的的任任务务运运行行了了,UC/OS-IIUC/OS-II中中的的内内核核调调度度器器总总是是将将最最低低优优先先级级的的任任务务 在在 就就 绪绪 表表 中中
17、相相 应应 字字 节节 的的 相相 应应 位位 置置 1 1,即即OS_LOWEST_PRIO=1OS_LOWEST_PRIO=1。OSRdyGrpOSRdyGrp和和OSRdyTblOSRdyTbl的关系是按以下规则给出的:的关系是按以下规则给出的:当当 OSRdyTbliOSRdyTbli中中 的的 任任 何何 一一 位位 是是 1 1时时,OSRdyGrpOSRdyGrp的第的第i i位置位置1 1。i i从从0 0到到7 7。可用下面句使任务进入就绪态:可用下面句使任务进入就绪态:OSRdyGrp|=OSMapTblprio 3OSRdyGrp|=OSMapTblprio 3;OSRd
18、yTblprio 3|=OSMapTblprio&0 x07OSRdyTblprio 3|=OSMapTblprio&0 x07;第第4章章基于基于ARM9和和C/OS-II嵌入式系统设计嵌入式系统设计 任任务务优优先先级级的的低低三三位位用用于于确确定定任任务务在在总总就就绪绪表表OSRdyTblOSRdyTbl中中的的所所在在位位。接接下下去去的的三三位位用用于于确确定定是是在在OSRdyTblOSRdyTbl数数组组的的第第几几个个元元素素。OSMapTblOSMapTbl 是是在在ROMROM中中的的(见见文文件件OS_CORE.COS_CORE.C)屏屏蔽蔽字字,用用于于限限制制OS
19、RdyTblOSRdyTbl数数组组的的元元素素下下标标在在0 0到到7 7之之间。下面程序从就绪表中删除一个任务。间。下面程序从就绪表中删除一个任务。if(OSRdyTblprio 3&=if(OSRdyTblprio 3&=OSMapTblprio&0 x07)=0)OSMapTblprio&0 x07)=0)OSRdyGrp&=OSMapTblprio 3 OSRdyGrp&=OSMapTblprio 3;第第4章章基于基于ARM9和和C/OS-II嵌入式系统设计嵌入式系统设计以上代码将就绪任务表数组以上代码将就绪任务表数组OSRdyTblOSRdyTbl中相中相应元素的相应位清应元素的
20、相应位清0 0,而对于,而对于OSRdyGrpOSRdyGrp,只有,只有当被删除任务所在任务组中全组任务一个都没当被删除任务所在任务组中全组任务一个都没有进入就绪态时,才将相应位清零。也就是说有进入就绪态时,才将相应位清零。也就是说OSRdyTblprio3OSRdyTblprio3所有的位都是所有的位都是0 0时,时,OSRdyGrpOSRdyGrp的相应位才清零。为了找到那个进入的相应位才清零。为了找到那个进入就绪态的优先级最高的任务,并不需要从就绪态的优先级最高的任务,并不需要从OSRdyTbl0OSRdyTbl0开始扫描整个就绪任务表,只需要开始扫描整个就绪任务表,只需要查另外一张表
21、,即优先级判定表查另外一张表,即优先级判定表OSUnMapTbl(256)(OSUnMapTbl(256)(见文件见文件OS_CORE.C)OS_CORE.C)。第第4章章基于基于ARM9和和C/OS-II嵌入式系统设计嵌入式系统设计 OSRdyTblOSRdyTbl中中每每个个字字节节的的8 8位位代代表表这这一一组组的的8 8个个任任务务哪哪些些进进入入就就绪绪态态了了,低低位位的的优优先先级级高高于于高高位位。利利用用这这个个字字节节为为下下标标来来查查OSUnMapTblOSUnMapTbl这这张张表表,返返回回的的字字节节就就是是该该组组任任务务中中就就绪绪态态任任务务中中优优先先级
22、级最最高高的的那那个个任任务务所所在在的的位位置置。这这个个返返回回值值在在0 0到到7 7之之间间。确确定定进进入入就就绪绪态态的的优优先先级级最最高高的的任务是用以下代码完成的。任务是用以下代码完成的。y =OSUnMapTblOSRdyGrpy =OSUnMapTblOSRdyGrp;x =OSUnMapTblOSRdyTbly x =OSUnMapTblOSRdyTbly;prio=(y 3)+x prio=(y MessagepMsg-MessageOSM_KEYOSM_KEY,参参数数pMsg-WParam pMsg-WParam 则则是是按按键键的的键键码码(pMsg pMsg
23、是是指指向向该该消消息息结结构构体体的的指指针针)。键键盘盘 消消 息息 是是 由由 键键 盘盘 扫扫 描描 任任 务务(void void Key_Scan_Task(void Key_Scan_Task(void*Id)*Id))创创建建并并发发送送到到系系统统的的消消息息队队列列,键键盘盘扫扫描描任任务务用用函函数数KeyBoard_ReadKeyBoard_Read()()从从IIC IIC 的的数数据据收收发发移移位位寄寄存存器器中中获获得得键键盘盘扫扫描描码码,这这个个扫扫描描码码是是由由ATMEGA8 ATMEGA8 当当有有键键盘盘按按下下时时发发送送到到IIC IIC 的的数
24、数据据收收发发移移位位寄寄存存器器的的。主主任任务务由由消息队列中得到消息。消息队列中得到消息。第第4章章基于基于ARM9和和C/OS-II嵌入式系统设计嵌入式系统设计staticvoidKey_Scan_Task(void*Id)U32key;INT8Uerr;POSMSGpmsg;printk(beginkeytaskn);for(;)OS_FLAGSflag;flag=OSFlagPend(Input_Flag,UCOS2_KBINPUT,OS_FLAG_WAIT_SET_ANY,0,&err);OSFlagPost(Input_Flag,flag,OS_FLAG_CLR,&err);k
25、ey=KeyBoard_Read(0,FALSE);第第4章章基于基于ARM9和和C/OS-II嵌入式系统设计嵌入式系统设计if(key=-1)continue;pmsg=OSCreateMessage(NULL,OSM_KEY,key,0);if(pmsg)SendMessage(pmsg);第第4章章基于基于ARM9和和C/OS-II嵌入式系统设计嵌入式系统设计所谓的系统消息循环如下图所示:所谓的系统消息循环如下图所示:图图4.6系统消息循环系统消息循环第第4章章基于基于ARM9和和C/OS-II嵌入式系统设计嵌入式系统设计 应应用用程程序序在在Main_Task Main_Task 任任
26、务务中中等等待待消消息息,并并对对该该消消息息进进行行判判断断和和处处理理,如如果果是是键键盘盘消消息息则则提提取取出出键键码码,变变换换为为对对应应字字符符,然然后后将将其其显显示示到到液液晶晶屏屏上上。在在图图形形模模式式下下,液液晶晶屏屏的的文文字字输输出出函函数数是是TextOut()TextOut(),实实际际是是通通过过在在图图形形方方式式下下绘绘图图完完成成文文字字显显示示的的。此此函函数数输输出出的的字字符符数数组组必必须须是是基基于于双双字字节节Unicode Unicode 编编码码的的。在在程程序序中中可可以以使使用用Int2Unicode()Int2Unicode()和
27、和strChar2Unicode()strChar2Unicode(),两两个个函函数数分分别别将将整整形形数数或或ASCII ASCII 字字符符转转换换为为Unicode Unicode 字符串。字符串。实实现现简简单单的的消消息息循循环环只只需需要要在在main.cmain.c编编辑辑Main_Task Main_Task 任务中的代码。任务中的代码。第第4章章基于基于ARM9和和C/OS-II嵌入式系统设计嵌入式系统设计注意:注意:1 1)使使用用WaitMessage(0)WaitMessage(0)接接收收消消息息,通通常常等等待待时时间设置为无限长。间设置为无限长。2 2)系统的
28、消息循环是一个无限循环。)系统的消息循环是一个无限循环。3 3)收收到到消消息息以以后后(即即WaitMessage()WaitMessage()函函数数返返回回后),通过判断消息结构中后),通过判断消息结构中MessageMessage成成员员来来判判断断消消息息类类型型。如如果果是是键键盘盘消消息息,则则Message Message 的的值值为为OSM_KEYOSM_KEY,WParam WParam 参参数数存存储储的的是是按按键键的的键键码码,LParam LParam 参参数数存存储储的的是是同同时时按按下下的的功能键(如果没有,则为功能键(如果没有,则为0 0)。)。4 4)开开 始始 等等 待待 下下 一一 条条 消消 息息 之之 前前 必必 须须 使使 用用DeleteMessage DeleteMessage 删除消息,释放系统的内存空间删除消息,释放系统的内存空间.