|
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统 驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe |
我在51上移植ucosii的心得,希望能给朋友起到点点作用 |
作者:01dxwlm 栏目:嵌入式系统 |
我相信很多学习RTOS的朋友也和我一样,能够掌握一个外面比较流行的RTOS;拥有一个属于自己的RTOS。我没有学习过操作系统的课程,我对计算机操作系统一点也不熟悉,所以我开始学习rtos没有选择linux而是选择了比较简单的ucosii.我上班的时候学习时间还是比较多的,我在网上下载了邵贝贝翻译的译本介绍ucosii的电子书,看了好几片吧,把ucosii的原理弄清楚了,就想能在51上移植一下,一是加深对ucosii的理解,二是学习移植ucosii的方法。下面就详细介绍我在51下的移植方法。 一.确定编译模式 由于mcs-51芯片RAM太小,不可能不扩展外部RAM,反正是要扩展外部RAM所以我选择在大模式下编译,这样做有2个好处:1).不要修改原内核中ucosii.h这个文件。2.不要管数据的存取类型。 二.选择ucosii的版本 ucosii的版本现在有很多了,在我手里的就有2.00,2.52,2.76这三个版本,选择合适的版本很重要,我是选择了2.52这个版本,因为2.00比较老了,我就不说了,2.76我看了下文件结构好象和外面的资料讲的不一样,而2.52的资料到处都是,更重要的是网上有很多移植的资料。 三.处理OS_CFG.h文件 在开始移植时尽量把这个文件中多设置几个0,因为编译的代码越少出错的机会就少,当然要足够了解这个文件中的每个宏的意义。 四.编写OS_CPU.h和includes.h文件 这个我就不多说了,随便找个这样的文件改两下就可以了。 五.编写OS_CPU.C和OS_CPU_A.asm文件 我是这么来做的,我首先在OS_CPU.C和OS_CPU_A.asm文件中写上需要的几个函数,但全部是空函数,这样在编译的时候就不会报错了。 六.把整个项目统一管理起来 在做好上面的准备工作后,把文件按照书上的说明和其他的例子统一管理起来,然后就编译了,也许在这个时候还会有错误,不要紧,根据你对ucosii的理解一个一个到把他排除,我在做的时候在这个地方也出了错,我后来没有用ucosii.c这个文件了,我直接在工程中把ucosii.c中列出的文件加上去。 在这个时候可以写两个简单的任务去测试程序,并软件反真一下,看程序是否会跑到你想要的地方去。 七.编写需要的函数 如果上面在第6步编译的时候再也没有错误和警告了,那么说恭喜你了,你已经成功一半了,你只要写少量的代码和修改一点点原内核就大功告成了。 总结: 移植ucosii到51上也不是一件容易的事情,如何使你的程序跑的快和占用资源少是关键,我在51上的移植我只是我学习ucosii而已,给大家也只是想起个抛砖引玉的作用,希望能给想学ucosii的和正在想移植ucosii的朋友提供一点点参考的作用。我在移植完ucosii后自己也开始写一个小的rtos,我的目标是能在小的RAM的单片机上运行,现在已经完成了,我习惯模组化程序设计,虽然我这个小的RTOS只能管理8个模块,每个模块16个事件,但对我来说基本够了,我认为更重要的一点是,我的rtos能自动调整每个模块运行时间,换句话说哪个模块任务更重,则这个模块的运行时间就会更多。现在我也把我做的这个rtos成功地移植到了MOTOROLA MCU MC68HC908GP32上,感觉效果还不错的。 我愿意把我移植的ucosii和我自己的rtos共享给大家,我是给大家交流的,请大家也不要把他用到商业上,因为这有很多潜在的bug和危险,对你的一切使用后果我概不负责。 EMAL:smalf@sina.com. QQ: 11830067 (请表明是 rtos) |
2楼: | >>参与讨论 |
作者: saint_bxg 于 2006/7/27 18:49:00 发布:
谢谢! 正学ucosii呢,也想自己买块板子做一下移植。 有了楼主的心得。呵呵~~ |
3楼: | >>参与讨论 |
作者: 01dxwlm 于 2006/7/30 17:34:00 发布:
我扩展我的rots功能了. 现在我这个小的RTOS能管理36个任务,其中4个保留,1个空闲任务,还剩下31个可用,每个任务能管理16个事件,现在我也把我做的这个rtos成功地移植到了一个16位cpu上,其中这个项目上程序代码超过3万行,产品以经卖到了美国,在下一个产品将卖到德国和日本了。从开始量产到现在还没有出现过由于是rtos而引起bug,感觉效果很不错的了。 其中任务程序形式为 void Task(void) { INT16U wEvent; for(; ;) { wEvent = OSEventPend(); // 如果有事件则执行下面的程序,没有则任务切换. if(wEvent &(1<<TASKTM)) // 对应发生的时间事件 { // do something } if(wEvent &(1<<X)) //对应其他事件 { // do something } }我的这个rtos非常适合控制类程序. |
4楼: | >>参与讨论 |
作者: Sureal 于 2006/8/26 13:13:00 发布:
羡慕ing |
|
|
Copyright © 1998-2006 domainnameq.cn 浙ICP证030469号 |