打印
[应用相关]

FreeRTOS基础知识

[复制链接]
787|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
FreeRTOS基础知识
沙发
goodluck09876|  楼主 | 2018-9-9 20:11 | 只看该作者
早期嵌入式开发没有嵌入式操作系统的概念 ,直接操作裸机,在裸机上写程序,比如用51单片机基本就没有操作系统的概念。通常把程序分为两部分:前台系统和后台系统。 简单的小系统通常是前后台系统,这样的程序包括一个死循环和若干个中断服务程序:应用程序是一个无限循环,循环中调用API函数完成所需的操作,这个大循环就叫做后台系统。中断服务程序用于处理系统的异步事件,也就是前台系统。前台是中断级,后台是任务级。

使用特权

评论回复
板凳
goodluck09876|  楼主 | 2018-9-9 20:12 | 只看该作者

使用特权

评论回复
地板
goodluck09876|  楼主 | 2018-9-9 20:12 | 只看该作者
这里就是平时我们裸机的运行结果,现在比如我在运行task3,突然又想马上运行task1,这怎么办?前后台程序就会让后面的任务执行之后,再去执行task1,这样实时性受到影响。如果是裸机,要实现也可以,用中断,可是这样会让程序结构变得复杂,因为我想什么时候跳过就跳过,想什么时候执行就执行,所以固定的中断触发方式虽然也可以实现一些简单的跳转功能,但是当程序复杂之后,这样的裸机程序难以阅读和维护。这样在有操作系统的任务调度之后,就会让系统响应更具有实时性。

使用特权

评论回复
5
goodluck09876|  楼主 | 2018-9-9 20:12 | 只看该作者
RTOS全称为:Real Time OS,就是实时操作系统,强调的是:实时性。实时操作系统又分为硬实时和软实时。硬实时要求在规定的时间内必须完成操作 ,硬实时系统不允许超时,在软实时里面处理过程超时的后果就没有那么严格。 在实时操作系统中,我们可以把要实现的功能划分为多个任务,每个任务负责实现其中的一部分,每个任务都是一个很简单的程序,通常是一个死循环。 RTOS操作系统:FreeRTOS,UCOS,RTX,RT-Thread,DJYOS等。 RTOS操作系统的核心内容在于:实时内核。

使用特权

评论回复
6
goodluck09876|  楼主 | 2018-9-9 20:12 | 只看该作者
可剥夺型内核:

RTOS的内核负责管理所有的任务,内核决定了运行哪个任务,何时停止当前任务切换到其他任务,这个是内核的多任务管理能力。多任务管理给人的感觉就好像芯片有多个CPU,多任务管理实现了CPU资源的最大化利用,多任务管理有助于实现程序的模块化开发,能够实现复杂的实时应用。

使用特权

评论回复
7
goodluck09876|  楼主 | 2018-9-9 20:13 | 只看该作者
可剥夺内核顾名思义就是可以剥夺其他任务的CPU使用权,它总是运行就绪任务中的优先级最高的那个任务。

使用特权

评论回复
8
goodluck09876|  楼主 | 2018-9-9 20:14 | 只看该作者
FreeRTOS是一个可裁剪、可剥夺型的多任务内核,而且没有任务数限制。FreeRTOS提供了实时操作系统所需的所有功能,包括资源管理、同步、任务通信等。 FreeRTOS是用C和汇编来写的,其中绝大部分都是用C语言编写的,只有极少数的与处理器密切相关的部分代码才是用汇编写的,FreeRTOS结构简洁,可读性很强!最主要的是非常适合初次接触嵌入式实时操作系统学生、嵌入式系统开发人员和爱好者学习。

使用特权

评论回复
9
goodluck09876|  楼主 | 2018-9-9 20:14 | 只看该作者
为什么需要学习这个操作系统:

使用特权

评论回复
10
goodluck09876|  楼主 | 2018-9-9 20:14 | 只看该作者

使用特权

评论回复
11
goodluck09876|  楼主 | 2018-9-9 20:15 | 只看该作者
学习方法:

1、多练 不要只看书,或者只看资料,只“看”是没有任何用的!一定要实际动手写代码练习,多在开发板上练习。 2、遇到不懂的怎么办? FreeRTOS还是有一定难度的,在学习的过程中难免会遇到看不懂的东西,如果遇到不懂的就先不要管,先学会怎么调用FreeRTOS的API函数。等以后有时间了在回过头来重新学习一下。 3、对C语言的要求 需要了解指针、结构体、数据结构中的链表等。

使用特权

评论回复
12
goodluck09876|  楼主 | 2018-9-9 20:15 | 只看该作者
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. 免版权费。

使用特权

评论回复
13
goodluck09876|  楼主 | 2018-9-9 20:16 | 只看该作者
FreeRTOS 的编码标准
FreeRTOS 核心源码文件的编写遵循 MISRA 代码规则,同时支持各种编译器。 但考虑到有些编译器
的性能还比较弱,不支持 C 语言的新标准 C99 和 C11 的一些特性和语法,所以 FreeRTOS 的源码中就没
有引入 C99 和 C11 的新特性,但是有一个例外,源码中有用到头文件 stdint.h(这个文件是 C99 标准才
引入的)。如果用户使用的编译器没有这个头文件的话,可以将 FreeRTOS 源码文件中,此路径下
FreeRTOS/Source/include 的一个 stdint.readme 文件修改为 stdint.h 文件后用于这个编译器。

