前言
- 本博文基於MDK,FreeRTOSV9.0.0庫爲例,參考野火教程編寫,算是對野火教程的一個提煉總結筆記;
- 根據我的個人理解,下文中出現的單詞port翻譯爲端口,接口,但是我認爲理解爲CPU架構更容易理解;
- 如有不足之處還請多多指教;
數據類型的重定義
重定義的目的: 爲了適應不同的編譯環境和處理器(同一個數據類型在不同的編譯器和CPU架構裏的位數大小可能不同);
具體實現: 在FreeRTOSV9.0.0官方庫下的portable文件夾中,包含着FreeRTOS官方爲各種開發環境而編寫的數據類型重定義頭文件 “portmacro.h”(端口宏定義.h);使用不同的環境,使用不同的文件即可;如下圖:
以RVDS中的ARM_CM3文件爲例:
展開portmacro.h爲例:
/*-----------------------------------------------------------
* Port specific definitions. 端口指定類型
*
* The settings in this file configure FreeRTOS correctly for the
* given hardware and compiler.
*
* These settings should not be altered. 這些配置不應該被改變;
*-----------------------------------------------------------
*/
/* Type definitions. */
#define portCHAR char
#define portFLOAT float
#define portDOUBLE double
#define portLONG long
#define portSHORT short
#define portSTACK_TYPE uint32_t
#define portBASE_TYPE long
typedef portSTACK_TYPE StackType_t;
typedef long BaseType_t;
typedef unsigned long UBaseType_t;
#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
#endif
/*-----------------------------------------------------------*/
需要重要記住的幾個宏定義類型:
BaseType_t(portBASE_TYPE/UBaseType_t): 根據處理器的架構來決定是多少位的, 如果是 32/16/8bit 的處理器則是 32/16/8bit 的數據類型。一般用於定義函數的返回值或者布爾類型。
TickType_t:用於定義系統時基計數器的值和阻塞時間的 值 。 FreeRTOSConfig.h 頭 文 件 中 的 宏configUSE_16_BIT_TICKS 爲 1 時則爲 32位。
portMAX_DELAY :系統最大堵塞時間設置(32Bit/16Bit);
portSTACK_TYPE (StackType_t):
野火補充:
在編程的時候,如果用戶沒有明確指定 char 的符號類型, 那麼編譯器會默認的指定char 型的變量爲無符號或者有符號。正是因爲這個原因,在 FreeRTOS 中,我們都需要明確的指定變量 char 是有符號的還是無符號的。 在 keil 中, 默認 char 是無符號的;在Keil中可配置