zA嵌入式系统设计与实例开发.ppt
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《zA嵌入式系统设计与实例开发.ppt》由会员分享,可在线阅读,更多相关《zA嵌入式系统设计与实例开发.ppt(105页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、1zA嵌入式系统设计与实例开发 Still waters run deep.流静水深流静水深,人静心深人静心深 Where there is life,there is hope。有生命必有希望。有生命必有希望2嵌入式实时操作系统嵌入式实时操作系统 C/OS1C/OS1内核结构内核结构l 临界段临界段(Critical Sections)l任务任务l任务状态任务状态l任务控制块(任务控制块(Task Control Blocks,OS_TCBs)l就绪表(就绪表(Ready List)l任务调度(任务调度(Task Scheduling)l空闲任务空闲任务(Idle Task)l统计任务统计任
2、务lC/OS中的中断处理中的中断处理l时钟节拍时钟节拍lC/OS-初始化初始化lC/OS-的启动的启动3嵌入式实时操作系统嵌入式实时操作系统 C/OS1C/OS1任务管理任务管理l建立任务,建立任务,OSTaskCreate()l建立任务,建立任务,OSTaskCreateExt()l任务堆栈任务堆栈l删除任务,删除任务,OSTaskDel()l请求删除任务,请求删除任务,OSTaskDelReq()l改变任务的优先级,改变任务的优先级,OSTaskChangePrio()l挂起任务,挂起任务,OSTaskSuspend()l恢复任务,恢复任务,OSTaskResume()l获得有关任务的信息
3、,获得有关任务的信息,OSTaskQuery()4嵌入式实时操作系统嵌入式实时操作系统 C/OS1C/OS1任务之间的通信与同步任务之间的通信与同步l事件控制块事件控制块ECBl使一个任务进入就绪状态,使一个任务进入就绪状态,OSEventTaskRdy()l使一个任务进入等待状态使一个任务进入等待状态,OSEventTaskWait()l由于等待超时将一个任务置为就绪状态由于等待超时将一个任务置为就绪状态,OSEventTO()l信号量信号量l邮箱邮箱l消息队列消息队列5内核结构内核结构6临界段临界段(Critical Sections)C/OS-为了处理临界段代码需要关中断,处理完毕后再开
4、中断。这使为了处理临界段代码需要关中断,处理完毕后再开中断。这使得得C/OS-能够避免同时有其它任务或中断服务进入临界段代码。能够避免同时有其它任务或中断服务进入临界段代码。l关中断的时间是实时内核开发商应提供的最重要的指标之一关中断的时间是实时内核开发商应提供的最重要的指标之一 l就使用就使用C/OS-而言,关中断的时间很大程度上取决于微处理器的架而言,关中断的时间很大程度上取决于微处理器的架构以及编译器所生成的代码质量。构以及编译器所生成的代码质量。C/OS-定义两个宏定义两个宏(macros)来关中断和开中断来关中断和开中断 lOS_ENTER_CRITICAL()lOS_EXIT_CR
5、ITICAL()。因为这两个宏的定义取决于所用的微处理器,故在文件因为这两个宏的定义取决于所用的微处理器,故在文件OS_CPU.H中可以找到相应宏定义。每种微处理器都有自己的中可以找到相应宏定义。每种微处理器都有自己的OS_CPU.H文件。文件。7临界段临界段(Critical Sections)开关中断示例开关中断示例l#define OS_ENTER_CRITICAL()EA=0 ;/移植到移植到51,只使用中断方式只使用中断方式1l#define OS_EXIT_CRITICAL()EA=18任务任务task典型的一个无限循环。典型的一个无限循环。void mytask(void*pda
6、ta)for(;)do something;waiting;do something;C/OSC/OS II 2.5版版本本支支持持64个个任任务务,每每个个任任务务一一个个特特定定的的优优先先级级。优优先先级越高,数字越小级越高,数字越小系统占用了系统占用了8个任务,保留优先级为个任务,保留优先级为0、1、2、3、OS_LOWEST_PRIO-3、OS_LOWEST_PRIO-2、OS_LOWEST_PRIO-1、OS_LOWEST_PRIO-0。9任务状态任务状态 下图是下图是C/OS-控制下的任务状态转换图。在任一给定的时控制下的任务状态转换图。在任一给定的时刻,任务的状态一定是在这五种
7、状态之一刻,任务的状态一定是在这五种状态之一 10任任务控制块(务控制块(TCB)任务控制块任务控制块 OS_TCB是一个数据结构,是一个数据结构,保存该任务的相关参数,包括任务堆栈指保存该任务的相关参数,包括任务堆栈指针,状态,优先级,任务表位置,任务链针,状态,优先级,任务表位置,任务链表指针等。表指针等。所有的任务控制块分为两条链表,空闲链所有的任务控制块分为两条链表,空闲链表和使用链表。表和使用链表。11任务控制块结构任务控制块结构Struct os_tcb OS_STK *OSTCBStkPtr;/*指向当前任务栈顶的指针指向当前任务栈顶的指针 struct os_tcb*OSTCB
8、Next;/*用于任务控制块的双重联表,用于任务控制块的双重联表,struct os_tcb*OSTCBprev;/*用于刷新各任务的延时变量用于刷新各任务的延时变量.OSTCBDly OS_EVENT *OSTCBEventPtr;void *OSTCBMsg;/*指向传给任务的消息指针指向传给任务的消息指针 INT16U OSTCBDly;/*保存任务在等待事件发生中允许挂起的最保存任务在等待事件发生中允许挂起的最 /*多时钟节拍数多时钟节拍数 INT8U OSTCBStat;INT8U OSTCBPrio;/*任务的优先级任务的优先级 INT8U OSTCBX,OSTCBY,OSTCBB
9、itX,OSTCBBitY;OS_TCB加速任务进入就绪态的过程事件控制块的指针任务的状态字12空任务列表空任务列表系统初始化时,所有任务控制块被链接成空任务控制块系统初始化时,所有任务控制块被链接成空任务控制块的单向链表的单向链表13就绪表就绪表每个任务的就绪状态标志都放入就绪表中(每个任务的就绪状态标志都放入就绪表中(ready list)中,)中,就绪表有两个变量:就绪表有两个变量:OSRdyGrp、OSRdyTbl141、使任务进入就绪态的程序编写、使任务进入就绪态的程序编写1、使任务进入就绪态的程序编写:、使任务进入就绪态的程序编写:OSRdyGrp|=OSMapTblprio3;O
10、SRdyTblprio3|=OSMapTblprio&0 x07;例例1:根据优先级确定就绪表根据优先级确定就绪表假假 设设 优优 先先 级级 为为 12的的 任任 务务 进进 入入 就就 绪绪 状状 态态,12=1 100b,则则OSRdyTbl1的的第第4位位置置1,且且OSRdyGrp的的第第1位位置置1,相相应应的的数数学表达式为学表达式为:OSRdyGrp|=0 x02;OSRdyTbl1|=0 x10;而而优优先先级级为为21的的任任务务就就绪绪21=10 101b,则则OSRdyTbl2的的第第5位位置置1,且,且OSRdyGrp的第的第2位置位置1,相应的数学表达式为:相应的数
11、学表达式为:OSRdyGrp|=0 x04;OSRdyTbl2|=0 x20;152、从就绪表中删除一个任务的程序、从就绪表中删除一个任务的程序If(OSRdyTblprio3&OSMapTblprio&0 x07)=0);OSRdyGrp&=OSMapTbl prio3;163、找出进入就绪态的优先级最高的任务程序编写、找出进入就绪态的优先级最高的任务程序编写Y=OSUnMapTblOSRdyGrp;X=OSUnMapTblOSRydTblY;Prio=(Y3)+X;两个关键两个关键:(1)优先级数分解为高三位和低三位)优先级数分解为高三位和低三位分别确定;分别确定;(2)高优先级有)高优先
12、级有着小的优先级号着小的优先级号;例例2:根据就绪表确定最高优先级:根据就绪表确定最高优先级假设假设OSRdyGrp的值的值为为0 x24=00100 100b,-OSRdyTbl2 和和OSRdyTbl5,高优先级为,高优先级为2;通过通过OSRdyTbl2的值来确定低的值来确定低3位,位,假设假设OSRydTbl2的值的值为为0 x12=00100 100b,-第第2个和第个和第5个任务,取个任务,取高优先级第高优先级第2个个-prio=2*8+2=1817源代码中使用了查表法源代码中使用了查表法查查表表法法具具有有确确定定的的时时间间,增增加加了了系系统统的的可可预预测测性性,uC/OS
13、中中所所有有的的系系统统调调用用时时间间都都是是确定的确定的High3=OSUnMapTblOSRdyGrp;Low3 =OSUnMapTblOSRdyTblHigh3;Prio =(Hign30),),C/OS-将返回到被中断的任务。将返回到被中断的任务。用户中断服务中做的事要尽可能地少,要把大部分工作留给任务去做。中断用户中断服务中做的事要尽可能地少,要把大部分工作留给任务去做。中断服务子程序通知某任务去做事的手段是调用以下函数之一:服务子程序通知某任务去做事的手段是调用以下函数之一:lOSMboxPost(),lOSQPost(),lOSQPostFront(),lOSSemPost()
14、。中断发生并由上述函数发出消息时,接收消息的任务可能是,也可能不是挂中断发生并由上述函数发出消息时,接收消息的任务可能是,也可能不是挂起在邮箱、队列或信号量上的任务。起在邮箱、队列或信号量上的任务。28关于关于OSIntExit()OSIntExit()看起来非常像看起来非常像OS_Sched()。但有三点不同。但有三点不同。lOSIntExit()使中断嵌套层数减使中断嵌套层数减1,而调度函数,而调度函数OS_Sched()的调度条件的调度条件是:中断嵌套层数计数器和锁定嵌套计数器(是:中断嵌套层数计数器和锁定嵌套计数器(OSLockNesting)二者)二者都必须是零。都必须是零。lOSR
15、dyTbl所需的检索值所需的检索值Y是保存在全程变量是保存在全程变量OSIntExitY中的。这是中的。这是为了避免在任务栈中安排局部变量。这个变量在哪儿和中断任务切换为了避免在任务栈中安排局部变量。这个变量在哪儿和中断任务切换函数函数OSIntCtxSw()有关。有关。l如果需要做任务切换,如果需要做任务切换,OSIntExit()将调用将调用OSIntCtxSw()而不是调用而不是调用OS_TASK_SW(),正像在正像在OSSched()函数中那样。调整栈结构要保证函数中那样。调整栈结构要保证所有挂起任务的栈结构看起来是一样的。所有挂起任务的栈结构看起来是一样的。有的微处理器,像有的微处
16、理器,像Motorola 68HC11中断发生时中断发生时CPU寄存器是自动入栈寄存器是自动入栈的,且要想允许中断嵌套的话,在中断服务子程序中要重新开中断。如果的,且要想允许中断嵌套的话,在中断服务子程序中要重新开中断。如果用户中断服务子程序执行得非常快,用户不需要通知任务自身进入了中断用户中断服务子程序执行得非常快,用户不需要通知任务自身进入了中断服务,只要不在中断服务期间开中断,也不需要调用服务,只要不在中断服务期间开中断,也不需要调用OSIntEnter()或或OSIntNesting加加1。一个任务和这个中断服务子程序通讯的唯一方法是通。一个任务和这个中断服务子程序通讯的唯一方法是通过
17、全程变量。过全程变量。29中断与时钟节拍中断与时钟节拍我们知道:当发生中断时,首先应保护现场,将我们知道:当发生中断时,首先应保护现场,将CPU寄存器入栈,再处理中断函数,然后恢复寄存器入栈,再处理中断函数,然后恢复现场,将现场,将CPU寄存器出栈,最后执行中断返回寄存器出栈,最后执行中断返回iret(x86)指令实现中断返回。指令实现中断返回。uC/OS中提供了中提供了OSIntEnter()和和OSIntExit()告告诉内核进入了中断状态。诉内核进入了中断状态。时钟节拍是一种特殊的中断,是操作系统的心脏。时钟节拍是一种特殊的中断,是操作系统的心脏。首先首先32位的整数位的整数OSTime
18、加一。对任务列表进行加一。对任务列表进行扫描,判断是否有延时任务应该处于准备就绪状扫描,判断是否有延时任务应该处于准备就绪状态,最后进行上下文切换。态,最后进行上下文切换。30时钟节拍时钟节拍C/OS需要用户提供周期性信号源,用于实现时间需要用户提供周期性信号源,用于实现时间延时和确认超时。节拍率应在每秒延时和确认超时。节拍率应在每秒10次到次到100次之间,次之间,或者说或者说10到到100Hz。时钟节拍率越高,系统的额外。时钟节拍率越高,系统的额外负荷就越重。时钟节拍的实际频率取决于用户应用负荷就越重。时钟节拍的实际频率取决于用户应用程序的精度。时钟节拍源可以是专门的硬件定时器,程序的精度
19、。时钟节拍源可以是专门的硬件定时器,也可以是来自也可以是来自50/60Hz交流电源的信号。交流电源的信号。用户必须在多任务系统启动以后再开启时钟节拍器,用户必须在多任务系统启动以后再开启时钟节拍器,也就是在调用也就是在调用OSStart()之后。之后。C/OS-中的时钟节拍服务是通过在中断服务子程中的时钟节拍服务是通过在中断服务子程序中调用序中调用OSTimeTick()实现的。实现的。31void OSTimeTick(void)OS_TCB*ptcb;ptcb=OSTCBList;-OSTCB链表指针链表指针while(ptcb-OSTCBPrio!=OS_IDLE_PRIO)看是不是空闲
20、任务,空闲任务是最后的任务看是不是空闲任务,空闲任务是最后的任务 if(ptcb-OSTCBDly!=0)是否延时是否延时 if(-ptcb-OSTCBDly=0)延时减一,看是否延时结束延时减一,看是否延时结束 if(!(ptcb-OSTCBStat&OS_STAT_SUSPEND)OSRdyGrp|=ptcb-OSTCBBitY;是的话将其列入准备就绪表是的话将其列入准备就绪表 OSRdyTblptcb-OSTCBY|=ptcb-OSTCBBitX;else ptcb-OSTCBDly=1;ptcb=ptcb-OSTCBNext;指针指向下一个指针指向下一个TCB结构结构 OSTime+;
21、变量加一,记录系统启动以来的时钟滴答数变量加一,记录系统启动以来的时钟滴答数 时钟节拍函数时钟节拍函数32OSTimeTick(void)令指针指向第一个任务是否是空闲任务?任务是否存在延时?延时数减一延时数是否为0?如果条件合适,将该任务放入就绪列表 令指针指向下一个任务 OSTime+返回是否是否是否空闲任务总是最后一个任务对任务表进行扫描预定的延时到了,就应该在使任务处于就绪条件是:任务没有处于挂起态任务没有延时的话忽略即可33时间任务一任务二OSStartTime Tick Time Tick 12550Time Tick 空闲任务任务任务时间时间34C/OS-初始化初始化 在调用在调
22、用C/OS-的任何其它服务之前,的任何其它服务之前,C/OS-要求用户首先调要求用户首先调用系统初始化函数用系统初始化函数OSInit()。OSInit()初始化初始化C/OS-所有的变量所有的变量和数据结构(见和数据结构(见OS_CORE.C)。)。OSInit()建立空闲任务建立空闲任务idle task,这个任务总是处于就绪态的。空,这个任务总是处于就绪态的。空闲任务闲任务OSTaskIdle()的优先级总是设成最低,即()的优先级总是设成最低,即OS_LOWEST_PRIO。如果统计任务允许。如果统计任务允许OS_TASK_STAT_EN和和任务建立扩展允许都设为任务建立扩展允许都设为
23、1,则,则OSInit()还得建立统计任务还得建立统计任务OSTaskStat()并且让其进入就绪态。并且让其进入就绪态。OSTaskStat的优先级总是设为的优先级总是设为OS_LOWEST_PRIO-1。C/OS-还初始化了还初始化了4个空数据结构缓冲区。每个缓冲区都是单向个空数据结构缓冲区。每个缓冲区都是单向链表,允许链表,允许C/OS-从缓冲区中迅速得到或释放一个缓冲区中的从缓冲区中迅速得到或释放一个缓冲区中的元素。元素。235C/OS-的启动的启动 多任务的启动是用户通过调用多任务的启动是用户通过调用OSStart()实现的。然实现的。然而,启动而,启动C/OS-之前,用户至少要建立
24、一个应用之前,用户至少要建立一个应用任务,如下列程序清单所示。任务,如下列程序清单所示。程序清单程序清单 初始化和启动初始化和启动C/OS-void main(void)OSInit();/*初始化初始化uC/OS-II */.通过调用通过调用OSTaskCreate()或或OSTaskCreateExt()创建至少一个任务创建至少一个任务;.OSStart();/*开始多任务调度开始多任务调度!OSStart()永远不会返回永远不会返回*/36C/OS-的启动的启动当调用当调用OSStart()时,时,OSStart()从任务就绪表中找出从任务就绪表中找出那个用户建立的优先级最高任务的任务控
25、制块那个用户建立的优先级最高任务的任务控制块。然后,然后,OSStart()调用高优先级就绪任务启动函数调用高优先级就绪任务启动函数OSStartHighRdy(),(见汇编语言文件见汇编语言文件OS_CPU_A.ASM),这个文件,这个文件与选择的微处理器有关。与选择的微处理器有关。注意,注意,OSStartHighRdy()将永远不返回到将永远不返回到OSStart()。37void OSStart(void)INT8U y,x;if(OSRunning=FALSE)判断是否启动内核判断是否启动内核 y =OSUnMapTblOSRdyGrp;x =OSUnMapTblOSRdyTbly;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- zA 嵌入式 系统 设计 实例 开发
![提示](https://www.deliwenku.com/images/bang_tan.gif)
限制150内