1. 总括
Task的参数输入方式就是将外部数据输入到xTaskCreate()
的void * const pvParameters
参数中去,并且有以下几点特性:
- 可以输入任何类型数据
- 输入数据必须强制转换为
void *
类型数据 - 以地址形式输入
2. 输入流程
- 定义一个变量
- 将变量强制转换为
void *
类型 - 将变量以地址形式输入到
xTaskCreate()
的void * const pvParameters
参数中去 - 在Task中定义一个对应数据类型的指针型变量
- 在Task的
pvParameters
参数强制转换为对应数据类型的指针型,并赋值给指针型变量
3. 示例
1.普通变量
void Task_name(void *pvParam)
{
int * pInt; //定义指针变量
pInt = (int *)pvParam; //将pvParam赋值给pInt
while(1){
printf("pvParam = %d \n",*pInt); //因为pInt是地址,使用时要先获取地址对应的值
vTaskDelay(1000);
}
}
void main()
{
int num = 1; //定义输入变量
xTaskCreate(Task_name,"Task_name",512,(void *)&num,2,NULL); //转换类型,输入变量地址
}
2. 数组
void Task_name(void *pvParam)
{
int * pArray; //定义指针变量
pArray = (int *)pvParam; //将pvParam赋值给pArray
while(1){
printf("First element of array = %d \n",*pArray); //因为pArray是地址,使用时要先获取地址对应的值
printf("Second element of array = %d \n",*(pArray+1)); //因为pArray是地址,使用时要先获取地址对应的值
vTaskDelay(1000);
}
}
void main()
{
int array[2] = {1,2}; //定义输入变量
xTaskCreate(Task_name,"Task_name",512,(void *)array,2,NULL); //转换类型,数组名本就是地址,不用再取地址
}
3. 结构体
typedef struct A_STRUCT{ //创建一个结构体
int num1;
int num2;
}xStruct;
void Task_name(void *pvParam)
{
xStruct *pStruct; //定义指针型结构体
pStruct = (xStruct *)pvParam; //将pvParam赋值给pStruct
while(1){
printf("First variable of struct = %d \n",pStruct->num1); //使用->运算符,访问指针型结构体中的变量
printf("Second variable of struct = %d \n",pStruct->num2);
vTaskDelay(1000);
}
}
void main()
{
xStruct xStruct_test = {0,1}; //定义一个结构体变量
xTaskCreate(Task_name,"Task_name",512,(void *)&xStruct_test,2,NULL); //转换类型,输入变量地址
}
4. 数组
strict const char *pcTxt = "Holle World!";
void Task_name(void *pvParam)
{
char * pTxt; //定义指针变量
pTxt = (char *)pvParam; //将pvParam赋值给pTxt
while(1){
printf("pvParam = %s \n",pTxt);
vTaskDelay(1000);
}
}
void main()
{
xTaskCreate(Task_name,"Task_name",512,(void *)pcTxt,2,NULL); //转换类型,输入变量地址
}