uC/OS-II在传统51单片机上的移植

一蜉蝣 2012-10-14 02:03:48
加精
前段时间买了嵌入式实时操作系统uC/OS-II(第二版)这本书 认真的看了三周,因为之前没有学过操作系统的相关课程,刚开始的时候有点吃力,好在是坚持下来了,感觉学到了不少的东西。就想着自己也移植着试试看。之前学习51单片机的时候认真听课了。感觉51学的还可以,就试着往51上移植。国庆放假来后这一周的时间终于移植成功了。
或许不能说是成功了,因为没有真正的把生成的HEX文件下到单片机上运行。只是刚才调试的时候启动多任务成功。多任务切换成功。至于中断级的任务切换,没有调试。89C52只有256B的RAM,实在是少的可怜。也不想再试了。
把自己这几天调试的过程记录下来。
下面先把移植有关的源文件贴上来
OS_CPU.H
/*
*******************************************************************************
*
* 数据类型定义(与编译器有关,可查看编译器的帮助文档得到相应的数据类型)
*
*******************************************************************************
*/
typedef unsigned char BOOLEAN;
typedef unsigned char INT8U; //8位无符号整数
typedef signed char INT8S; //8位有符号整数
typedef unsigned short int INT16U; //16位无符号整数
typedef signed short int INT16S; //16位有符号整数
typedef unsigned long int INT32U; //32位无符号整数
typedef signed long int INT32S; //32位有符号整数


typedef unsigned char OS_STK; //堆栈宽度定义为8位
typedef unsigned char OS_CPU_SR; //定义程序状态字位8位

/*
*******************************************************************************
*
* 与具体的处理器有关的代码
*
*******************************************************************************
*/

#define OS_CRITICAL_METHOD 1

#if OS_CRITICAL_METHOD==1
#define OS_ENTER_CRITICAL() EA=0
#define OS_EXIT_CRITICAL() EA=1
#endif

#if OS_CRITICAL_METHOD==2
#define OS_ENTER_CRITICAL(); \
#pragma asm \
PUSH PSW; \
CLR EA; \
#pragma endasm
#define OS_EXIT_CRITICAL() \
#pragma asm \
POP PSW \
#pragma endasm
#endif

#if OS_CRITICAL_METHOD==3
#define OS_ENTER_CRITICAL(); \
cpu_sr=PSW; \
EA=0;
#define OS_EXIT_CRITICAL() \
PSW=cpu_sr
#endif

#define OS_STK_GROWTH 0 //定义堆栈的增长方向,0表示向上增长

#define OS_TASK_SW() OSCtxSw() //任务切换



...全文
17195 87 打赏 收藏 转发到动态 举报
写回复
用AI写文章
87 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_15079249 2014-10-06
  • 打赏
  • 举报
回复
头一次听说在51上移植的,倒是听说过在32上移植的
纯情的毛象 2014-09-21
  • 打赏
  • 举报
回复
看了好多遍还是闹不明白,哎,真丢人啊
wojiaolaicong 2014-09-17
  • 打赏
  • 举报
回复
多谢分享。。。
barney-ro 2014-09-11
  • 打赏
  • 举报
回复
好东西 ,有时间也实验一下。
haoziccy 2014-06-26
  • 打赏
  • 举报
回复
厉害 谢谢楼主的分享
图灵转世 2014-06-18
  • 打赏
  • 举报
回复
膜拜中,学习中。
dadalaohua 2014-06-16
  • 打赏
  • 举报
回复
看看,学习学习。谢谢楼主分享。
  • 打赏
  • 举报
回复
谢谢分享,敬仰楼主
李榕榕 2014-05-15
  • 打赏
  • 举报
回复
你要是学过OS,您就不向51移了,呵呵
消失的荒漠 2014-05-14
  • 打赏
  • 举报
回复
自己写底层代码移植uCos,才是真正了解了uCos乃至操作系统原理的精髓。呵呵! 不过,我弄的时候看的是uCos作者写的文档,源码和移植都有,感觉更原汁原味。
小黄人软件 2014-05-14
  • 打赏
  • 举报
回复
我早就弄过了。有源代码。
「已注销」 2014-02-18
  • 打赏
  • 举报
回复
引用 6 楼 yifuyou 的回复:
在网上找了别人移植到51上的文章 说是任务切换的最后只能用RETI指令 但是我发现RETI和RET都能切换
请问我在keil上运行你的代码,为什么头文件找不到,比如<sys/types.h><sys/socket.h> ? 网上也找不到,怎么办
blue_sky_man 2013-11-08
  • 打赏
  • 举报
回复
顶一下,好帖!!!!!!!!!!!学到东西了
u010218295 2013-11-04
  • 打赏
  • 举报
回复
有看沒有懂...
zhujinqiang 2013-10-22
  • 打赏
  • 举报
回复
引用 6 楼 yifuyou 的回复:
在网上找了别人移植到51上的文章 说是任务切换的最后只能用RETI指令 但是我发现RETI和RET都能切换
to 楼主。 因为MCS-51没有软中断指令,所以移植UcOSII时候是用程序调用代替。两者的堆栈格式相同,RETI指令复位中断系统,RET则没有。实践表明,对于MCS-51,用子 程序调用入栈,用中断返回指令RETI出栈是没有问题的,反之中断入栈RET出栈则不行。总之,对于入栈,子程序调用与中断调用效果是一样的,可以混用。 在没有中断发生的情况下复位中断系统也不会影响系统正常运行。详见《uC/OS-II》第八章193页第12行 所以关中断的情况下,RET出栈应该可以的。
兴风作浪的梦 2013-10-10
  • 打赏
  • 举报
回复
mark study the idea
huzi741 2013-10-10
  • 打赏
  • 举报
回复
真的不错好好学习学习饿
LINUX-ROS 2013-10-08
  • 打赏
  • 举报
回复
要写这么多 汇编代码吗?
Anennzxq 2013-09-11
  • 打赏
  • 举报
回复
楼主,能否麻烦你发份程序给我,先谢谢了,邮箱:1050729377@qq.com
奮闘ing 2013-08-02
  • 打赏
  • 举报
回复
不错,我之前也试过。你可以只是两三个任务的切换,这样就不会觉得麻烦了
加载更多回复(59)

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