共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电子工程师创研计划】技术变现通道已开启~ | |
发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
【EEPW在线】E起听工程师的声音! | |
“我踩过的那些坑”主题活动——第001期 | |
高校联络员开始招募啦!有惊喜!! | |
【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
送您一块开发板,2025年“我要开发板活动”又开始了! | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
多组DCTODC电源方案被打赏50分 | |
【我踩过的那些坑】STM32cubeMX软件的使用过程中的“坑”被打赏50分 | |
新手必看!C语言精华知识:表驱动法被打赏50分 | |
【我踩过的那些坑】杜绑线问题被打赏50分 | |
【我踩过的那些坑】STM32的硬件通讯调试过程的“坑”被打赏50分 | |
【我踩过的那些坑】晶振使用的问题被打赏100分 | |
【我踩过的那些坑】电感选型错误导致的处理器连接不上被打赏50分 | |
【我踩过的那些坑】工作那些年踩过的记忆深刻的坑被打赏10分 | |
【我踩过的那些坑】DRC使用位置错误导致的问题被打赏100分 | |
我踩过的那些坑之混合OTL功放与落地音箱被打赏50分 |