硬汉嵌入式论坛

 找回密码
 立即注册
查看: 5693|回复: 6
收起左侧

[FreeRTOS教程] 第4章 FreeRTOS操作系统介绍

[复制链接]

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
发表于 2016-8-11 14:35:43 | 显示全部楼层 |阅读模式
第4章       FreeRTOS操作系统介绍


    本章节介绍一下FreeRTOS操作系统,让大家对FreeRTOS有一个整体的了解。FreeRTOS,OpenRTOS和SafeRTOS之间的区别和联系也进行了简单的介绍。
4.1 FreeRTOS简介
4.2 FreeRTOS的编程标准和命名风格
4.3 FreeRTOS和OpenRTOS的区别
4.4 FreeRTOS和SafeRTOS的区别
4.7总结


4.1   FreeRTOS简介

    FreeRTOS是由RealTime Engineers Ltd出品,是一款市场领先的RTOS。现在已经支持35种处理器架构。2015年,FreeRTOS的下载量超过12万次,平均每4.2分钟就有一次下载。专业的发展,严格高质量的控制,而且商业使用的话不需要用户公开源代码,也不存在任何版权问题,开源免费
4.1.jpg
图4.1FreeRTOS Logo

    FreeRTOS是从2003年才开始正式发布的,在过去的13年间,与全球众多领先的IC厂商合作 。第一时间推出各个IC厂商最新发布芯片的的Demo。下图4.2是其中一部厂商:
4.2.jpg
图4.2 合作的IC厂商Logo

注:Real Time Enginerrs Ltd
    这家公司的介绍可以在这里查看:http://www.freertos.org/RTOS-contact-and-support.html
     FreeRTOS的创建者
    FreeRTOS项目是由Richard Barry创建的,Rcichard Barry毕业的时候获得了实时系统方面的一等荣誉。他同时直接参与了多家公司的创业,主要工作是工业自动化,航空航天和仿真。现在他是Reel Time Enginerrs Ltd的董事以及FreeRTOS项目的拥有者和维护者。

4.1.1     FreeRTOS的特点

    FreeRTOS的主要特点如下:
1.  支持抢占式调度,合作式调度和时间片调度。
2.  SafeRTOS作为FreeRTOS的衍生品大大提高了FreeRTOS在代码完整性方面的信心。
3.  用于低功耗的Tickless模式。
4.  支持35种系统架构。
5.  FreeRTOS-MPU支持M3/M4/M7内核的MPU(内存保护单元)。
6.  设计的简单易用,典型的内核使用大小在4k-9k。
7.  移植非常简单,代码主要用C编写。
8.  同时支持合作式和抢占式任务。
9.  支持消息队列、二值信号量、计数信号量、递归信号量和互斥信号量,可用于任务与任务间的消息传递和同步,任务与中断间的消息传递和同步。
10.优先级继承方式的互斥信号量。
11.高效的软件定时器。
12.强大的跟踪执行函数。
13.堆栈溢出检查。
14.提供丰富的,配置好的工程例子。
15.提供论坛技术支持,有可选的商业支持和许可版本。
16.任务的数量不限。
17.任务优先级数量不限。
18.多个任务可以分配相同优先级,即支持时间片调度。
19.免费的开发工具。
20.免费的嵌入式软件源码。
21.免版权费。

4.1.2     高质量的管理机制

    FreeRTOS经过非常严格的高质量管理,不仅表现为规范的源码,还主要表现在以下几个方面:
(1)在关键代码区和中断里面从不会执行像遍历列表这样的时间非确定性任务。
(2)高效的软件定时器,不需要损耗额外的CPU时间,除非需要执行定时器任务。
(3)任务间直接的消息传递,相对于通用的信号量、消息队列等方式,速度较快。
(4)不需要定时的去查询阻塞或者挂起列表。
(5)FreeRTOS的队列使用模型(消息队列、互斥信号量、信号量等都是基于此队列模式设计的)使得它简单并且灵活。
(6)FreeRTOS的队列是其它通信和同步机制的基础,这种代码复用方式可以有效地降低整体代码的大小,并且反过来有助于调试,提高鲁棒性。
努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
 楼主| 发表于 2016-8-11 14:41:33 | 显示全部楼层
4.2  FreeRTOS的编码标准和命名风格


    作为初学者,非常有必要了解FreeRTOS的编码标准和命名风格,这对于以后的学习大有裨益。

