一. RTOS概述
-
本书的内容架构是怎样的?
- 第一部分:“从0到1教你写FreeRTOS内核”
- 重点:FreeRTOS的原理实现,FreeRTOS的内核是怎么写出来的,任务是怎么定义的,系统是怎么调度的(包括底层的汇编代码),多优先级是怎么实现的...(较难)
- 第二部分:“FreeRTOS内核应用开发”
- 重点:FreeRTOS的移植,内核每个组件的应用(较容易)
- 第一部分:“从0到1教你写FreeRTOS内核”
-
如何学习RTOS?
从0到1,循序渐进,不可跳跃
-
有哪些好的学习方法?
1.边看书边调试。
怎么调试?单步执行每一条程序,研究程序的执行流程和自己所想的是否一致。
2.每学习一章之后,必须将例程重新敲一遍,哪怕一个分号,并能举一反三,真正理解,重视出现的错误。
-
学习中可以参考那些资料?
- FreeRTOS V9.0.0官方源代码
- FreeRTOS_Reference_Manual_V9.0.0(电子版)译为 “FreeRTOS参考手册_V9.0.0”
- Mastering_the_FreeRTOS_Real_Time_Kernel-A_Hands-On_Tutorial_Guide(电子版)译为 “掌握FreeRTOS实时内核的实践教程指南”
- Using the FreeRTOS Real Time Kernel-A pratical Guide-Cortex-M3 Edition(电子版)译为 “使用FreeRTOS实时内核-实用指南Cortex-M3版”
- 《STM32库开发实战指南》(电子版)
-
本书编者的编书思路有哪些需要了解的?
第一部分是基于FreeRTOS V9.0.0官方源码,从0到1,层层递进,学习时涉及到的数据类型、变量名称、函数名称、文件名称、文件存放位置完全按照FreeRTOS官方的方式来实现。有一些函数可能会去掉一些形参和一些冗余的代码,而只保留核心的功能。
第二部分主要是FreeRTOS的移植和内核组件的使用,不会去深入源码,会重点学习应用。第一和第二部分没有必然联系,对第一部分不感兴趣可以跳过。
- 什么是裸机编程?(了解)也就是单片机编程,不加入任何RTOS的程序。
- RTOS是什么?(全称Real Time Operating System译作实时操作系统 )
- 为什么要学习RTOS?
- 项目需要。相比于裸机系统,RTOS可以实现更多的功能,能做到多任务管理。
- 学习升职需要
- 裸机系统和多任务系统有什么区别?(了解)
- 裸机系统又分为轮询系统和前后台系统
- 轮询系统:在裸机编程的时候,先初始化好相关的硬件,然后让程序在一个死循环里不断地循环,顺序地执行各种事情
- 前后台系统:就是在轮询系统中加入了中断。中断我们称为前台,main函数里的无限循环称为后台。
- 多任务系统:相比前后台系统,多任务系统的事件响应也是在中断中完成的,但是事件的处理是在任务中完成的。
- 什么是任务?在多任务系统中,根据程序的功能,我们把这个程序主体分割成一个个独立的,无限循环且不能返回的小程序,这个小程序我们称为任务。
- 任务的特点?相互独立,互不干扰,具备自身优先级,有OS调度管理。
- 孰优孰略,各有所长,合适的才是最好的
- 有关这三种软件模型的区别
- 裸机系统又分为轮询系统和前后台系统
|
模型 |
事件响应 |
事件处理 |
特点 |
|
轮询系统 |
主程序 |
主程序 |
轮询响应事件,轮询处理事件 |
|
前后台系统 |
中断 |
主程序 |
实时响应事件,轮询处理事件 |
|
多任务系统 |
中断 |
任务 |
实时响应事件,实时处理事件 |
-
本书的学习思路:
我们采用一种全新的方法来学习一款RTOS,即不是单纯的讲里面的API如何使用,也不是单纯的拿里面的源码一句句来讲解。而是从0开始,层层叠加,不断地完善,让自己学会怎么把一个RTOS从0到1写出来,每一个阶段的学习都能体会到成功的喜悦。【前提是 具备C语言的基础即可】
- 选择哪个RTOS? Freertos
- 怎么获取Freertos的资料?源码和官方书籍可以去这个网站上下载www.freertos.org
- FreeRTOS的编程风格(重点)
- 1.数据类型:在FreeRTOS中,使用的数据类型虽然都是标准C里面的数据类型,但是针对不同的处理器,对标准C的数据类型进行了重定义,也就是说给他们取了一个新名字,如下图:
|
新定义的数据类型 |
标准C的数据类型 |
|
|
portCHAR |
char |
|
|
portFLOAT |
short |
|
|
portLONG |
long |
|
|
portTickType |
unsigned short int |
用于定义时基计数器的值和阻塞时间的值。当FreeRTOSConfig.h头文件中的宏configUSE_16_BIT_TICKS为1时则为16位 |
|
unsigned int |
用于定义时基计数器的值和阻塞时间的值。当FreeRTOSConfig.h头文件中的宏configUSE_16_BIT_TICKS为0时则为32位 |
|
|
portBASE_TYPE |
long |
根据处理器的架构来决定是多少位的,如果是32/16/8bit的处理器则是32/16/8bit的数据类型。一般用于定义函数的返回值或布尔类型 |
在编程的时候,如果用户没有明确char的符号类型,编译器会无从选择有符号或无符号,所以,在FreeRTOS中,需要明确指定变量char是有符号还是无符号的。在KEIL中,默认char是无符号的,但是也可以配置为有符号的(勾选后),配置如下:

