资源描述:
《51单片机移植心得》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、移植心得张涛UC/OS-II内核可以分为与处理器无关的代码,与处理器相关的代码以及与应用相关的代码3个部分。移植中只需修改与处理器相关部分和应用相关的代码的文件,即包括:处理器相关C文件OS_CPU.H,OS_CPU_C.C,汇编文件OS_CPU_ASM.ASM和配置文件OS_CFG.H,其它代码几乎不需要改变。一.改写最简单的OS_CPU.H主要声明四个宏:1.数据类型的设定:注意BOOLEAN要定义成unsignedchar类型,因为bit类型为C51特有,不能用在结构体里.2.堆栈的增长方向:MCS-51堆栈从下往上增长(1=向下,0=向上),OS_STK_GROWTH定义为0。3.定义
2、临界段:EA=0关中断;EA=1开中断.这样定义即减少了程序行数,又避免了退出临界区后关中断造成的死机.4.定义任务切换宏;#defineOS_TASK_SW()OSCtxSw()因为MCS-51没有软中断指令,所以用程序调用代替。两者的堆栈格式相同,RETI指令复位中断系统,RET则没有。实践表明,对于MCS-51,用子程序调用入栈,用中断返回指令RETI出栈是没有问题的,反之中断入栈RET出栈则不行。总之,对于入栈,子程序调用与中断调用效果是一样的,可以混用。在没有中断发生的情况下复位中断系统也不会影响系统正常运行。二.修改OS_CPU_C.C文件1.初始化系统时钟:操作系统tick时钟我
3、使用了51单片机的T0定时器,它的初始化代码可参考任哲书上关于时钟初始化的文件2.编写10个与操作体系有关的钩子函数3.修改任务堆栈初始化函数OSTaskStkInit()。uC/OS-II中每个任务都有自己的堆栈空间,并且必须声明为OS_STK类型,主要完成对用户任务的堆栈进行初始化。OSTaskStkInit函数总是返回用户栈最低地址。4.最后还有几点必须注意的事项.本来原则上我们不用修改与处理器无关的代码,但是由于KEIL编译器的特殊性,这些代码仍要多处改动.因为KEIL缺省情况下编译的代码不可重入,而多任务系统要求并发操作导致重入,所以要在每个C函数及其声明后标注reentrant关键
4、字.另外,"pdata","data"在uCOS中用做一些函数的形参,但它同时又是KEIL的关键字,会导致编译错误,我通过把"pdata"改成"ppdata","data"改成"ddata"解决了此问题。三.重写OS_CPU_A.ASMA51宏汇编的大致结构如下:NAME模块名;与文件名无关;定义重定位段必须按照C51格式定义,汇编遵守C51规范.段名格式为:PR函数名模块名;声明引用全局变量和外部子程序注意关键字为"EXTRN"没有'E'全局变量名直接引用无参数/无寄存器参数函数FUNC带寄存器参数函数_FUNC重入函数_FUNC;分配堆栈空间uC/OS-II移植实例要求用户编写4个简单汇编
5、语言函数:OSStartHighRdy//使就绪态任务中优先级最高的任务开始运行OSCtxSw//低优先级任务切换到高优先级任务OSTickISR//时钟节拍中断OSIntCtxSw//在ISR中执行任务切换功能这四个函数汇编语言在任哲书上都有详细的讲解。自己也只能了解一些简单的指令内容,感兴趣的同学可以自己研究一下。四.修改配置文件配置文件的修改需要根据用户的主函数内容进行配置,可以参考课本上关于移植文件的裁剪所讲的内容。在修改中需注意的是最大任务数最低为2,而最低优先级数应该比最大任务数大1,为空闲任务留的。五.移植的正确性验证创建两个任务Task1和Task2,验证OSTaskStkIn
6、it和OSStartHighRdy()函数;创建Task1和Task2后,通过二者之间的切换,验证OSCtxSw函数。测试主代码如下:#include"includes.h"#include"intrins.h"sbitdule=P2^6;//U1锁存器的锁存端sbitwei=P2^7;//U2锁存器的锁存端INT8Unum;INT8Uaa;INT8Ucodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};OS_STKTask1Stk[MaxStkSize];//创建任务堆栈OS_STKTask2Stk[MaxStkSiz
7、e];voidTask1(void*ddata)reentrant{ddata=ddata;wei=1;//打开U2锁存端P0=0xfe;//送入位选信号wei=0;//关闭U2锁存端while(1){for(num=0;num<10;num++){dule=1;//打开U1锁存端P0=table[num];//送入段选信号dule=0;//关闭U1锁存端OSTimeDly(50);}}}void