FreeRTOS 的命名规则

Posted 车子 chezi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FreeRTOS 的命名规则相关的知识,希望对你有一定的参考价值。

文章目录


如果是刚接触 FreeRTOS,看到它的命名,简直是匪夷所思,犹如天书。所以,还是有必要了解它的命名规则。

变量

  1. 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 就是这样

  2. uint16_t 定义的变量都加上前缀 us。 u 代表 unsigned 无符号,s 代表 short 短整型。

    例如: const uint16_t usStackDepth

  3. 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 呢?

  4. int 定义的变量加上前缀 i。i 代表 int

    例如:int iTaskErrno;

  5. stdint.h 文件中未定义的变量类型,在定义变量时需要加上前缀 x.

    例如:

    BaseType_t xCoRoutinePreviouslyWoken

    MiniListItem_t xListEnd

  6. stdint.h 文件中未定义的无符号变量类型,在定义变量时要加上前缀 u,比如 UBaseType_t 定义
    的变量要加上前缀 ux。

    例如:

    typedef unsigned long UBaseType_t;

    UBaseType_t uxPriority;

  7. 枚举变量会加上前缀 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;
    
  8. 指针变量会加上前缀 p

    例如:

    TCB_t * pxTCB;

    uint8_t * pucQueueStorage; // 因为是无符号,所以是 pu

  9. 根据 MISRA (The Motor Industry Software Reliability Association,中文名称为汽车工业软件可靠性联会)代码规则,char 定义的变量只能用于 ASCII 字符,前缀使用 c

    例如:

    char cRxedChar;

  10. 根据 MISRA 代码规则,**char *** 定义的指针变量只能用于 ASCII 字符串,前缀使用 pc

    例如:

    char *pcStringToSend;

函数

  1. 加上了 static 声明的函数,定义时要加上前缀 prv(单词 private 的缩写)。

    例如:

    static void prvInitialiseCoRoutineLists( void );

  2. 带有返回值的函数,根据返回值的数据类型,加上相应的前缀,如果没有返回值,即 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 );
    
  3. 根据文件名,文件中相应的函数定义时可能会将文件名加到函数命名中,比如 tasks.c 文件中函数
    vTaskDelete,函数中的 task 就是文件名中的 task。

宏定义

  1. 根据宏定义所在的文件,文件中的宏定义声明时也将文件名加到宏定义中,比如宏定义
    configUSE_PREEMPTION 是定义在文件 FreeRTOSConfig.h 里面。 宏定义中的 config 就是文
    件名中的 config。 另外注意,前缀要小写。

  2. 除了前缀,其余部分全部大写,同时用下划线分开。

    例如:

    // 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的编码标准和命名风格 - 菜鸟学院

以上是关于FreeRTOS 的命名规则的主要内容,如果未能解决你的问题,请参考以下文章

FreeRTOS 的命名规则

FreeRTOS中函数命名规则

FreeRTOS中函数命名规则

freeRTOS与裸机程序相比有什么区别??

命名空间--名称解析规则

java web项目中,模块的命名规则是啥?