|
uCosII移植基础知识(《uC/OS-II内核分析、移植与驱动程序开发》(陈是知))
所谓移植,就是使一个实时内核能在某个微处理器或微控制器上运行。
要使uc/osII正常运行,处理器必须满足以下要求:
1、 处理器的C变压器能产生可重入代码。(什么是可重入代码了?允许多个进程同时访问的代码)
2、 用C语言就可以打开和关闭中断。
3、 处理器支持中断,并且能产生定时中断(频率通常在10至100Hz之间)。
4、 处理器能支持容纳一定量的数据存储硬件堆栈(可能是几千字节)。
5、 处理器包含将堆栈指针和其他CPU寄存器的内容读出并存储到堆栈或内存中的指令。
“堆”和“栈”是两个完全不同的概念,“堆栈”是我们的一种习惯叫法,如果没有特别说明,我们常说的“堆栈”其实是“栈”。(那么,“堆”和“栈”到底是什么了?)
有些资料将OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()称为函数,这是不正确的。因为宏与函数的区别非常明显,而且函数的调用与返回会伴随着对堆栈的操作,而宏仅仅是在编译的过程中进行字符串替换。在程序的编写过程中能采用宏定义完成时要尽量少采用函数,因为目前很多处理器都有流水线的功能,函数的调用会带来跳转,自然也就打断流水线,造成性能损失。
从移植的角度来说,编写OSTaskStkInit()函数有一定难度,原因在于涉及的知识点较多,工作较细。编写OSTaskStkInit()函数的第一步就是堆栈的设计,这是移植中的一大难点,大致需要考虑以下因素:
1、 CPU自动入栈的寄存器及压栈顺序。
2、 需要额外保存哪些寄存器。
3、 所采用的编译器对形式参数的传递方法。
4、 堆栈的增长方向。
5、 堆栈指针是指向下一个可用空间还是指向上次入栈数据。
6、 所采用的CPU是否存在系统堆栈。
7、 堆栈深度。
堆栈的构建没有绝对的规则或公式,最关键的还是要掌握CPU的结构和uCOSII的原理,灵活应用。