4.2.1     FreeRTOS的编码标准


    FreeRTOS核心源码文件的编写遵循MISRA代码规则,同时支持各种编译器。但考虑到有些编译器的性能还比较弱,不支持C语言的新标准C99和C11的一些特性和语法,所以FreeRTOS的源码中就没有引入C99和C11的新特性,但是有一个例外,源码中有用到头文件stdint.h(这个文件是C99标准才引入的)。如果用户使用的编译器没有这个头文件的话,可以将FreeRTOS源码文件中,此路径下FreeRTOS/Source/include的一个stdint.readme文件修改为stdint.h文件后用于这个编译器。
注:MISRA
    MISRA (TheMotor Industry Software Reliability Association 汽车工业软件可靠性联会) 是位于英国的一个跨国汽车工业协会,其成员包括了大部分欧美汽车生产商。其核心使命是为汽车工业提供服务和协助,帮助厂方开发安全的、高可靠性的嵌入式软件。这个组织最出名的成果是所谓的MISRA C Coding Standard,这一标准中包括了127条C语言编码标准,通常认为,如果能够完全遵守这些标准,那你的C代码是易读、可靠、可移植和易于维护的。现在很多嵌入式开发者都以MISRA C来衡量自己的编码风格,比如uC/OS-II就宣传99%遵守MISRA标准。

4.2.2     FreeRTOS的命名规则


    初学FreeRTOS的用户对其变量和函数的命名比较迷惑,下面专门做一下介绍:
1、变量
(1)uint32_t定义的变量都加上前缀ul。u代表unsigned 无符号,l代表long长整型。
(2)uint16_t定义的变量都加上前缀us。u代表unsigned无符号,s代表short短整型。
(3)uint8_t定义的变量都加上前缀uc。u代表unsigned无符号,c代表char字符型。
(4)stdint.h文件中未定义的变量类型,在定义变量时需要加上前缀x,比如BaseType_t和TickType_t定义的变量。
(5)stdint.h文件中未定义的无符号变量类型,在定义变量时要加上前缀u,比如UBaseType_t 定义的变量要加上前缀ux。
(6)size_t 定义的变量也要加上前缀ux。
(7)枚举变量会加上前缀e。
(8)指针变量会加上前缀p,比如uint16_t定义的指针变量会加上前缀pus。
(9)根据MISRA代码规则,char定义的变量只能用于ASCII字符,前缀使用c。
(10)根据MISRA代码规则,char *定义的指针变量只能用于ASCII字符串,前缀使用pc。


2、函数
(1)加上了static声明的函数,定义时要加上前缀prv,这个是单词private的缩写。
(2)带有返回值的函数,根据返回值的数据类型,加上相应的前缀,如果没有返回值,即void类型,函数的前缀加上字母v
(3)根据文件名,文件中相应的函数定义时也将文件名加到函数命名中,比如tasks.c文件中函数vTaskDelete,函数中的task就是文件名中的task。


3、宏定义
(1)根据宏定义所在的文件,文件中的宏定义声明时也将文件名加到宏定义中,比如宏定义configUSE_PREEMPTION 是定义在文件 FreeRTOSConfig.h里面。宏定义中的config就是文件名中的config。另外注意,前缀要小写。
(2)除了前缀,其余部分全部大写,同时用下划线分开。


注:char型变量无符号数和有符号数的切换方法
    MDK可以在Options->C/C++选项中设置char型变量为有符号数或者无符号数,默认不选择单选框的情况下char型变量是8位无符号数,选上后就是8位有符号数:
4.3.jpg

    IAR可以在Options->C/C++Compiler选项中设置char型变量为有符号数或者无符号数,可以选择Signed,表示8位有符号数或者Unsigned,表示8位无符号数:
4.4.jpg


4.2.3     FreeRTOS中数据类型


    FreeRTOS使用的数据类型主要分为stdint.h文件中定义的和自己定义的两种。其中char和char *定义的变量要特别注意。
    FreeRTOS主要自定义了以下四种数据类型:
TickType_t
    如果用户使能了宏定义 configUSE_16_BIT_TICKS,那么TickType_t定义的就是16位无符号数,如果没有使能,那么TickType_t定义的就是32位无符号数。对于32位架构的处理器,一定要禁止此宏定义,即设置此宏定义数值为0即可。
BaseType_t
    这个数据类型根据系统架构的位数而定,对于32位架构,BaseType_t定义的是32位有符号数,对于16位架构,BaseType_t定义的是16位有符号数。如果BaseType_t被定义成了char型,要特别注意将其设置为有符号数,因为部分函数的返回值是用负数来表示错误类型。
