任务的输入参数

任务的输入参数

在一个任务创建的时候,任务会有输入参数 整数 [[4. 任务的输入参数#^4e8cbd]] 数组 [[4. 任务的输入参数#^87d32c]] 结构体 [[4. 任务的输入参数#^2b6f48]] 字符串 [[4. 任务的输入参数#^3928c1]] 注意: 因为pvParameters形参被定义为

在一个任务创建的时候,任务会有输入参数

  1. 整数 [[4. 任务的输入参数#^4e8cbd]]
  2. 数组 [[4. 任务的输入参数#^87d32c]]
  3. 结构体 [[4. 任务的输入参数#^2b6f48]]
  4. 字符串 [[4. 任务的输入参数#^3928c1]]

注意:
因为pvParameters形参被定义为(void *)类型,因此可以接受任何类型的指针地址。但要注意的是,在任务中使用该传入的参数时,应当对其进行类型转换。[[3. FreeRTOS中Task的创建与删除#^168f8e]]


整数类型

^4e8cbd

示例代码

#include <stdio.h>
#include <inttypes.h>
#include "sdkconfig.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_chip_info.h"
#include "esp_flash.h"
#include "esp_system.h"

void myTask1(void *pvPara)
{
    int delay = 3;
    while (delay--) {
        printf("task delete in %d second(s).\n", delay);
		/**
		 * 可以看到此处进行了强制类型转换
		 * 先将 pvPara 转换为 (int *) 类型指针
		 * 再使用 * 取值
		 */
        printf("num = %d\n", *(int *)pvPara);
        vTaskDelay(1000 / portTICK_PERIOD_MS);
    }
	// 任务执行完毕后自我删除
    vTaskDelete(NULL);
}

static int num = 10;

void app_main(void)
{
    printf("Hello world! It's ESP32!\n");

    xTaskCreate(myTask1, "myTask1 say hello", 2048, (void *)&num, 1, NULL);
}

示例输出

4. 任务的输入参数-20240612120328920.webp


数组类型

^87d32c

示例代码

#include <stdio.h>
#include <inttypes.h>
#include "sdkconfig.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_chip_info.h"
#include "esp_flash.h"
#include "esp_system.h"

void myTask1(void *pvPara)
{
    int delay = 3;
    int *pInt = (int *)pvPara; // 将 pvPara 指针类型强制转换为 (int *) 后,赋值给指针 pInt
    int nums_count = 0; // 数组下标

    while (delay--) {
        printf("task delete in %d second(s).\n", delay);
        printf("nums[%d] = %d\n",  nums_count, *pInt);
        pInt++; // 地址自增1
        nums_count++;

        vTaskDelay(1000 / portTICK_PERIOD_MS);
    }
    vTaskDelete(NULL); // 任务完成后自我删除
}

static int nums[3] = { 6, 7, 8 };

void app_main(void)
{
    printf("Hello world! It's ESP32!\n");

	// 如果指针直接指向数组,相当于直接指向数组第一个元素,此处引用数组时并未加 & ,则相当于直接将数组第 0 个元素的地址传给形参
	xTaskCreate(myTask1, "myTask1 say hello", 2048, (void *)nums, 1, NULL);
}

示例输出

4. 任务的输入参数-20240612121932521.webp


结构体类型

^2b6f48

示例代码

#include <stdio.h>
#include <inttypes.h>
#include "sdkconfig.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_chip_info.h"
#include "esp_flash.h"
#include "esp_system.h"

// 定义一个结构体,命名为 xStruct
typedef struct A_struct {
    int num1;
    int num2;
} xStruct;

// 创建结构体 xStrtest 并为其成员赋值
xStruct xStrtest = { 6, 9 };

void myTask1(void *pvPara)
{
    int delay = 3;
    xStruct *pxStr = (xStruct *)pvPara; // 创建一个 xStruct 类型的指针,将 pvPara 强制转换为 (xStruct *) 类型并赋值给 pxStr

    while (delay--) {
        printf("task delete in %d second(s).\n", delay);
        // 打印结构体成员数据
        printf("1st member in struct: %d\n", pxStr->num1);
        printf("2nd member in struct: %d\n", pxStr->num2);

        vTaskDelay(1000 / portTICK_PERIOD_MS);
    }
    vTaskDelete(NULL); // 任务运行完毕后自我删除
}

void app_main(void)
{
    printf("Hello world! It's ESP32!\n");

	// 将结构体变量的地址传给形参
    xTaskCreate(myTask1, "myTask1 say hello", 2048, (void *)&xStrtest, 1, NULL);
}

示例输出

4. 任务的输入参数-20240612124307105.webp


字符串类型

^3928c1

示例代码

#include <stdio.h>
#include <inttypes.h>
#include "sdkconfig.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_chip_info.h"
#include "esp_flash.h"
#include "esp_system.h"

// 定义静态全局字符串变量
static char *cTxt = "Hello, world!";

void myTask1(void *pvPara)
{
    int delay = 3;
    char *pcTxt = (char *)pvPara; // 将 pvPara 强制转换为 (char *) 后赋值给 (char *) 类型指针 pcTxt

    while (delay--) {
        printf("task delete in %d second(s).\n", delay);
        printf("%s\n", pcTxt); // 打印字符串

        vTaskDelay(1000 / portTICK_PERIOD_MS);
    }
    vTaskDelete(NULL); // 任务结束后自我删除
}

void app_main(void)
{
    printf("Hello world! It's ESP32!\n");

	// 将字符串地址强制转换为 (void *) 后传给形参
    xTaskCreate(myTask1, "myTask1 say hello", 2048, (void *)cTxt, 1, NULL);
}

关于打印字符串指针,这里有详解 [[字符串#^89afed]]

示例输出

4. 任务的输入参数-20240612125242618.webp

Comment