这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » ucosii,for,51,V2,52 一步一步移植ucosii(for 51,

共2条 1/1 1 跳转至

ucosii,for,51,V2,52 一步一步移植ucosii(for 51,V2.52版本)

院士
2006-09-17 18:14:16     打赏
ucosii,for,51,V2,52 一步一步移植ucosii(for 51,V2.52版本)



关键词: ucosii     一步     移植     V2.52     版本    

院士
2006-12-22 22:43:00     打赏
2楼
问     移植ucosii并不是一件很复杂的事情,主要是需要了解操作系统的工作原理,归根结底就是堆寨的处理和任务的切换,《嵌入式实时操作系统uC/OS-II(第二版)》上有对移植很关键的解析,Keil目录下的A51.pdf C51.pdf也会对移植提供非常有效的信息。另外,建议使用的察看/编辑软件是Source Insight,没有Source Insight得支持我简直不知道如何把ucos Lwip等程序看完。以下是修改的部分:

    1.将所有文件中的与C51编译器冲突的关键词pdata替换为ppdata
    2.修改OS_CPU.H文件,
        a.  OS_CPU.H文件中添加了以下语句
            #ifdef __C51__
            #define OS_REENTRANT reentrant
            #else
            #define OS_REENTRANT
            #endif
        b.  修改数据类型
                //详见C51.PDF第176页
                typedef unsigned char  BOOLEAN;       //结构体里无法使用bit类型
                typedef unsigned char  INT8U;         //无符号8位数
                typedef signed   char  INT8S;         //有符号8位数
                typedef unsigned int   INT16U;        //无符号16位数
                typedef signed   int   INT16S;        //有符号16位数
                typedef unsigned long  INT32U;        //无符号32位数
                typedef signed   long  INT32S;        //有符号32位数
                typedef float          FP32;          //单精度浮点数
                typedef double         FP64;          //双精度浮点数
                
                typedef unsigned char  OS_STK;        //栈单元宽度为8比特
                typedef unsigned char  OS_CPU_SR;     
                
                #define BYTE           INT8S          //兼容以前版本的数据类型
                #define UBYTE          INT8U          //uC/OS-II可以不用这些数据类型
                #define WORD           INT16S
                #define UWORD          INT16U
                #define LONG           INT32S
                #define ULONG          INT32U
        c.  修改中断宏定义,以及堆寨方向
                #define  OS_CRITICAL_METHOD    1

                #if      OS_CRITICAL_METHOD == 1
                #define  OS_ENTER_CRITICAL()  EA=0    //关中断
                #define  OS_EXIT_CRITICAL()   EA=1    //开中断
                #endif
                
                #define  OS_STK_GROWTH    0           //MCU-51堆栈从下往上增长  1=向下,0=向上
    3.除函数OSStartHighRdy(),OSCtxSw(),OSIntCtxSw(),OSTickInit(),OSTickISR(),以外其他函数均使用OS_REENTRANT定义为可重入函数.另外函数OSTaskStkInit(),OSTaskCreate(),OSTaskCreateExt(),传递的参数中含有函数指针,必须定义为可重入函数的函数指针.
        例如修改之前的OSTaskStkInit()函数是,
        OS_STK *OSTaskStkInit (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT16U opt);
        修改之后的OSTaskStkInit()函数是,
        OS_STK *OSTaskStkInit (void (*task)(void *pd) OS_REENTRANT, void *ppdata, OS_STK *ptos, INT16U opt) OS_REENTRANT;
    4.因为变量OSTCBCur,OSTCBHighRdy,OSRunning,OSPrioCur,OSPrioHighRdy比较常用,所以定义为idata空间,因而在汇编程序中调用的时候需要使用相应的调用方式。
    5.必须在StartUp.a51文件中做好Reentrant Stack(可重入函数堆寨)的初始化工作.否则工作不正常.
        XBPSTACK        EQU     1       ; set to 1 if large reentrant is used.
    6.编写函数OSStartHighRdy(),OSCtxSw(),OSIntCtxSw(),OSTickInit(),OSTickISR(),OSTaskStkInit(),需要根据《嵌入式实时操作系统uC/OS-II(第二版)》提供的思想进行,具体的解析在我的程序中有说明。
    7.定时器的开启理论上必须放在第一个进程,但是因为首次全局中断的开启是在OSStartHighRdy()函数中的,实际上定时器是否开启并不会产生不可预知的中断,所以测试函数中定时器在系统初始化之前就已经开启,实践证明,并没有出现不可预知情况.
    8.尊重杨屹先生的建议,定义每个进程的虚拟堆寨大小为固定的宏定义值MaxStkSize,包括空闲进程和统计进程.
    9.定时器的定时时间必须与宏定义OS_TICKS_PER_SEC一致.
    10.必须注意非可重入函数的使用,特别是printf()等函数,这些函数很容易造成系统溢出.
参考文献、资料、网站:
    1.嵌入式实时操作系统uC/OS-II(第二版),Jean J.Labrosse著,邵贝贝译,北京航空航天出版社
    2.基于单片机8051嵌入式开发指南,胡大可等著,电子工业出版社
    3.www.zlgmcu.com
    4.www.21ic.com
    5.杨屹先生早前移植的版本
    6.Keil C51 的技术手册,"\keil\c51\hlp\"目录下

                                          高伟能 2004-10-20
下载修改之后的文件:http://www.21icsearch.com/buzi/upimage/upfile/20051201424130.pdf(下载之后将后缀pdf改为rar) 1: 强!顶一下。 2: 顶

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]