专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

我在51上移植ucosii的心得,希望能给朋友起到点点作用

作者:佚名   来源:本站原创   点击数:  更新时间:2014年09月01日   【字体:

  自嵌进式系统开发以来,很长时间都采用前后台系统软件设计模式:主程序为一个无穷循环,单任务顺序执行。通过设置一个或多个中断来处理异步事件。

  这种系统对于简单的应用是可以的,但对于实时性要求比较高的、处理任务较多的应用,就会暴露出实时性差、系统可靠性低、稳定性差等缺点。

   μC/OS-II 是一种基于优先级的抢占式多 任务实时操纵系统,包含了实时内核、任务治理、时间治理、任务间通讯同步(信号量,邮箱,消息队列)和内存治理等功能。它可以使各个任务独立工作,互不干 涉,很轻易实现准时而且无误执行,使实时应用程序的设计和扩展变得轻易,使应用程序的设计过程大为减化。而且它内核源代码公然,可移植性强,为编程职员提 供了很好的一个软件平台。通过μC/OS-II在VRS51 上的移植,可以把握移植和测试μC/OS-II 的实质内容,很轻易将其移植到其它的CPU平台上。

  μC/OS-II 先容

  μC /OS-II是一个完整的、可移植、可固化、可裁剪的占先式实时多任务内核。μC/OS-II尽大部分的代码是用ANSI的C语言编写的,包含一小部分汇 编代码,使之可供不同架构的微处理器使用。至今,从8位到*位,μC/OS-II已在超过40种不同架构上的微处理器上运行。μC/OS-II已经在世界 范围内得到广泛应用,包括很 多领域, 如手机、路由器、集线器、不中断电源、飞行器、医疗设备及产业控制 上。实际上,μC/OS-II已经通过了非常严格的 测试,并且得到了美国航空治理局(Federal Aviation AdminiSTration)的认证,可以用在飞行器上。这说明μC/OS-II是稳定可靠的,可用于与人性命攸关的安全紧要(safety critical)系统。除此以外,μC/OS-II 的鲜明特点就是源码公然,便于移植和维护。

  μC/OS-II 内核结构

   多任务系统中,内核负责治理各个任务 ,或者说为每个任务分配CPU 时间 ,并且负责任务之间的通讯。内核提供的基本服务是任务切换。 μC/OS-II可以治理多达64个任务。由于它的作者占用和保存了8个任务,所以留给用户应用程序最多可有56个任务。赋予各个任务的优先级必须是不相 同的。这意味着μC/OS-II不支持时间片轮转调度法 (round-robin scheduli ng)。μC/OS-II为每个任务设置独立的 堆栈空间,可以快速实现任务切换。μC/OS-II近似地每时每刻总是让优先级最高的停当任务处于运行状态,为了保证这一点,它在调用系统API 函数、中断结束、定时中断结束时总是执行调度算法,μC/OS-II通过事先计算好数据简化了运算量,通过精心设计停当表结构使得延时可预知。

  μC/OS-II 的移植

   移植就是使μC/OS-II能在VRS51上运行。为了方便移植,大部分的μC/OS-II的代码是用C语言编写的;但是仍需要用C语言和汇编语言编写 一些处理器硬件相关的代码,这是由于μC/OS-II在读/写处理器寄存器时,只能通过汇编语言来实现。由于μC/OS-II在设计时就已经充分考虑了可 移植性,所以μC/OS-II的移植相对来说是比较轻易的。

  硬件平台构成

  由于VRS51是一款80C51微控制器,片内包含了64KB的FLASH程序存储器,并且支持串行在线编程(ISP)。使它在ROM 空间上很适合做μC/OS-II的移植。

  编译器的选择

   由于μC/OS-II尽大部分代码是用标准的C语言编写的,所以C语言开发工具对于μC/OS-II是必不可少的。由于μC/OS-II是一个可剥夺行 的占先式内核,所以要求C编译器可以产生可重进型代码。笔者选择Keil C51集成开发环境作为开发工具。该开发工具有C编译器,汇编器和链接定位器等工具构成。链接器用来将不同模块(编译过或汇编过的文件)链接成目标文件, 定位器则答应将代码和数据放置在目标处理器的指定内存中。Keil C51 还可以天生HEX格式的编程文件用于编程EPROM或是FLASH,同时可以实现完整软件仿真支持。Keil C51支持所有8051变种的微控制器。通过设置编译控制选项,它完全可以满足编译μC/OS-II源代码的要求。

  可重进函数题目

   可重进函数可以被一个以上的任务调用,而不必担心数据被破坏。可重进函数任何时候都可以被中断,一段时间后又可以继续运行,而相应的数据不会丢失。由于 μC/OS-II是抢占式的实时多任务内核,同一个函数可能会被不同的任务调用,也可能会被中断,因此,移植μC/OS-II要求C语言编译器可以产生可 重进函数。但是正常情况下Keil C51编译器中的函数不能重进。原因是由于8051系列微控制器的硬件堆栈很小,硬件堆栈指针SP最多只能在内部256字节的RAM内移动,不能够指向 64K的外部RA M空间。所以编译器使用固定的RAM地址来存储函数的参数和局部变量,而不是使用堆栈来存储。为了在Keil C51中实现可重进函数,可以使用“reentrant”关键字声明该函数是可重进的。编译器可根据编译模式为可重进函数在内部RAM或外部RAM空间开 辟一个模拟堆栈来存储可重进函数的参数和局部变量。可重进函数的返回地址仍然保存在硬件堆栈中。Cx51编译手册不推荐使用模拟堆栈,原因是受8051寻 址方式的限制,模拟堆栈访问的效率很低。但是这是在Keil C51中实现可重进函数的唯一方法。可重进函数模拟堆栈拥有独立于硬件堆栈指针的模拟堆栈指针。模拟堆栈及其指针在启动代码文件 “STARTUP.A51”中定义和初始化。

  μC/OS-II源文件移植

  在了解了P89V51RD2微处理器和Keil C51 编译器的技术细节的基础上,就可以开始μC/OS-II源文件移植的工作了。真正编写移植代码的工作就相对比较简单了。

 
 
 
 
    我相信很多学习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和危险,对你的一切使用后果我概不负责。
我扩展我的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非常适合控制类程序.
 
 
 

 

关闭窗口