文档详情

51单片机移植心得

ss****gk
实名认证
店铺
DOC
122KB
约4页
文档ID:235964477
51单片机移植心得_第1页
1/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. 堆栈的增长方|nJ:MCS-51堆栈从下往上增长(1二向下,0二向上),OS STK GROWTH定义为03. 定义临界段:EA二0关中断;EA二1开中断.这样定义即减少了稈序行数,又避免了退出临界 区后关中断造成的死机.4. 定义任务切换宏;#define OS_TASK_SW() OSCtxSwO因为MCS-51没有软中断指令,所 以用稈序调用代替两者的堆栈格式相同,RET1指令复位中断系统,RET则没有实践表明, 对于MCS-51,用了程序调用入栈,用中断返冋指令RETI出栈是没有问题的,反Z中断入栈 RET岀栈则不行。

总之,对于入栈,子程序调用与中断调用效果是一样的,可以混用在没 有中断发生的情况下复位中断系统也不会影响系统正常运行修改OS_CPU_C. C文件1. 初始化系统时钟:操作系统tick时钟我使用了 51单片机的T0定时器,它的初始化代码可 参考任哲书上关于时钟初始化的文件2. 编写10个与操作体系有关的钩子函数3. 修改任务堆栈初始化函数OSTaskStklnitOuC/OS-II中每个任务都有自己的堆栈空间, 并且必须声明为0S_STK类型,主要完成对用户任务的堆栈进行初始化OSTaskStklnit函 数总是返回用户栈最低地址4. 最后还有儿点必须注意的事项•本来原则上我们不用修改与处理器无关的代码但是由 于KEII.编译器的特殊性,这些代码仍要多处改动.因为KETI,缺省情况下编译的代码不可重 入,而多任务系统要求并发操作导致重入,所以要在每个C函数及其声明示标注reentrant 关键字•另外,“pdat『,\lata/z在uCOS中用做一些函数的形参,但它同时又是KEIL的关键 字,会导致编译错误,我通过把/zpdataz/改成〃ppdat『,〃血改成〃dddt$解决了此问题。

重写 OS CPU A. ASMA51宏汇编的大致结构如下:NAME模块名;与文件名无关;定义重定位段必须按照C51格式定义,汇编遵守C51规范.段名格式为:PR函数名模块 名;声明引用全局变量和外部子程序注意关键字为"EXTRN"没有'E'全局变量名直接引用无参数/无寄存器参数函数FUNC带寄存器参数函数_FUNC重入函数_ FUNC;分配堆栈空间uC/OS-II移植实例要求用户编写4个简单汇编语言函数:OSStartHighRdy 〃使就绪态任务中优先级最高的任务开始运行OSCtxSw //低优先级任务切换到高优先级任务OSTickTSR //时钟节拍中断OSTntCtxSw //在TSR中执行任务切换功能这四个函数汇编语言在任哲书上都有详细的讲解自己也只能了解一些简单的指令内容, 感兴趣的同学可以自己研究一下四•修改配置文件配置文件的修改需要根据用户的主函数内容进行配置,可以参考课木上关于移植文件的 裁剪所讲的内容在修改中需注意的是最大任务数最低为2,而最低优先级数应该比最大任务数大1,为 空闲任务留的五.移植的正确性验证创建两个任务Taskl和Task2,验证OSTaskStklnit和OSStartHighRdyO函数;创建Taskl和Task2后,通过二者Z间的切换,验证OSCtxSw函数。

测试主代码如下:#include"includes.hn#include"intrins.h"sbit dule = P2 A 6; //Ul锁存器的锁存端sbit wei = P2 A 7; //U2锁存器的锁存端INT8U num;INT8U aa;INT8U code table[]= {Ox3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};OS_STK Task 1 Stk[MaxStkSize]; //创建任务堆栈OS_STK Task2Stk[MaxStkSize];void Taskl(void* ddata) reentrant{ddata = ddata;wei=l; 〃打开U2锁存端P0=0xfe; 〃送入位选信号wei=0; 〃关闭U2锁存端while (1){for(num=0;num< 10;num++){dule=l; 〃打开Ul锁存端P0=table[num]; //送入段选信号dule=0; 〃关闭Ul锁存端OSTimeDly(50);void Task2(void* ddata) reentrantddata = ddata; aa=()xfe;while(l){P1 =aa;OSTimeDly(30);aa=_crol_(aa, 1);void main(void){OSInit();InitTimerO();OSTaskCreate(Taskl, (void *) 0, &TasklStk[O], 1);OSTaskCreate(Task2, (void *) 0, &Task2Stk[0], 0);}1. 刚开始仿真时在kell中建立的文件名需和文件的存盘名一致,否侧仿真出现错误。

2. 在测试主代码中用到与配置文件有关的函数,尽量配置一样比如这里用到两个任务, 如果在配置文件中设置最大任务数为5,虽然不会出现错误,但会有警告产生3. 两个任务的延迟时间也要相匹配,否侧实物仿真不正确4. 在输出HEX文件时,Memory Modle和Code Rom Size选项应为大端模式,uC0S_II. C 文件的选项Properties下Generate Assembler SRC File选项应选上,嵌入汇编5. 一切设置完成示就可以编译烧到单片机上了,这里我用的是STCA0C9852单片机把HEX 格式的文件烧到单片机后在实验板上运行,可以看到实验板上的流水灯轮流亮,这是任务2 的主要内容,在编写任务2时,调用了一个循环左移的函数intrins.ho同时可以看到第一个 数码管依次循环显示数字0・-9,这主要通过任务1的主函数实现的,先通过U2锁存器送位 选信号再通过U1锁存器送段选信号通过这两个简单任务的运行可以验证移植示的系统是可以运行的在最示的验证过程 中我试过建立三个任务来运行,在这两个任务的基础上再添加一个蜂鸣器的任务三,编译没 有错误,但是烧到单片机上运行时出现错误,这三个任务相互Z间不能正常运行。

再调节务 个任务Z间的延时时间后可以实现蜂鸣器和数码管的正常运行,但是流水灯不能正常运行 可能这三个任务Z间在占•用CPU的时间上用冲突,需要调节他们Z间的时间关系来实现三 个任务的正常运行以上就是这次在移植过程中遇到的一些问题和自己的想法。

下载提示
相似文档
正为您匹配相似的精品文档