共2条
1/1 1 跳转至页
ucosii,for,51,V2,52 一步一步移植ucosii(for 51,V2.52版本)
问
移植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: 顶
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 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |