FreeRTOS 特性简介

来源:互联网 发布:单片机电压表设计论文 编辑:程序博客网 时间:2024/06/11 15:04

URL: http://blog.csdn.net/liyuanbhu/article/details/7911163

FreeRTOS 由 Richard Barry 开发,是一个开源的、可移植的、小型的嵌入式实时操作系统内核。FreeRTOS 既支持抢占式多任务,也支持协作式多任务。FreeRTOS的主要特性如下:

  1. 实时性:FreeRTOS “可以”配置成为一个硬(Hard)实时操作系统内核。要注意这里用的是“可以”,FreeRTOS 也可以配置为非实时型内核,甚至于部分任务是实时性的,部分不是。这一点比uC/OS-II 要灵活。
  2. 任务数量:FreeRTOS对任务数没有限制,同一优先级也可以有多个任务。这点上比uC/OS-II 好。
  3. 抢占式或协作式调度算法:任务调度既可以为抢占式也可以为协作式。采用协作式调度算法后,一个处于运行态任务除非主动要求任务切换(Yielding),否则是不会被调度出运行态的。
  4. 任务调度的时间点:调度器会在每次定时中断到来时决定任务调度,同时外部异步事件也会引起调度器任务调度。
  5. 调度算法:任务调度算法首先满足高优先级任务最先执行,当多于1个任务具有相同的高优先级时,采用round robin 算法调度。
  6. 任务间通信:FreeRTOS 支持队列和几种基本的任务同步机制。
    1. 队列:任务间传递信息可以采用队列方式,FreeRTOS 实现的队列机制传递信息是采用传值方式,因此对于传递大量数据效率有些低。但可以通过传递指针的方式提高效率。中断处理函数中读写队列都是非阻塞型的。任务中读写队列可以为阻塞型也可以配置非阻塞型。当配置为阻塞型时可以指定一个阻塞的最大时间限(Timeout)。
    2. 任务间同步:FreeRTOS 支持基本的信号量功能。FreeRTOS 采用队列来实现信号量的功能,可以认为一个值为n的信号量就是一个长度为n的队列,队列中每个元素的大小为0。这样的队列并不会浪费宝贵的内存空间。
    3. 对于死锁(Deadlock)的处理:FreeRTOS 并没有实现一种可以完全避免死锁的机制。只是通过指定一个阻塞的最大时间限(Timeout)来减少死锁现象的发生。或者说是给出了当死锁现象发生时解锁的可能。当然能不能真的解锁要依赖于使用者的处理代码是否合适。
    4. 临界区:FreeRTOS 采用开关中断的方式实现临界区保护。任务代码中临界区可以嵌套,FreeRTOS 会自动记录每个任务中临界区嵌套的层数。
    5. 暂停调度:与进入临界区类似,FreeRTOS 可以通过暂时关闭任务调度来保证任务代码不被更高优先级的其他任务打断,与临界区不同,关闭任务调度并不会关闭中断,这样中断处理函数仍会照常的执行。
    6. 内存分配:FreeRTOS 提供了多种内存动态分配的方法,具体程序中需要选择其中一种。最简单的内存分配方式提供了一种非常简单的固定内存分配算法,这种方式下只支持内存的分配,不支持分配内存的回收。因此,任务建立后就不能被删除。其他几种内存分配算法支持分配内存的回收,有的方法支持邻接内存块的合并,有些不支持。对我个人来说,我还是比较欣赏uC/OS-II中内存分配的方法,既保证了实时性,也具有一定的灵活性。FreeRTOS 中提供的几种方式,实时性好的功能上有缺陷,功能上完善的实时性却不好。我通常采用的方式是采用最简单的内存固定分配算法,当需要动态释放时将uC/OS-II中内存分配的代码拿来用。
    7. 优先级翻转:FreeRTOS 没有提供优先级继承机制或其他的避免优先级翻转的方法。
URL: http://blog.chinaunix.net/uid-11080268-id-2914865.html

小型的实时操作系统,开源的,能够应于多个硬件平台的,并不多!Ucos和FreeRTOS,其他的,一堆在某个硬件平台的,尤其是8位系统里面的一堆,就不说了!用起来,老说,没有太多必要---8位单片机本来就不适合使用操作系统,而操作系统最大的作用就是屏蔽底层,那就是最好能在多个硬件平台上使用才谈得上屏蔽底层!只在一个硬件平台上使用的,使用的时候不可不去了解底层,那就没多少价值了,等于每次开始都是从头开始!因此总觉的小型的操作系统,只有ucos和FreeRTOS比较有价值!其他的,不开源的,单片机的操作系统,没兴趣去了解,当然使用的时候也不考虑用---不了解怎么采用!

   ucos基于优先级调度,代码公开,虽然是商业软件,但是大家都可以拿到源代码学习,这倒是不错的!最初接触嵌入式就是从ucos开始的!但是,还是对Ucos不满,优先级固定,任务太少,每个优先级只能有一个任务,调度算法单一,没有定义一个统一的驱动程序接口出来,做简单的应用还可以,如果做复杂的,完全没办法。说实话,u-boot虽然是一个BootLoader,但是功能都比ucos强,如果加上调度算法,管理一下内存,也比ucos好多了,只是u-boot是复杂系统才采用的东西!ucos2.8虽然扩展到256个任务,但是调度算法很单一,而且又是商业软件,没有更多的人参与开发和扩展,这对它来说是很糟糕的!而ucos是基于8位发展起来的,出发思想什么的,其实很受限!现在,不再看好ucos,也不想用ucos来做项目!
    FreeRTOS的任务数量和调度算法相对来说就好多了。基于优先级调度,任务对应用来说是无限---随便说说而已,只是说足够使用或是远远用不完,16位的数量,无限了,相对ucos来说更是,而一个优先级可以有多个任务,相同优先级采用轮换调度来运行!比较起来,好了很多!但是FreeRTOS很糟糕的一点是命名,看起来是很有规则,可是又臭又长,让人受不了!GPL发布的软件采用匈牙利命名法,名字长的让人讨厌。而文件的组织形式又感觉凌乱!致命的问题:没有为驱动定义一个标准的接口来!
   我需要一个小型的操作系统---运行在16位和32位的单片机上,有标准的驱动接口,带一堆驱动,至少该包含uart、spi、i2c、usb、net的,其他的i2s之类的,有最好,任务数要很多,调度算法应该可选择,能够使用gcc来编译,还有一点,命名方式一定要简洁明了,坚决不能又臭又长!不过现在看来找不到!自己写一个?也许,只是也许能够写出来,虽然对操作系统很了解,但是很多东西,很烦的,而且时间需要很多的,偶要为生活奔波,哪有那么多时间!衡量了一下,改造FreeRTOS是最合适的办法!改造了再安GPL协议发布,这是最好的方式!从命名方式到调度方式,然后定义一个标准的驱动接口和管理方式!8位单片机,不考虑包含了,我的应用只能使用16位和32位才能完成!

0 0