uCOSII移植总结(推荐)_ucosii的移植及使用
uCOSII移植总结(推荐)由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“ucosii的移植及使用”。
uC/OS-II移植总结
RTOS移植牵涉到软件平台—编译器、硬件平台—CPU,移植前需要了解CPU及编译器的一些基本特点。
1、编译器
a、堆栈运行原理
本次移植的软件平台为CodeVision编译器,它的堆栈由两部分组成:硬件堆栈(HardStack)用来保存中断及函数调用的返回地址,它的大小将影响函数调用嵌套的深度,实际大小应根据中断及函数嵌套的深度来决定,并留有一定的裕度。硬件堆栈由CPU中的指针SP实现。软件堆栈(SoftStack)用来分配局部变量及传递参数。在此次移植中,由CPU中的Y指针模拟实现。
b、堆栈指针所指向的单元是否为可用单元
大多数编译器生成的代码,其堆栈指针所指向的单元为可用单元,也就是说在将数据压入堆栈前不用再调整堆栈指针,堆栈指针在上一次使用完后已经调整好了。前面所说的硬件堆栈(HardStack)即为这种类型。还有一种堆栈,其指针所指向的单元为不可用单元,在向堆栈压入数据前需调整堆栈指针,软件堆栈(SoftStack)即为这种类型。
软件堆栈设计为这种形式完全是为了适应AVR指令和软件堆栈增长方向与硬件堆栈增长方向相同。软件堆栈(SoftStack)由Y指针模拟实现,但在AVR的指令集中只有:
LDRd,Y+LDRd,–YSTY+,RrST–Y,Rr
要实现向下增长的堆栈就只能使用ST–Y,Rr和LDRd,Y+。指针指向的单元已压入数据,因此使用前需调整指针,而ST –Y,Rr正好能完成这个动作。
c、多字节变量在宽度为单字节的存储器中的分配规则
多字节变量指定义为int、long int、float、double等类型的变量。
在CodeVision编译器遵循的原则是:变量低字节部分分配在内存的低地址单元,变量高字节部分分配在内存高地址单元。
如:int aa为双字节变量,其低字节保存在内存的0x24H,则高字节保存在内存的0x25H。
了解这些变量在内存中存储形式是为了能够在在线汇编中正确操作它们。
2、CPU
a、程序计数器PC压入堆栈中的形式
中断或函数调用时,首先压入硬件堆栈的是程序计数器的低字节PCL接着再将程序计数器的高字节PCH压入。在任务堆栈初始化函数
OSTaskStkInit()中需要对硬件堆栈和软件堆栈初始化。对硬件堆栈初始化就是模拟中断时CPU保存PC的过程,因此将传递过来的任务起始地址的低字节放在硬件堆栈的栈底,高字节放在硬件堆栈的下一单元。这两个字节存放的正确与否将决定整个系统能否正常工作。
此外我感觉uC/OS-II中的全局变量定义顺序不是太好,事件控制块ECB的定义插在全局变量定义中间(可以查看.map文件)。如果没有定义事件控制块ECB,重要的全局变量基本上分配在寄存器中(CodeVision中bit 变量数设为0),但定义事件控制块ECB后全局变量将有可能移动到RAM区。在MEGA单片机中对寄存器操作和对RAM区操作的指令是不一样的,因此在编写OS_CPU_A.C中的汇编函数时,由于ECB定义是否插入将改变操作全局变量的指令。在OS_CFG.H改变ECB的配置将影响以前已经写好的接口文件,为了消除这种影响可将需要汇编操作的全局变量放到前面定义。
E_Mail:gnaijnaoul@163.com