1、數據類型
在 FreeRTOS 中, 使用的數據類型雖然都是標准 C 里面的數據類型,但是針對不同的處理器,對標准 C 的數據類型又進行了重定義,給它們取了一個新的名字, 比如 char 重新定義了一個名字 portCHAR, 這里面的 port 表示接口的意思,就是 FreeRTOS 要移植到這些處理器上需要這些接口文件來把它們連接在一起。但是用戶在寫程序的時候並非一定要遵循 FreeRTOS 的風格, 我們還是可以直接用 C 語言的標准類型。在 FreeRTOS 中, int 型從不使用, 只使用 short 和 long 型。
在編程的時候,如果用戶沒有明確指定 char 的符號類型, 那么編譯器會默認的指定char 型的變量為無符號或者有符號。正是因為這個原因,在 FreeRTOS 中,我們都需要明確的指定變量 char 是有符號的還是無符號的。 在 keil 中, 默認 char 是無符號的,但是也可以配置為有符號的。
但是用戶在寫程序的時候並非一定要遵循 FreeRTOS 的風格, 我們還是可以直接用 C 語言的標准類型。在 FreeRTOS 中, int 型從不使用, 只使用 short 和 long 型。在 Cortex-M 內核的 MCU 中, short 為 16 位, int和long 為 32位。
新定義的數據類型 實際的數據類型(C標准類型) #define portCHAR char #define portFLOAT float #define portDOUBLE double #define portLONG long #define portSHORT short #define portSTACK_TYPE uint32_t #define portBASE_TYPE long //根據處理器的架構來決定是多少位的, 如果是 32/16/8bit 的處理器則是 32/16/8bit 的數據類型。一般用於定義函數的返回值或者布爾類型。
typedef portSTACK_TYPE StackType_t; typedef long BaseType_t; typedef unsigned long UBaseType_t;
//用於定義系統時基計數器的值和阻塞時間的值。 當 FreeRTOSConfig.h 頭文件中的宏configUSE_16_BIT_TICKS 為 1 時則為16位,為0時則為32位。 #if( configUSE_16_BIT_TICKS == 1 ) typedef uint16_t TickType_t; #define portMAX_DELAY ( TickType_t ) 0xffff #else typedef uint32_t TickType_t; #define portMAX_DELAY ( TickType_t ) 0xffffffffUL #define portTICK_TYPE_IS_ATOMIC 1 #endif
在編程的時候,如果用戶沒有明確指定 char 的符號類型, 那么編譯器會默認的指定char 型的變量為無符號或者有符號。正是因為這個原因,在 FreeRTOS 中,我們都需要明確的指定變量 char 是有符號的還是無符號的。 在 keil 中, 默認 char 是無符號的,但是也可以配置為有符號的。
2、變量名
在 FreeRTOS 中,定義變量的時候往往會把變量的類型當作前綴加在變量上, 這樣的好處是讓用戶一看到這個變量就知道該變量的類型。 比如 char 型變量的前綴是 c, short 型變量的前綴是 s, long 型變量的前綴是 l, portBASE_TYPE 類型變量的前綴是 x。 還有其他的數據類型,比如數據結構,任務句柄, 隊列句柄等定義的變量名的前綴也是 x。如果一個變量是無符號型的那么會有一個前綴 u, 如果是一個指針變量則會有一個前綴 p。因此,當我們定義一個無符號的 char 型變量的時候會加一個 uc 前綴, 當定義一個char 型的指針變量的時候會有一個 pc 前綴。
3、函數名
函數名包含了函數返回值的類型、 函數所在的文件名和函數的功能,如果是私有的函數則會加一個 prv(private) 的前綴。特別的, 在函數名中加入了函數所在的文件名, 這大大的幫助了用戶提高尋找函數定義的效率和了解函數作用的目的, 具體的舉例如下:
(1)vTaskPrioritySet()函數的返回值為 void 型, 在 task.c 這個文件中定義。
(2)xQueueReceive()函數的返回值為 portBASE_TYPE 型, 在 queue.c 這個文件中定義。
(3)vSemaphoreCreateBinary()函數的返回值為 void 型, 在 semphr.h 這個文件中定義。
4、 宏
宏均是由大寫字母表示,並配有小寫字母的前綴, 前綴用於表示該宏在哪個頭文件定義,部分舉例具體見下表。
這里有個地方要注意的是信號量的函數都是一個宏定義,但是它的函數的命名方法是遵循函數的命名方法而不是宏定義的方法。在貫穿 FreeRTOS 的整個代碼中,還有幾個通用的宏定義我們也要注意下,都是表示 0和 1 的宏,具體見下表: