FreeRTOS 的命名规则
Posted 车子 chezi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FreeRTOS 的命名规则相关的知识,希望对你有一定的参考价值。
文章目录
如果是刚接触 FreeRTOS,看到它的命名,简直是匪夷所思,犹如天书。所以,还是有必要了解它的命名规则。
变量
-
uint32_t 定义的变量都加上前缀 ul。 u 代表 unsigned 无符号,l 代表 long 长整型。
例如:
static portFORCE_INLINE uint32_t Atomic_CompareAndSwap_u32( uint32_t volatile * pulDestination, uint32_t ulExchange, uint32_t ulComparand )
ulExchange,ulComparand 就是这样
-
uint16_t 定义的变量都加上前缀 us。 u 代表 unsigned 无符号,s 代表 short 短整型。
例如:
const uint16_t usStackDepth
-
uint8_t 定义的变量都加上前缀 uc。 u 代表 unsigned 无符号,c 代表 char 字符型。
例如:
#if ( configUSE_TASK_NOTIFICATIONS == 1 ) uint32_t ulDummy18[ configTASK_NOTIFICATION_ARRAY_ENTRIES ]; uint8_t ucDummy19[ configTASK_NOTIFICATION_ARRAY_ENTRIES ]; #endif #if ( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) uint8_t uxDummy20; #endif
ucDummy19 就是这样;
但是我不明白,uxDiummy20 为啥就用的 ux 呢?
-
int 定义的变量加上前缀 i。i 代表 int
例如:
int iTaskErrno;
-
stdint.h 文件中未定义的变量类型,在定义变量时需要加上前缀 x.
例如:
BaseType_t xCoRoutinePreviouslyWoken
MiniListItem_t xListEnd
-
stdint.h 文件中未定义的无符号变量类型,在定义变量时要加上前缀 u,比如 UBaseType_t 定义
的变量要加上前缀 ux。例如:
typedef unsigned long UBaseType_t;
UBaseType_t uxPriority;
-
枚举变量会加上前缀 e。
例如:
typedef enum eRunning = 0, /* A task is querying the state of itself, so must be running. */ eReady, /* The task being queried is in a ready or pending ready list. */ eBlocked, /* The task being queried is in the Blocked state. */ eSuspended, /* The task being queried is in the Suspended state, or is in the Blocked state with an infinite time out. */ eDeleted, /* The task being queried has been deleted, but its TCB has not yet been freed. */ eInvalid /* Used as an 'invalid state' value. */ eTaskState; eTaskState eState;
-
指针变量会加上前缀 p。
例如:
TCB_t * pxTCB;
uint8_t * pucQueueStorage; // 因为是无符号,所以是 pu
-
根据 MISRA (The Motor Industry Software Reliability Association,中文名称为汽车工业软件可靠性联会)代码规则,char 定义的变量只能用于 ASCII 字符,前缀使用 c。
例如:
char cRxedChar;
-
根据 MISRA 代码规则,**char *** 定义的指针变量只能用于 ASCII 字符串,前缀使用 pc。
例如:
char *pcStringToSend;
函数
-
加上了 static 声明的函数,定义时要加上前缀 prv(单词 private 的缩写)。
例如:
static void prvInitialiseCoRoutineLists( void );
-
带有返回值的函数,根据返回值的数据类型,加上相应的前缀,如果没有返回值,即 void 类型,函数的前缀加上字母 v。
例如:
BaseType_t xQueueGenericReset( QueueHandle_t xQueue, BaseType_t xNewQueue ); #define configRUN_TIME_COUNTER_TYPE uint32_t configRUN_TIME_COUNTER_TYPE ulTaskGetIdleRunTimePercent( void ); StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, StackType_t * pxEndOfStack, TaskFunction_t pxCode, void * pvParameters, BaseType_t xRunPrivileged ); const char * pcQueueGetName( QueueHandle_t xQueue );
-
根据文件名,文件中相应的函数定义时可能会将文件名加到函数命名中,比如 tasks.c 文件中函数
vTaskDelete,函数中的 task 就是文件名中的 task。
宏定义
-
根据宏定义所在的文件,文件中的宏定义声明时也将文件名加到宏定义中,比如宏定义
configUSE_PREEMPTION 是定义在文件 FreeRTOSConfig.h 里面。 宏定义中的 config 就是文
件名中的 config。 另外注意,前缀要小写。 -
除了前缀,其余部分全部大写,同时用下划线分开。
例如:
// include\\queue.h #define queueQUEUE_TYPE_SET ( ( uint8_t ) 0U ) // include\\list.h #define listINSERT_END( pxList, pxNewListItem ) \\ \\ ListItem_t * const pxIndex = ( pxList )->pxIndex; \\ ... // include\\timers.h #define tmrCOMMAND_EXECUTE_CALLBACK_FROM_ISR ( ( BaseType_t ) -2 ) // include\\croutine.h #define crQUEUE_RECEIVE_FROM_ISR( pxQueue, pvBuffer, pxCoRoutineWoken ) \\ xQueueCRReceiveFromISR( ( pxQueue ), ( pvBuffer ), ( pxCoRoutineWoken ) )
结语
如果你仔细研究 FreeRTOS 的命名,也会看到有些地方不符合上面的规则。
不知道作者是怎么想的,反正我是不喜欢这样的命名。
参考资料
以上是关于FreeRTOS 的命名规则的主要内容,如果未能解决你的问题,请参考以下文章