- 2.变量名
在FreeRTOS中,定义变量的时候,往往把变量的类型当做前缀加在变量上。例如char型变量的前缀是c,short型变量的前缀是s,long型变量的前缀是l,portBASE_TYPE类型变量的前缀是x。如果变量时无符号型,那么再加一个前缀u,如果是指针变量则加一个前缀p。因此合并起来定义一个无符号的char型变量加前缀为uc,当定义一个char型的指针变量则前缀为pc。
这里要说明:在后面学习的其它数据类型,如数据结构,任务句柄,队列句柄等定义的变量名前缀也是x。
- 3.函数名
函数名包含了函数的返回值类型、函数所在的文件名以及函数的功能。
私有函数则会加一个prv的前缀。(prv:private)
举例:
- vTaskPrioritySet()函数的返回值为void型,在task.c这个文件中定义;
- xQueueReceive()函数的返回值为portBASE_TYPE型,在queue.c这个文件中定义
- vSemaphoreCreateBinary()函数的返回值为void型,在semphr.h这个文件中定义
- 4.宏
由大写字母表示,并配有小写字母的前缀(表示是在哪个头文件中定义)
举例:
|
前缀 |
宏 |
宏定义的文件 |
|
port |
portMAX_DELAY |
portable.h |
|
task |
taskENTER_CRITICAL() |
task.h |
|
pd |
pdTRUE |
projdefs.h |
|
config |
configUSE_PREEMPTION |
FreeRTOSConfig.h |
|
err |
errQUEUE_FULL |
projdefs.h |
这里要注意:信号量的函数都是一个宏定义,但是它遵循的是函数的命名方法而非宏定义;
在整个FreeRTOS中,还有几个通用的宏,表示0和1:
|
宏 |
实际的值 |
|
pdTRUE |
1 |
|
pdFALSE |
0 |
|
pdPASS |
1 |
|
pdFAIL |
0 |
- 补充:
我们在编程的时候最好使用空格键而非TAB键,为什么?
我们知道,一个TAB键=4个空格键,代码移植的时候,当两个编译器的TAB设置的值的大小不一样的时候,代码的格式就会乱,而直接使用空格键就可以避免。
更多推荐

所有评论(0)