51单片机移植心得.doc_第1页
51单片机移植心得.doc_第2页
51单片机移植心得.doc_第3页
51单片机移植心得.doc_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

移植心得 张涛UC/OS-II内核可以分为与处理器无关的代码,与处理器相关的代码以及与应用相关的代码3个部分。移植中只需修改与处理器相关部分和应用相关的代码的文件,即包括:处理器相关C文件OS_CPU.H,OS_CPU_C.C,汇编文件OS_CPU_ASM.ASM和配置文件OS_CFG.H,其它代码几乎不需要改变。一 改写最简单的OS_CPU.H主要声明四个宏:1.数据类型的设定:注意BOOLEAN要定义成unsigned char 类型,因为bit类型为C51特有,不能用在结构体里.2.堆栈的增长方向:MCS-51堆栈从下往上增长(1=向下,0=向上),OS_STK_GROWTH定义为0。3.定义临界段:EA=0关中断;EA=1开中断.这样定义即减少了程序行数,又避免了退出临界区后关中断造成的死机.4.定义任务切换宏;#define OS_TASK_SW() OSCtxSw() 因为MCS-51没有软中断指令,所以用程序调用代替。两者的堆栈格式相同,RETI指令复位中断系统,RET则没有。实践表明,对于MCS-51,用子程序调用入栈,用中断返回指令RETI出栈是没有问题的,反之中断入栈RET出栈则不行。总之,对于入栈,子程序调用与中断调用效果是一样的,可以混用。在没有中断发生的情况下复位中断系统也不会影响系统正常运行。二修改OS_CPU_C.C文件1.初始化系统时钟:操作系统tick时钟我使用了51单片机的T0定时器,它的初始化代码可参考任哲书上关于时钟初始化的文件2.编写10个与操作体系有关的钩子函数3.修改任务堆栈初始化函数OSTaskStkInit()。uC/OS-II 中每个任务都有自己的堆栈空间,并且必须声明为OS_STK类型,主要完成对用户任务的堆栈进行初始化。OSTaskStkInit函数总是返回用户栈最低地址。4. 最后还有几点必须注意的事项.本来原则上我们不用修改与处理器无关的代码,但是由于KEIL编译器的特殊性,这些代码仍要多处改动.因为KEIL缺省情况下编译的代码不可重入,而多任务系统要求并发操作导致重入,所以要在每个C函数及其声明后标注reentrant关键字.另外,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个简单汇编语言函数:OSStartHighRdy /使就绪态任务中优先级最高的任务开始运行OSCtxSw /低优先级任务切换到高优先级任务OSTickISR /时钟节拍中断OSIntCtxSw /在ISR中执行任务切换功能这四个函数汇编语言在任哲书上都有详细的讲解。自己也只能了解一些简单的指令内容,感兴趣的同学可以自己研究一下。四修改配置文件 配置文件的修改需要根据用户的主函数内容进行配置,可以参考课本上关于移植文件的裁剪所讲的内容。 在修改中需注意的是最大任务数最低为2,而最低优先级数应该比最大任务数大1,为空闲任务留的。五移植的正确性验证 创建两个任务Task1和Task2,验证OSTaskStkInit 和OSStartHighRdy()函数;创建Task1和Task2后,通过二者之间的切换,验证OSCtxSw函数。测试主代码如下:#includeincludes.h#includeintrins.hsbit dule = P2 6; /U1锁存器的锁存端sbit wei = P2 7; /U2锁存器的锁存端INT8U num;INT8U aa; INT8U code table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;OS_STK Task1StkMaxStkSize; /创建任务堆栈OS_STK Task2StkMaxStkSize;void Task1(void* ddata) reentrant ddata = ddata;wei=1; /打开U2锁存端P0=0xfe; /送入位选信号wei=0; /关闭U2锁存端 while (1) for(num=0;num10;num+) dule=1; /打开U1锁存端 P0=tablenum;/送入段选信号 dule=0; /关闭U1锁存端 OSTimeDly(50); void Task2(void* ddata) reentrant ddata = ddata;aa=0xfe; while(1) P1=aa; OSTimeDly(30); aa=_crol_(aa,1);void main(void)OSInit();InitTimer0();OSTaskCreate(Task1, (void *) 0, &Task1Stk0, 1);OSTaskCreate(Task2, (void *) 0, &Task2Stk0, 0); 1.刚开始仿真时在kell中建立的文件名需和文件的存盘名一致,否侧仿真出现错误。 2.在测试主代码中用到与配置文件有关的函数,尽量配置一样。比如这里用到两个任务,如果在配置文件中设置最大任务数为5,虽然不会出现错误,但会有警告产生。 3.两个任务的延迟时间也要相匹配,否侧实物仿真不正确。 4.在输出HEX文件时,Memory Modle 和 Code Rom Size选项应为大端模式, uCOS_IIC文件的选项Properties下Generate Assembler SRC File选项应选上,嵌入汇编。 5.一切设置完成后就可以编译烧到单片机上了,这里我用的是STCA0C9852单片机。把HEX格式的文件烧到单片机后在实验板上运行,可以看到实验板上的流水灯轮流亮,这是任务2 的主要内容,在编写任务2时,调用了一个循环左移的函数intrins.h。同时可以看到第一个数码管依次循环显示数字0-9,这主要通过任务1的主函数实现的,先通过U2锁存器送位选信号再通过U1锁存器送段选信号。通过这两个简单任务的运行可以验证移植后的系统是可以运行的。在最后的验证过程中我试过建立三个任务来运行,在这两个任务的基础上再添加一个蜂鸣器的任务三,编译没有错误,但是烧到单

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论