1实时嵌入式操作系统艾云峰aiyunfeng@gmail.comCollegeofComputing&CommunicationEngineeringReal-timeEmbeddedOperatingSystem2主要内容1.UCOS在ARM上的移植2.基于UCOS的应用程序执行过程分析3UC/OS-II内核源代码文件组成OS_CORE.COS_FLAG.COS_MBOX.COS_MME.COS_MUTEX.COS_Q.COS_SEM.COS_TASK.COS_TIME.CuCOS_II.CuCOS_II.HOS_CFG.HINCLUDES.HOS_CPU.HOS_CPU_A.ASMOS_CPU_C.CUC/OS-II(与处理器无关代码)UC/OS-II配置(与应用相关)UC/OS-II移植(处理器相关代码)应用程序(用户代码)CPU定时器软件硬件4OS_CPU.H的实现5定义几个数据类型所在文件:OS_CPU.H根据所用处理器定义如下几个数据类型:typedefxxxBOOLEAN;typedefxxxINT8U;typedefxxxINT8S;typedefxxxINT16U;typedefxxxINT16S;typedefxxxINT32U;typedefxxxINT32S;typedefxxxFP32;typedefxxxFP64;ARM对应修改6定义堆栈类型和堆栈增长类型所在文件:OS_CPU.H根据所用处理器定义堆栈类型和堆栈增长类型:typedefxxxOS_STK;#defineOS_STK_GROWTHx0表示堆栈从低地址向高地址增长1表示堆栈从高地址向低地址增长ARM对应修改7定义两个宏修改文件:OS_CPU.H#defineOS_ENTER_CRITICAL()?#defineOS_EXIT_CRITICAL()?说明:内核源代码中多处用到上述两个宏,如图所示。这两个宏在C源文件中定义,用于保护临界区8定义任务切换宏和实现OSCtxSw修改文件:OS_CPU.H定义内容:#defineOS_TASK_SW()?说明:OS_TASK_SW在OSSched()函数中调用,用于完成任务的切换。通常实现的方法有两种:一种是直接把其定义成汇编文件OS_CPU_A.S中函数OSCtxSw();一种是把其定义成一条软中断命令并把OSCtxSw()定一成软中断的处理函数;修改文件:OS_CPU_A.S实现函数:OSCtxSw()函数功能:实现任务的上下文切换9OS_CPU_A.C的实现10定义任务堆栈的初始化函数修改文件:OS_CPU_A.C堆栈初始化函数:OSTaskStkInit()说明:任务在创立时,调用OSTaskStkInit()函数对任务的堆栈进行初始化。初始化的目的是:使任务的堆栈就像刚刚被任务被切换出来一样,从而为任务的调度执行做好准备。注意:此时堆栈中对应PC的内容(即切换到该任务时执行的第一条指令)应该指向任务的第一条指令。ARM堆栈初始化函数11OS_CPU_A.S的实现12定义执行第一个任务的函数OSStartHighRdy修改文件:OS_CPU_A.S修改内容:用汇编语言实现OSStartHighRdy()函数说明:该函数的调用OSStart-OSStartHighRdy,如图所示。执行该函数时,OSTCBHighRdy已经指向了要执行的最高优先级的任务,OSStartHighRdy要做的就是把该任务的上下文读取到CPU各寄存器,并置为全局变量OSRunning,表示多任务已经开启。ARM实现13中断服务子程序的示意码保存全部CPU寄存器到任务堆栈;(1)调用OSIntEnter或OSIntNesting直接加1;(2)清中断源(3)重新开中断(4)执行用户代码做中断服务;(5)调用OSIntExit();(6)恢复所有CPU寄存器;(7)执行中断返回指令;(8)(3)如果决定重新允许中断,必须首先清楚中断源;否则会重新进入这一段中断服务程序μC/OS-Ⅱ中,中断服务子程序要用汇编语言来写。然而,如果用户使用的C语言编译器支持在线汇编语言的话,用户可以直接将中断服务子程序代码放在C语言的程序文件中(6)调用脱离中断函数OSIntExit()标志着中断服务子程序的终结,OSIntExit()将中断嵌套层数计数器减1。当嵌套计数器减到零时,所有中断,包括嵌套的中断就都完成了,此时μC/OS-Ⅱ要判定有没有优先级较高的任务被中断服务子程序(或任一嵌套的中断)唤醒了,如果有优先级高的任务进入了就绪态,μC/OS-Ⅱ就返回到那个高优先级的任务(5)用户服务以中断请求设备的程序,一般使用C语言编写(4)如果允许中断嵌套,则重新开中断;ucos支持中断嵌套(1)用户代码应该将全部CPU寄存器推入当前任务的堆栈(2)μC/OS-Ⅱ需要知道用户在做中断服务,故用户应该调用OSIntEnter(),或者将全程变量OSIntNesting直接加1UC/OS-II对于中断服务子程序的要求(7)恢复TCBCur指向的任务的所有CPU寄存器14UC/OS-II运行于ARM时中断服务程序分析(2)UCOS_IRQHandler实现分析:保存r0-r3、r12、lr(此时处于IRQ模式下,lr为IRQ模式的lr)到IRQ的堆栈.(因为下面的子程序会使用这几个寄存器,所以需要事先保存)调用OSInitEnter调用C_IRQHandler调用OSInitExit(见OS_Core.c文件)判断标志位OSIntCtxSwFlag,若不为1,从中断中返回否则,切换到usr模式,把被中断任务的上下文保存到被中断任务的堆栈中取OSTCBHighRdy指向任务的堆栈指针,把该任务的上下文加载到CPU中。OSIntExit找到优先级最高的任务如果需要任务切换的话让OSTCBHighRdy指向优先级最高的就绪任务调用OSIntCtxSw()15主要内容1.UCOS在ARM上的移植2.基于UCOS的应用程序执行过程分析16AnyQuestions?