FreeRTOS 快速入门(一)之 FreeRTOS 的命名规则


FreeRTOS 的命名规约非常独特,假若缺乏事先的了解,研读其源代码将使人感到困惑不解。然而,一旦熟悉了其命名规约,阅读就变得十分轻松了。

一、数据类型

FreeRTOS 中,使用的数据类型虽然都是标准 C 里面的数据类型,但是针对不同的处理器,对标准 C 的数据类型又进行了重定义,给它们取了一个新的名字,比如 char 重新定义了一个名字 portCHAR,这里面的 port 表示接口的意思,就是 FreeRTOS 要移植到这些处理器上需要这些接口文件来把它们连接在一起。

FreeRTOS 中,int 型从不使用,只使用 short 和 long 型。在 Cortex-M 内核的 MCU 中,short 为 16 位,long 为 32 位。

portmacro.h 文件中,有如下定义:

/* 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

其中:

  • TickType_t
    • FreeRTOS 配置了一个周期性的时钟中断:Tick Interrupt
    • 每发生一次中断,中断次数累加,这被称为 tick count
    • tick count 这个变量的类型就是 TickType_t
    • TickType_t 可以是 16 位的,也可以是 32 位的
    • FreeRTOSConfig.h 中定义 configUSE_16_BIT_TICKS 时,TickType_t 就是 uint16_t,否则 TickType_t 就是 uint32_t
    • 对于 32 位架构,建议把 TickType_t 配置为 uint32_t
  • BaseType_t
    • 这是该架构最高效的数据类型
    • 32 位架构中,它就是 uint32_t
    • 16 位架构中,它就是uint16_t
    • 8 位架构中,它就是 uint8_t
    • BaseType_t 通常用作简单的返回值的类型,还有逻辑值,比如 pdTRUE/pdFALSE

在编程的时候,如果用户没有明确指定 char 的符号类型,那么编译器会默认的指定 char 型的变量为无符号或者有符号。正是因为这个原因,在 FreeRTOS 中,我们都需要明确的指定变量 char 是有符号的还是无符号的。在Keil 中,默认 char 是无符号的,但是也可以配置为有符号的,具体配套过程如下:

二、变量名

每个变量名都有前缀来表示它是什么类型的数据,前缀见下表:

变量名前缀含义
cchar
sint16_t,short
lint32_t,long
xBaseType_t,其他非标准的类型:结构体、task handlequeue handle
uunsigned
p指针
ucuint8_t,unsigned char
pcchar指针

三、函数名

函数名包含了函数返回值的类型、函数所在的文件名和函数的功能,如果是私有的函数则会加一个 prv(private)的前缀。

特别的,在函数名中加入了函数所在的文件名,这大大的帮助了用户提高寻找函数定义的效率和了解函数作用的目的,具体的举例如下:

例如:

函数名前缀含义
vTaskPrioritySet返回值类型:void
在 task.c 中定义
xQueueReceive返回值类型:BaseType_t
在 queue.c 中定义
pvTimerGetTimerID返回值类型:pointer to void
在 tmer.c 中定义

四、宏

宏均是由大写字母表示,并配有小写字母的前缀,前缀用于表示该宏在哪个头文件定义,如下例:

前缀宏定义的文件
port (例, portMAX_DELAY)portable.h
task (例, taskENTER_CRITICAL())task.h
pd (例, pdTRUE)projdefs.h
config(例, configUSE_PREEMPTION)FreeRTOSConfig.h
err (例, errQUEUE_FULL)projdefs.h

这里有个地方要注意的是信号量的函数都是一个宏定义,但是它的函数的命名方法是遵循函数的命名方法而不是宏定义的方法。

  • 18
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值