电子大神的日记本,供应链专家的功夫茶盘,在这里记录、分享与共鸣。

登录以开始

UC/OS-II简介

在嵌入式应用系统的设计中,实时操作系统的应用越来越受到重视。目前市场上可以选择的实时操作系统很多,一些商用系统为用户提供了非常丰富的功能,不仅包括实时内核,同时还包括输入输出管理、文件系统、网络、调试软件等。但是对于中小型的嵌入式应用系统来说,商用实时操作系统的成本太高,所以采用免费软件是最好的选择。uC/OS-Ⅱ是一个免费的源代码公开的实时嵌入式内核,它提供了实时系统所需的基本功能。其包含全部功能的核心部分代码只占用8.3K字节,而且由于uC/OS-Ⅱ是可裁剪的,所以用户系统中实际的代码最少可达2.7K字节,可谓短小精悍。uC/OS-Ⅱ不仅使用户得到廉价的解决方案,而且由于uC/OS-Ⅱ的开源特性,用户还可以针对自己的硬件优化代码,以获得更好的性能。

      uC/OS-Ⅱ实际上是一个实时操作系统内核,只包含了任务调度、任务管理、时间管理、内存管理和任务间的通信与同步等基本功能。没有提供输入输出管理、文件系统、网络之类的额外服务。但是由于uC/OS-Ⅱ的可移植性和开源性,用户可以自己添加所需的各种服务。目前,已经出现了第三方为uC/OS-Ⅱ开发的文件系统、TCP/IP协议栈、用户显示接口等。

      uC/OS-Ⅱ的任务调度是按抢占式多任务系统设计的,即它总是执行处于就绪条件下优先级最高的任务。为了简化系统的设计,uC/OS-Ⅱ规定所有任务的优先级必须不同,任务的优先级同时也唯一地标识了该任务。即使两个任务的重要性是相同的,它们也必须有优先级上的差异,这也就意味着高优先级的任务在处理完成后必须进入等待或挂起状态,否则低优先级的任务永远也不可能执行。系统通过两种方法进行任务调度:一是时钟节拍或其它硬件中断到来后,系统会调用函数OSIntCtxSw()执行切换功能;二是任务主动进入挂起或等待状态,这时系统通过发软中断命令或依靠处理器执行陷阱指令来完成任务切换,中断服务例程或陷阱处理程序的向量地址必须指向函数OSCtxSw()。

      uC/OS-Ⅱ最多可以管理64个任务,这些任务通常都是一个无限循环的函数。在目前的版本中,作者保留了优先级为0、1、2、3、OS_LOWEST_PRIO-3、OS_LOWEST_PRIO-2、OS_LOWEST_PRIO-1、OS_LOWEST_PRIO的任务,所以用户可以同时拥有56个任务。uC/OS-Ⅱ提供了任务管理的各种函数调用,包括创建任务、删除任务、改变任务的优先级、挂起和恢复任务等。系统初始化时会自动产生两个任务:一是空闲任务OSTaskIdle(),它的优先级最低为OS_LOWEST_PRIO,该任务只是不停地给一个32位的整型变量加一;另一个是统计任务OSTaskStat(),它的优先级为OS_LOWEST_PRIO-1,该任务每秒运行一次,负责计算当前CPU的利用率。

      uC/OS-Ⅱ要求用户提供一个称为时钟节拍的定时中断,该中断每秒发生10至100次,时钟节拍的实际频率是由用户控制的。任务申请延时或超时控制的计时基准就是该时钟节拍。该时钟节拍同时还是任务调度的时间基准。uC/OS-Ⅱ提供了与时钟节拍相关的系统服务,允许任务延时一定数量的时钟节拍或按时、分、秒、毫秒进行延时。

      对于一个多任务操作系统来说,任务间的通信与同步是必不可少的。uC/OS-Ⅱ提供了四种同步对象,分别是信号量、邮箱、消息队列和事件。通过邮箱和消息队列还可以进行任务间的通信。所有的同步对象都有相应的创建、等待、发送的函数。但这些对象一旦创建就不能删除,所以要避免创建过多的同步对象以节约系统资源。

      为了消除多次动态分配与释放内存所引起的内存碎片,uC/OS-Ⅱ把连续的大块内存按分区来管理。每个分区中都包含整数个大小相同的内存块,但不同分区之间内存块的大小可以不同。用户需要动态分配内存时,选择一个适当的分区,按块来分配内存。释放内存时将该块放回它以前所属的分区。这样,就能有效解决内存碎片的问题。

      uC/OS-Ⅱ的大部分代码是用ANSI C写成的,只有与处理器硬件相关的一部分代码用汇编语言编写。所以uC/OS-Ⅱ的移植性很强,可以在绝大多数8位、16位、32位微处理器、数字信号处理器上运行。uC/OS-Ⅱ的移植并不复杂,只要编写4个汇编语言的函数、6个C函数再定义3个宏和1个常量,这些宏和函数都非常简单,其中的5个C函数甚至只需声明不必包含代码。用户可以根据需要自己编写移植代码。uC/OS-Ⅱ的网站上(www.uCOS-II.com)有针对不同微处理器的移植代码可供下载。目前网站上提供的移植实例包括Intel公司的80x86、8051、80196等,Motorola公司的PowerPC、68K、CPU32等,TI公司的TMS320系列,Zilog公司的z-80、z-180,还包括Analog Device公司、ARM公司、日立公司、三菱公司、飞利浦公司和西门子公司的各种微处理器。

      uC/OS-Ⅱ是在PC机上开发的,C编译器使用的是Borland C/C++ 3.1版,而且PC机是大家最熟悉的开发环境,所以在PC机上学习和使用uC/OS-Ⅱ是非常方便的。uC/OS-Ⅱ的网站上也提供了在PC机上运行uC/OS-Ⅱ的源代码。但是由于C/C++运行库和DOS本身的限制,在PC上运行uC/OS-Ⅱ时需要注意两个问题。

      第一,由于DOS下的C编译器提供的运行库没有考虑多线程应用的问题,运行库中的全局变量和部分函数只适用于单线程。这些变量和函数包括:errno、_doserrno、strtok、strerror、tmpnam、tmpfile、asctime、gmtime、ecvt、fcvt等。在uC/OS-Ⅱ中使用这些函数时要小心,要避免两个任务同时调用这些函数,或者用信号量同步对这些函数的调用。

      第二,DOS是不能重入的,就是说正在调用DOS服务期间,是不能再次调用DOS的,如果又进行了DOS调用,那么肯定会引起系统崩溃。uC/OS-Ⅱ启动多任务后,如果两个以上的任务进行了DOS调用或者调用了需要DOS的C/C++运行库(如:printf、scanf等等),就有可能引起DOS重入。所以在uC/OS-Ⅱ中,可以调用BIOS或直接操纵硬件,但要尽量减少DOS调用。如果必须要用DOS,最好只有一个调用DOS的任务,或者用信号量进行同步。.

      uC/OS-Ⅱ作为一个源代码公开的实时嵌入式内核,对我们学习和使用实时操作系统提供了极大的帮助。而uC/OS-Ⅱ自身也因此获得了快速的发展,许多开发者已经成功地把uC/OS-Ⅱ应用于自己的系统之中。随着uC/OS-Ⅱ的不断完善,它必将会有更加广阔的应用空间。

博主
810980411@qq.com
HXHNTTXLLA's Blog
梦想从这里起飞--AVR/ NIOS II  / FPAG / 51。。。这些文章都是我整理出来的 有什么错误请大家帮忙指正。。。
点击跳转