使用特权

评论回复
14
goodluck09876|  楼主 | 2018-9-9 20:16 | 只看该作者
MISRA (The Motor Industry Software Reliability Association 汽车工业软件可靠性联会) 是位于
英国的一个跨国汽车工业协会,其成员包括了大部分欧美汽车生产商。其核心使命是为汽车工业提供
服务和协助,帮助厂方开发安全的、高可靠性的嵌入式软件。这个组织最出名的成果是所谓的 MISRA C
Coding Standard,这一标准中包括了 127 条 C 语言编码标准,通常认为,如果能够完全遵守这些标
准, 那你的 C 代码是易读、可靠、可移植和易于维护的。 现在很多嵌入式开发者都以 MISRA C 来衡量
自己的编码风格,比如 uC/OS-II 就宣传 99%遵守 MISRA 标准。

使用特权

评论回复
15
goodluck09876|  楼主 | 2018-9-9 20:17 | 只看该作者
FreeRTOS 的命名规则
初学 FreeRTOS 的用户对其变量和函数的命名比较迷惑,下面专门做一下介绍:
 变量
 uint32_t 定义的变量都加上前缀 ul。 u 代表 unsigned 无符号,l 代表 long 长整型。
 uint16_t 定义的变量都加上前缀 us。 u 代表 unsigned 无符号,s 代表 short 短整型。
 uint8_t 定义的变量都加上前缀 uc。 u 代表 unsigned 无符号,c 代表 char 字符型。
 stdint.h 文件中未定义的变量类型,在定义变量时需要加上前缀 x,比如 BaseType_t 和
TickType_t 定义的变量。
 stdint.h 文件中未定义的无符号变量类型,在定义变量时要加上前缀 u,比如 UBaseType_t 定义
的变量要加上前缀 ux。
 size_t 定义的变量也要加上前缀 ux。
 枚举变量会加上前缀 e。
 指针变量会加上前缀 p,比如 uint16_t 定义的指针变量会加上前缀 pus。
 根据 MISRA 代码规则,char 定义的变量只能用于 ASCII 字符,前缀使用 c。
 根据 MISRA 代码规则,char *定义的指针变量只能用于 ASCII 字符串,前缀使用 pc。

使用特权

评论回复
16
goodluck09876|  楼主 | 2018-9-9 20:17 | 只看该作者
 函数
 加上了 static 声明的函数,定义时要加上前缀 prv,这个是单词 private 的缩写。
 带有返回值的函数,根据返回值的数据类型,加上相应的前缀,如果没有返回值,即 void 类型
,函数的前缀加上字母 v。
 根据文件名,文件中相应的函数定义时也将文件名加到函数命名中,比如 tasks.c 文件中函数
vTaskDelete,函数中的 task 就是文件名中的 task。

使用特权

评论回复
17
goodluck09876|  楼主 | 2018-9-9 20:18 | 只看该作者
 宏定义
 根据宏定义所在的文件,文件中的宏定义声明时也将文件名加到宏定义中,比如宏定义
configUSE_PREEMPTION 是定义在文件 FreeRTOSConfig.h 里面。 宏定义中的 config 就是文
件名中的 config。 另外注意,前缀要小写。
 除了前缀,其余部分全部大写,同时用下划线分开。

使用特权

评论回复
18
goodluck09876|  楼主 | 2018-9-9 20:18 | 只看该作者
FreeRTOS 中数据类型
FreeRTOS 使用的数据类型主要分为 stdint.h 文件中定义的和自己定义的两种。 其中 char 和 char *
定义的变量要特别注意。
FreeRTOS 主要自定义了以下四种数据类型:
 TickType_t
如果用户使能了宏定义 configUSE_16_BIT_TICKS,那么 TickType_t 定义的就是 16 位无符号数,如
果没有使能,那么 TickType_t 定义的就是 32 位无符号数。 对于 32 位架构的处理器,一定要禁止此
宏定义,即设置此宏定义数值为 0 即可。

使用特权

评论回复
19
goodluck09876|  楼主 | 2018-9-9 20:19 | 只看该作者
 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 位变量。


移植前准备工作说明
1. 本章节的 IDE 开发环境使用 MDK,用 MDK4.7X 或者 MDK5.XX 均可,保证支持 STM32F103,F407
和 F429 即可(不可以使用 MDK4.7X 以下版本,一方面是不支持 F429,另外就是 FreeRTOS V8.2.3
要用到 C 代码中嵌套汇编代码,MDK4.7X 以下版本是不支持的)。
2. 找一个简单的工程,最好是跑马灯之类的,越简单越好,我们就在这个简单的工程上面移植即可。
3. 大家使用的简单工程里面不能有 SysTick,PendSV 和 SVC 三个系统中断的使用,因为 FreeRTOS 系
统要使用这三个中断。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

220

主题

5843

帖子

21

粉丝