目录
数据类型
FreeRTOS的每个端口都有一个唯一的portmacro.h头文件,显然它是特定于端口的,即与与port.c一样位于FreeRTOS/Source/portable/[compiler]/[architecture]这个目录下,该文件包含(除其他内容外)两种端口特定数据类型的定义: TickType_t和BaseType_t。
下表描述了这些数据类型:
使用的宏(macro)或typedef | 实际类型 |
---|---|
TickType_t | FreeRTOS配置了一个被称为滴答中断的周期性中断。 自FreeRTOS应用程序启动以来发生的滴答中断数称为滴答计数。 滴答计数用来作为系统时间的计量标准。 两次滴答中断之间的时间称为滴答周期。时间被指定为滴答周期的倍数。 TickType_t是用于保存滴答计数值和指定时间的数据类型。 TickType_t可以是无符号16位类型,也可以是无符号32位类型,这取决于在FreeRTOSConfig.h中对configUSE_16_BIT_TICKS的设置。如果configUSE_16_BIT_TICKS被设置为1,则TickType_t被定义为uint16_t。如果configUSE_16_BIT_TICKS被设置为0,则TickType_t被定义为uint32_t。 使用16位类型可以极大地提高8位和16位体系结构的效率,但严重限制了可以指定的时间。没有理由在32位体系结构上使用16位类型 |
BaseType_t
| 这总是被定义为体系结构中最有效的数据类型。通常,这在32位体系结构上的32位类型,在16位体系结构上的16位类型,在8位体系结构上的8位类型。 BaseType_t通常用于只能取非常有限的值范围的返回类型,以及pdTRUE/pdFALSE类型的布尔类值。 |
一些编译器默认将所有没有明确指定符号类型的char变量编译为unsigned类型,而有些编译器编译为signed类型。出于这个原因,FreeRTOS源代码显式地指定了了所有char类型变量中“signed”或“unsigned”的使用,除非该字符用于保存一个ASCII字符,或者char类型的指针用于指向一个字符串。
FreeRTOS从不使用普通的int类型,只使用short和long型。
在keil的开发环境下,默认char是unsigned类型的。但也可以配置为有符号的,配置过程如下:
变量名
在FreeRTOS中变量以其类型作为前缀: ‘c’表示char,‘s’表示int16_t(short),‘l’表示int32_t(long),‘x’表示BaseType_t和任何其他非标准类型(结构、任务句柄、队列句柄等)。这使我们能够一眼看出变量的类型。
如果一个变量为无符号类型,则它会再加一个“u”作为前缀。如果变量是指针,它会再加“p”作为前缀。例如,类型为uint8_t的变量将以“uc”为前缀,类型为指向char的指针变量将以“pc”为前缀。
函数名
-
v Task PrioritySet()返回一个void类型,并且该函数定义在task.c中
-
xQueueReceive()返回一个BaseType_t 类型变量,并且该函数定义在queue.c中
-
pv Timer GetTimerID()返回一个void 指针,并且该函数定义在timer.c中
格式
宏名称
前缀 | 宏定义的位置 |
port (例如, portMAX_DELAY)
|
portable.h 或 portmacro.h
|
task (例如, taskENTER_CRITICAL())
|
task.h
|
pd (例如, pdTRUE)
|
projdefs.h
|
config (例如, configUSE_PREEMPTION)
|
FreeRTOSConfig.h
|
err (例如, errQUEUE_FULL)
|
projdefs.h
|
请注意,信号量API几乎完全是作为一组宏编写的,但它遵循函数命名约定,而不是宏命名约定。
下表定义的宏在整个FreeRTOS源代码中都在使用。
宏 | 值 |
pdTRUE
| 1 |
pdFALSE0
| 0 |
pdPASS0
| 1 |
pdFAIL
| 0 |
过度类型转换的基本原理
FreeRTOS 源代码可以使用许多不同的编译器进行编译,所有这些编译器在生成警告的方式和时间上都有所不同。 特别是,不同的编译器希望以不同的方式使用强制转换。 因此,FreeRTOS 源代码包含比正常情况下更多的类型转换。