UBaseType_t
    这个数据类型是BaseType_t类型的有符号版本。
StackType_t
    栈变量数据类型定义,这个数量类型由系统架构决定,对于16位系统架构,StackType_t定义的是16位变量,对于32位系统架构,StackType_t定义的是32位变量。

4.2.4     FreeRTOS的排版和注释

缩进
    Tab制表符用于缩进,Tab一次缩进4个字符空间。
注释
    FreeRTOS中注释不会超过80个字符宽度,除非对函数的参数进行注释时。源码中主要是采用/*  */的形式进行注释,不采用C++中的双斜杠风格来注释。
代码效果
    FreeRTOS的源码被设计的尽可能易于阅读和查看,实际效果如下:
  1. /* Library includes come first... */
  2. #include <stdlib.h>
  3. /* ...followed by FreeRTOS includes... */
  4. #include "FreeRTOS.h"
  5. /* ...followed by other includes. */
  6. #include "HardwareSpecifics.h"
  7. /* #defines comes next, bracketed where possible. */
  8. #define A_DEFINITION   ( 1 )
  9. /*
  10. * Static (file private) function prototypes appear next, with comments
  11. * in this style - with each line starting with a '*'.
  12. */
  13. static void prvAFunction( uint32_t ulParameter );
  14. /* File scope variables are the last thing before the function definitions.
  15. Comments for variables are in this style (without each line starting with
  16. a '*'). */
  17. static BaseType_t xMyVariable.
  18. /* The following separate is used after the closing bracket of each function,
  19. with a blank line following before the start of the next function definition. */
  20. /*-----------------------------------------------------------*/
  21. void vAFunction( void )
  22. {
  23.     /* Function definition goes here - note the separator after the closing
  24.     curly bracket. */
  25. }
  26. /*-----------------------------------------------------------*/
  27. static UBaseType_t prvNextFunction( void )
  28. {
  29.     /* Function definition goes here. */
  30. }
  31. /*-----------------------------------------------------------*/
复制代码


努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
 楼主| 发表于 2016-8-11 14:44:38 | 显示全部楼层
4.3  FreeRTOS和OpenRTOS的区别


    FreeRTOS和OpenRTOS有相同的源码,只是OpenRTOS为FreeRTOS披上了”商业外衣”。用户从FreeRTOS升级到OpenRTOS主要考虑到以下问题:
1、为了克服FreeRTOS修改版的GPL许可证限制
2、为了获得额外的服务,如专业的技术支持、高质量的中间件、培训、咨询和相应的工具。


注:修正版GPL许可证限制主要表现在如下三个方面:
      1.公司可能有一个全面禁止在他们的项目中使用GPL授权的软件。
      2.公司可能需要IP赔偿。
      3.公司可能更愿意在他们的产品中避免FreeRTOS的许可证要求承认他们使用了FreeRTOS。

    下面是FreeRTOS的开源授权和OpenRTOS的商业授权区别:
4.5.JPG
努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
 楼主| 发表于 2016-8-11 14:46:49 | 显示全部楼层


4.4  FreeRTOS和SafeRTOS的区别

    SafeRTOS也是基于FreeRTOS的,但是和FreeRTOS不同,SafeRTOS被安全方面的专家重新做了设计,下面是SafeRTOS获得的安全认证(这些安全认证都非常重要)。
4.6.JPG
    l SafeRTOS
    更多SafeRTOS相关的知识和Demo下载可于官方网站进行查询:https://www.highintegritysystems.com/
努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
 楼主| 发表于 2016-8-11 15:07:06 | 显示全部楼层
4.5    总结
    本章节就为大家讲解这么多,对于FreeRTOS的编码标准和命名风格要熟练的掌握。另外,如果对OpenRTOS和SafeRTOS感兴趣,也可以上其官网进行了解。
努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

2

主题

8

回帖

14

积分

新手上路

积分
14
发表于 2016-9-18 10:47:50 | 显示全部楼层
好文,楼主辛苦了!!!
回复

使用道具 举报

0

主题

10

回帖

10

积分

新手上路

困难时雕琢,不是刁难!!

积分
10
QQ
发表于 2017-11-24 11:45:03 | 显示全部楼层
写得真的很好 ,每次在这个论坛获得不少的知识!!!!!!谢谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-1 03:09 , Processed in 0.188165 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表