在一个任务创建的时候,任务会有输入参数
- 整数 [[4. 任务的输入参数#^4e8cbd]]
- 数组 [[4. 任务的输入参数#^87d32c]]
- 结构体 [[4. 任务的输入参数#^2b6f48]]
- 字符串 [[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);
}
示例输出
数组类型
^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);
}
示例输出
结构体类型
^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);
}
示例输出
字符串类型
^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]]