| TickType_t | BaseType_t | UBaseType_t |
|---|---|---|
| 用于记录系统节拍的数据类型 具体的数据类型取决于 configTICK_TYPE_WIDTH_IN_BITS | 基本数据类型,是/否,成功/失败 当前处理器架构下最有效率的数据类型(int32_t) | BaseType_t的无符号版本,非负数 对于STM32F1单片机,该数据类型为uint32_t |
TickType_t的使用场景
TickType_t作为xTaskGetTickCount()的返回值:TickType_t xTaskGetTickCount(void);
这里返回的TickType_t是系统节拍的计数值,不是实际的时间,可以通过pdTICKS_TO_MS()宏转换为实际的时间:TickType_t now = pdTICKS_TO_MS(xTaskGetTickCount() );
TickType_t作为vTaskDelay()的参数:void vTaskDelay(const TickType_t xTicksToDelay);
参数表示的是要延时的系统节拍数,不是真实的时间。可以通过pdMS_TO_TICKS()宏转换为实际的时间:vTaskDelay(pdMS_TO_TICKS(100));//延时100ms
BaseType_t和UBaseType_t的使用场景
BaseType_t类型作用函数的返回值来指示函数调用是否成功BaseType_t xTaskCreate(...);
返回值BaseType_t为pdPASS代表成功,pdFAIL失败。
12345678 | if(xTaskCreate(vLED1Task, "LED1", 128, NULL, 1, NULL) == pdPASS){ ...//任务创建成功的代码}else{ ...//任务创建失败的代码} |
BaseType_t作为参数,用来表示是和否。
例如创建一个软件定时器:TimerHandle_t xTimerCreate (..., BaseType_t xAutoReload);
12345 | //创建Timer1,周期100ms,不自动重装TimerHandle_t xTimer1 = xTimerCreate ("Timer1", pdMS_TO_TICKS(100), pdFALSE, NULL, vTimer1Callback); //创建Timer2,周期50ms,自动重装TimerHandle_t xTimer2 = xTimerCreate ("Timer2", pdMS_TO_TICKS(50), pdTRUE, NULL, vTimer2Callback); |
UBaseType_t用来表示一个非负数BaseType_t xTaskCreate(..., UBaseType_t uxPriority);
12 | xTaskCreate(vLED1Task, "LED1", 128, NULL, 1, NULL);xTaskCreate(vLED3Task, "LED3", 128, NULL, 1, NULL); |
变量命名规则
变量名 = 类型前缀 + 实际名字。例如:void vTask1(void *pvParameters)*pvParameters的pv代表类型前缀 - pointer to void = void * ,Parameters代表变量真实的名字。
| 前缀 | 类型 |
|---|---|
| v | void |
| c | char(int8_t) |
| s | short(int16_t) |
| l | long(int32_t) |
| x | BaseType_t,TickType_t或其他数据类型 |
| e | enmu枚举 |
| p | 指针 |
| u | unsigned无符号数 |
对于int globalVar1 = 36;应该修改为int lGlobalVar1 = 36;,l代表long。
int globalVar2[100];是一个int类型的数组,数组是一种指针,应该修改为int plGlobalVar2[100];
char *argv[],类型是char *类型的数组,char *是一重指针,数组又是一重指针,应该有2个p。应该修改为char *ppcArgv[]
int *pBuffer,类型是int *,应该修改为int *plBuffer
函数命名规则
函数名 = 返回值类型前缀 + 模块名 + 实际名字
如果是静态函数,返回值类型前缀为prv,即private,私有的作用在文件内部的,模块名不用写。
例如,BaseType_t xTaskCreate(...);
x是返回值类型是BaseType_t,Task表示模块的名称为task.c,Create表示函数的真实名称。
例如在my_file.c文件中
1234567891011121314 | static int staticGlobalVar1 = 100; static int Square(int input){ return input * input;} int GetNextSquare(){ static int num = 1; int ret = Square(num); num++; return ret;} |
static int Square(int input)是static静态方法,前缀加prv,应该修改为:static int prvSquare(int input)
int GetNextSquare(),返回值是int,因此前缀为l。模块名为Myfile,因此修改为int lMyfileGetNextSquare()
宏定义命名规则
宏定义名 = 文件名前缀(小写) + 实际名字(大写,单词之间下划线分割)
| pdTRUE/pdFLASE/pdPASS/pdFAIL | configMAX_PRIORITIES | portMAX_DELAY |
|---|---|---|
| pd = projdef.h | config = FreeRTOSConfig.h | port = portmarco.h |