ESP32 FreeRTOS-任务输入参数(2)

提示:好记性不如烂笔头。本博客作为学习笔记,有错误的地方希望指正

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);          // 任务句柄
}

猜你喜欢

转载自blog.csdn.net/believe666/article/details/127189240
今日推荐