为什么要学习
RTOS
在裸机系统中,所有的程序基本都是自己写的,所有的操作都是在一个无限的大循环 里面实现。
但是为什么还要学习 RTOS 编程,单纯的裸机系统已经不能够完美地解决问题,反而会使编程变得 更加复杂,如果想降低编程的难度,我们可以考虑引入 RTOS
实现多任务管理,这是使用 RTOS 的最大优势。
首先关于数据类型
在
FreeRTOS
中,使用的数据类型虽然都是标准
C
里面的数据类型,但是针对不同的 处理器,对标准 C
的数据类型又进行了重定义,给它们取了一个新的名字,比如
char
重新 定义了一个名字 portCHAR
,这里面的
port
表示接口的意思,就是
FreeRTOS
要移植到这些 处理器上需要这些接口文件来把它们连接在一起。但是用户在写程序的时候并非一定要遵 循 FreeRTOS
的风格,我们还是可以直接用
C
语言的标准类型。在
FreeRTOS
中,
int
型从 不使用,只使用 short
和
long
型。在
Cortex-M
内核的
MCU
中
short
为
16
位,
long
为
32 位
新定义的数据类型
实际的数据类型(
C
标准类型)
portCHAR char
portSHORT short
portLONG long
#define portCHAR char
2
#define portFLOAT float
3
#define portDOUBLE double
4
#define portLONG long
5
#define portSHORT short
6 #define portSTACK_TYPE uint32_t
7
#define portBASE_TYPE long
8
9 typedef portSTACK_TYPE StackType_t;
10 typedef
long
BaseType_t;
11 typedef
unsigned long
UBaseType_t;
12
13
#if( configUSE_16_BIT_TICKS == 1 )
14 typedef
uint16_t
TickType_t;
15
#define portMAX_DELAY ( TickType_t ) 0xffff
16
#else
17 typedef
uint32_t
TickType_t;
18
#define portMAX_DELAY ( TickType_t ) 0xffffffffUL
在
FreeRTOS
中,定义变量的时候往往会把变量的类型当作前缀加在变量上,这样的 好处是让用户一看到这个变量就知道该变量的类型。比如 char
型变量的前缀是
c
,
short
型 变量的前缀是 s
,
long
型变量的前缀是
l
,
portBASE_TYPE
类型变量的前缀是
x
。还有其他 的数据类型,比如数据结构,任务句柄,队列句柄等定义的变量名的前缀也是 x
。
如果一个变量是无符号型的那么会有一个前缀
u
,如果是一个指针变量则会有一个前 缀 p
。因此,当我们定义一个无符号的
char
型变量的时候会加一个
uc
前缀,当定义一个 char 型的指针变量的时候会有一个
pc
前缀。
- portBASE_TYPE 根据处理器架构决定位数,如果是 32/16/8bit 的处理器,则是 32/26/8bit 的数据类型,一般用于定义函数的返回值或者布尔类型。
本地工程文件夹说明
Doc
用于存放对整个工程的说明文件,如 readme.txt。通常情况下,我们都要对整个工程实现的功能,如何编译,如
何使用等做一个简要的说明。
代码清单
7-3
定义任务栈
1
#define TASK1_STACK_SIZE 128
(2)
2
StackType_t Task1Stack[TASK1_STACK_SIZE];
(1)
3
4
#define TASK2_STACK_SIZE 128
5
StackType_t Task2Stack[TASK2_STACK_SIZE];
代码清单
7-3
(1)
:任务栈其实就是一个预先定义好的全局数据,数据类型为
StackType_t
,大小由
TASK1_STACK_SIZE
这个宏来定义,默认为
128
,单位为字,即
512
字节,这也是
FreeRTOS
推荐的最小的任务栈。在
FreeRTOS
中,凡是涉及到数据类型的
地方,
FreeRTOS
都会将标准的
C
数据类型用
typedef
重新取一个类型名。这些经过重定义
的数据类型放在
portmacro.h
(
rtdef.h
第一次使用需要在
include
文件夹下面新建然后添加到
工程
freertos/source
这个组文件)这个头文件,
拥有该节点的内核对象,通常是 TCB
调用 pxPortInitialiseStack()函数初始化任务栈