提示:好记性不如烂笔头。本博客作为学习笔记,有错误的地方希望指正
ESP32-FreeRTOS序列:
ESP32 FreeRTOS-任务的创建与删除 (1)
ESP32 FreeRTOS-任务输入参数(2)
ESP32 FreeRTOS-任务优先级(3)
ESP32 FreeRTOS-调试任务实用工具(4)
前言:
参考资料:FreeRTOS API参考
第一篇的时候我们介绍了任务的创建,细心的小伙伴会发现创建任务会有许多的参数,这里我开始对任务输入参数开始学习讲解。
xTaskCreate API原型:
BaseType_t xTaskCreate( TaskFunction_t pvTaskCode,
const char * const pcName,
configSTACK_DEPTH_TYPE usStackDepth,
void *pvParameters,
UBaseType_t uxPriority,
TaskHandle_t *pxCreatedTask
);
在创建任务的时候,上面的void *pvParameters,就是任务的输入参数,可以看到我们的任务输入参数的类型的 void类型的指针参数,就意味着我们可以传入任意类型的数据。
运用场景可以是接收到某个信号,需要对改信号值进行一些复杂处理,然后处理之后就啥也不干的就可以使用这种方法,接收到数据,创建任务,然后传入参数,进行数值运算,使用队列将数据发送出去,删除任务。这种信号不是经常出现,但是出现就要的对他进行处理。
一、任务传入参数分析
这里传入参数我这里主要介绍4种数据类型。分别是整形数据、整形数组、字符串、结构体。可以通过宏定义来实现不同数据的测试实验。对于数据的传入参数不是指针的需要传入地址,然后将地址转换成(void *)空指针数据类型的,因为创建任务的参数就是空指针类型的,这里需要转换下,是指针数据类型的数据直接传入参数就行例如下面的字符串和数组,数组直接传入数组变量的话就是该数组变量的首地址。此外还要对接收到的数据进行数据解析,发送的数据是什么类型的数据,然后接收的时候就需要转换成对应的数据类型即可。
/**
* @file 2_TaskParameter.c
* @author WSP
* @brief
* @version 0.1
* @date 2022-10-05
*
* @copyright Copyright (c) 2022
*
*/
#include "System_Include.h"
const static char * TAG = "Task_Parameter";
// APP_task 任务的一些变量
TaskHandle_t APP_task_handle = NULL;;
#define PARAMETER_VALUE_STRUCT 1
#if PARAMETER_VALUE_NUMBER
int Parameter_Value = 168;
#elif PARAMETER_VALUE_ARRAY
int Parameter_Value[3] = {
168,168,99};
#elif PARAMETER_VALUE_STR
char * Parameter_Value = "My name is WSP";
#elif PARAMETER_VALUE_STRUCT
typedef struct Parameter{
int Value;
char * str;
}Parameter_Value_t;
Parameter_Value_t Parameter_Value = {
168,"My name is WSP"};
#endif
/**
* @brief APP_task
* @param arg 任务传入的参数
* @return NULL
*/
void APP_task(void * arg)
{
#if PARAMETER_VALUE_NUMBER
int Get_Parameter_Value = *(int *)arg;
ESP_LOGI(TAG,"Get_Parameter_number:%d",Get_Parameter_Value);
#elif PARAMETER_VALUE_ARRAY
int * Get_Parameter_Value = (int *)arg;
ESP_LOGI(TAG,"Get_Parameter_array:%d %d %d",*Get_Parameter_Value, *(Get_Parameter_Value + 1), *(Get_Parameter_Value + 2));
#elif PARAMETER_VALUE_STR
char * Get_Parameter_Value = (char *)arg;
ESP_LOGI(TAG,"Get_Parameter_str:%s",Get_Parameter_Value);
#elif PARAMETER_VALUE_STRUCT
Parameter_Value_t * Get_Parameter_Value = (Parameter_Value_t *)arg;
ESP_LOGI(TAG,"Get_Parameter_Struct value:%d str:%s",Get_Parameter_Value->Value,Get_Parameter_Value->str);
#endif
while (1){
vTaskDelay(1000/portTICK_PERIOD_MS);
ESP_LOGI(TAG,"APP_task");
}
}
/**
* @brief 创建函数初始化
* @param NULL
* @return NULL
*/
void Parameter_Task_Init(void)
{
// 使用 freeREOS的标准API创建任务
xTaskCreate(APP_task, // 创建任务
"APP_task", // 创建任务名
2048, // 任务堆栈
#if PARAMETER_VALUE_NUMBER | PARAMETER_VALUE_STRUCT //传入数字或者结构体
(void *)&Parameter_Value, // 传入任务参数
#elif PARAMETER_VALUE_ARRAY | PARAMETER_VALUE_STR //传入数组或者字符串
(void *)Parameter_Value, // 传入任务参数
#endif
2, // 任务优先级
&APP_task_handle); // 任务句柄
}