本文主要是介绍UCOS系统总运行原理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
系统总运行原理
在步进调试时发现,实际上使用OSTaskCreate()
在ucos中构建应用的过程,实际上只是创建堆栈,设定应用行为,引导应用函数指针等的数据操作,OSInit()
中的设定也是类似,实际都是数据填充,在调试过程中,发现main()中的最后运行函数是
;/**************************************************************************************
;* 函数名称: OSStartHighRdy
;*
;* 功能描述: 使用调度器运行第一个任务
;*
;* 参 数: None
;*
;* 返 回 值: None
;**************************************************************************************/ OSStartHighRdyLDR R0, =NVIC_SYSPRI4 ; Set the PendSV exception priorityLDR R1, =NVIC_PENDSV_PRISTRB R1, [R0]MOVS R0, #0 ; Set the PSP to 0 for initial context switch callMSR PSP, R0LDR R0, =OS_CPU_ExceptStkBase ; Initialize the MSP to the OS_CPU_ExceptStkBaseLDR R1, [R0]MSR MSP, R1 LDR R0, =NVIC_INT_CTRL ; Trigger the PendSV exception (causes context switch),引发一次任务切换,pensv中断服务程序中跳转任务所需要的参数在运行OSStartHighRdy前就已经设定好LDR R1, =NVIC_PENDSVSETSTR R1, [R0]CPSIE I ; Enable interrupts at processor levelOSStartHangB OSStartHang ; Should never get here
OSStart(&err)
中调用了OSStartHighRdy()
,该函数触发了一次系统任务调度,也就是会转到一个当前最高优先级的任务中(以干预处理器寄存器的方式)参考,理论上应该就是优先级为0的OS_IntQTask()
,该任务用于处理来自isr的post请求
,使用OS_IntQTask,表明使用Deferred Post Method的方式进行ISR的POST处理
,实际上就是在ISR结束后再统一处理POST请求的过程,由于只要在最后一次中进入一次临界区,相对于Direct Post Method,进入临界区的次数更少,让系统运行更快。此外还有很多优点,如POST并发等,这部分不赘述,参考如下
这是为了减少使用ISR直接操作POST行为带来的系统效率低下而采取的处理方式,而且也更加便于多任务的执行,在该函数中,当暂存post请求的队列处理结束时,会使用OSSched()
触发一个系统调度,也就有可能切换到其他任务,这实现了任务的切换,需要注意的是,当系统中没有定义的任务在执行时,系统会进入一个优先级最低的闲置任务IDLETASK
该任务使用一个loop运行,且执行的代码精简,基本上是用于统计性能的代码,当其他任务在设定时间超时或者悬挂对象接受到时(触发中断),则会暂时跳出该任务去处理,在其他任务空闲时又回到这里,可认为ucos的大部份运行实际上是在该任务中,直到出现比这个更高的任务,系统运行总过程就可以理解了。
这篇关于UCOS系统总运行原理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!