UCOS移植心得
1.弄懂UCOS,这是谁都知道的哦 ^_^
2. 弄懂你想要移植到的硬件平台
3. 清楚你使用的编译器是如何处理函数的局部变量和怎么样处理函数间的参数传递
这里多废话几句第三点:在UCOS里面,所有函数都要求具有重入性(除了OSSTAR()外,只有这个函数我觉得是不需要的,它仅仅使用了一次);重入性是多任务的基础,而所谓重入性从函数而言就是它的变量的保存问题,在中断这个函数的执行时它使用的变量需要得到保存,以便返回后的执行是正确的,就我使用的编译器而言,它通过堆栈传递函数参数,
重入性问题就很容易解决拉,在中断任务时,它的参数已经在堆栈里面了,只要你保存好CPU寄存器和堆栈指针SP就好
任务可以是关中断时被挂起,也可以是开中断时被挂起,那么在任务切换回来后如何保证它的中断状况呢?问题可以通过给每个任务设置一个中断计数器解决,并初始化为 0,记录每个任务的开关中断次数,关一次中断加 1,开一次中断减 1, 在任务调度的时候保存当前任务的中断计数器,切换到新任务时查看新任务的中断计数器,如果为 0就开中断返回,不然就直接返回(任务级切换是在关中断下进行的);而对于中断级任务调度,肯定是发生在开中断情况下的,就要查看是否需要关中断处理
下面开始移植最重要的三个文件:
OS_CPU_C.C:
OSTaskStkInit():
别的就是空函数,比较简单,这里略去
接着是OSCtxSw():
KAI: POP R1,R5 FROM [SP]
评论