分析μC/OS的应用及扩展

时间:2011-09-05

  一、 概述

  近年来,随着微控制器性能的不断提高,嵌入式应用越来越广泛。目前源码开放(C代码)的嵌入式系统有μC/OS的uCLinux。uC/OS是由EAN J.LABROSSE个人开发的嵌入式操作系统。该系统是一个源代码完全公开的实时内核,设计人员在应用过程中可以按照自己的需求对内核进行裁减和扩展,以满足不同工程对应用软件设计的要求。uC/OS是完全占先式的实时内核,支持多任务操作,并且每个任务都有自己单独的栈,这样就清晰了任务之间的界限,增强了系统的稳定性。uC/OS还提供了很多的系统服务,例如邮箱、消息队列、信号量、块大小固定的内存的申请和释放、时间函数等,并且还支持多达255层的中断嵌套。利用这些系统服务就能轻而易举的完成复杂逻辑的要求,从而缩短系统开发的周期,降低开发的成本。同时uC/OS良好的可扩展性和可移植性,使其能够广泛的应用到各种架构的微处理器上。这里,笔者在ColdFire硬件平台上运行了μC/OS的,实现了uCLinux的文件系统,使得在嵌入式应用中可以进行文件操作。

  二、 硬件平台

  本系统的硬件平台采用GPFC(General Purpose Fieldbus Controller)数据采集系统。该系统是由德国汉堡国家同步辐射实验实(DESY)Dr.Matthias Clausen领导的研究小组开发,采用Motorola公司的ColdFire MCF5206处理器为。ColdFire MCF5206处理器属于Motorola 32位MCU家族,在源码上与68K系列兼容。全静态设计,在33MHz的工作频率下可达17MIPS的处理能力。除了具有68K系统的通用功能模块外,片内还带有DRAM控制模块,可以直接外接DRAM芯片。由于ColdFire将片选逻辑电路总线控制器、DRAM控制模块等全部集成在MCU内部,使得外围电路变得十分简单。

  三、 软件设计

  本系统的软件采用μC/OS为嵌入式平台。在应用中切实感到了开放源代码的无可替代的优点。首先是可以根据自己的需要对源代码进行取舍,去掉不需要的变量和不使用的函数,甚至可以根据需要改写相关函数。在μC/OS的源代码中,函数执行中有许多条件判断,作用是防止参数的错误传递。作为通用系统,这些条件判断是完全必要的,避免出现错误时系统崩溃。但作为具体的应用,只要在程序设计时保证参数传递的正确性,完全可以不用条件判断,就能提高函数的执行速度,尤其一些频繁调用的函数,或当MCU速率不高的时候,重写部分函数往往可以显着提高系统性能。另外,由于用户对系统有源码级的了解,可以添加自己编写的模块,与原系统兼容,使系统具有可扩展性。

  正是由于μC/OS的可扩展性,笔者将uCLinux的RAM盘、文件系统和用户Shell移植到了μC/OS上,在用户程序中可以进行文件操作,文件系统可以为任务保存数据,并提供了统一的接口函数。用户编制的单个任务也可以保存在RAM盘上,可以在终端上用命令方式执行运行、监控、删除任务。

  四、 文件系统

  uCLinux的文件系统与Linux的基本相同,文件以树型目录组织。由于篇幅所限,关于文件系统的细节,读者可参考Linux和Unix的相关资料,本例中将RAM中高端的1M分配给文件系统,建立了容量为1M的RAM盘。UCLinux的文件系统由逻辑块组成,如果是磁盘文件系统,对应为磁盘块;RAM盘则对应为内存块,每个块为512字节。一个标准的逻辑盘划分成几个部分:引导块、超级块、索引节点区和数据区。

引导块 超级块 索引节点区 数据区

  引导块 超级块 索引节点区 数据区

  引导块在文件系统的开头,通常为一个逻辑块、存放引导程序,用于启动和引导操作系统。在我们的RAM文件系统中由于不需要RAM盘引导,所以不分配引导块。超级块记录文件系统当前状态,盘有多大,能存放多少文件,何处可以找到空闲空间和用于文件系统管理的信息。索引节点区紧接在超级块后面,存放文件系统的索引节点表。在文件系统中每一个文件(包含目录)占据一个索引节点表项。索引节点是一个记录文件信息的数据结构:

  struct dinode{

  short di-mode;

  /*文件模式:是文件还是目录,是可读、可写还是可执行*/

  short di-nlink;

  /*和文件相关的链接数*/

  short di-uid;

  /*文件所有者的标示*/

  short di-gid;

  /*文件所有者的组标示*/

  long di-size; /*文件大小*/

  char di-addr[ ];

  /*文件数据所在的逻辑块编号*/

  time-t di-atime;

  /*文件访问的时间*/

  time-t di-mtime;

  /*文件修改的时间*/

  time-t di-ctime;

  /*文件建立的时间*/

  }

  其中的数组di-addr[ ]记录文件数据所在的逻辑块号。本例中RAM盘为1M,每个逻辑块512字节,共2048个逻辑块,所以每个逻辑块的编号要用两个字节表示。为了记录足够长的文件,di-addr[ ]中逻辑块可分为直接块和间接块。关于直接块和间接块的概念,请读者参考Linux的相关文档。分析索引节点可知,通过索引节点就可以完全确定一个文件。索引节点表中的项就是根目录。索引节点区的大小决定了文件系统中多能有多少个文件(包括目录)。

  添加了文件系统后,任务的运行将和文件相关,所以TCB(任务控制块)要做相应的修改。需要添加任务所在目录项和任务打开文件项。当一个任务调用OSTaskCreate创立新的任务的时候,子任务应该继承先前任务的目录项和任务打开文件项。

  五、 用户Shell

  用户Shell实际上是一个在μC/OS下独立运行的任务,处于的优先级。Shell启动后,进入睡眼状态,等待用户输入。由于Shell优先级为,新创建的任务将马上运行。新任务执行完后可以用OSTaskDel删除自己。如果在当前目录中找不到匹配项,则返回错误信息。

  由于μC/OS中的OSTaskCreate不能动态分配堆栈空间,OSTaskDel也能释放任务的堆栈空间。为了实现Shell的加载和删除任务的功能,笔者对上述两个函数进行了改写,添加了内存管理函数malloc()和mfree()。系统的内存资源由一个双向链表进行管理。在OSTaskCreate中调用malloc(),参数为希望分配的内存块数,malloc()将检索内存管理的双向链表,返回空闲块地址。而OSTaskDel中将调用mfree()释放内存,重新加入双向链表。为了避免内存空洞,在Shell中启动的任务采用相同大小的堆栈。

  通过用户Shell,单独的任务可以保存在RAM盘上,通过命令方式运行、监控,查看任务状态、删除任务,作为一种有力的开发和调试手段。

  六、 结语

  μC/OS的出现和应用也只是近年来的事,其迅猛的发展证明了开放源码软件的巨大生命力。相信经过广大用户的不断丰富和完善,μC/OS的功能将日趋成熟,应用也会更加广阔。



  
上一篇:S7-300与S7-200自由口无线通信实现方法
下一篇:浅谈兼容多波段射频上变频器设计原理

免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

相关技术资料