使用xTaskCreate()函数在freeROTS中传递参数的方法详解
一、xTaskCreate()函数
函数的原型如下
xTaskCreate( TaskFunction_t pxTaskCode,
const char * const pcName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */
const configSTACK_DEPTH_TYPE usStackDepth,
void * const pvParameters,
UBaseType_t uxPriority,
TaskHandle_t * const pxCreatedTask )
注意,在不同版本的freeRTOS中函数的参数位置不一样,但是功能都相同。这里我是用的cubemx 配置生的的V2版本。
各个参数的作用如下:
其中被定义为void * const 类型的pvParameters变量就是用来向任务函数传递参数的。关于这个变量类型,可以参考这个链接:
day2:指针常量和常量指针_两个const修饰-CSDN博客文章浏览阅读1.5k次,点赞42次,收藏39次。要分清楚那个值不能被改变,我们只需要看const后面修饰的是什么。常量指针(const int * p)const后面修饰的是int * p,所以p不能被改变,这里的p是地址存放的值,所以值不能被改变;而指针常量(int *const p)const后面修饰的是p,所以p不能被改变,这里的p就是地址,也就是指针的指向。_两个const修饰https://blog.csdn.net/CJY1052925538/article/details/136082456?spm=1001.2014.3001.5502
二、传递方法
(1)传递全局变量
先定义一个需要传进去的全局变量:
int16_t g_Param;
创建任务,并传入全部变量的地址!注意这里需要和xTaskCreate()函数的参数类型保持一次,所以要强制转换为(* void)空指针类型:
xTaskCreate(task_Param, //任务函数名称
"taskParam",//别名吧,不常用
128,//栈大小,可以通过该函数的返回值查看是否溢出
(void *)&g_Param,//传递进来的变量地址,如果不传递,为NULL
osPriorityNormal+1,//优先级
&task_Param_TaskHandle//任务句柄
);
最后编写任务函数,下面是我用来测试的点灯程序(点灯yyds),当然也可以用debug断点来判断程序是否执行。
void task_Param(void *params)
{
while(1)
{
if((*(int16_t*)params)==1)
LED_TIP(On);
else
LED_TIP(Off);
#ifdef DEBUG
(*(g_debug + 3))++;
#endif // DEBUG
}
}
修改全局变量g_Param的值就可以控制led的亮灭,说明函数参数传递成功。
如果需要对传递进来的参数进行运算,要将它强制转化为int16_t类型的的指针,因为空指针是无法直接参与运算的。
空指针是没有指向任何存储单元的指针。如果我们需要使用指针,但是还没确定类型时,可以使用空指针。但是空指针的类型不确定,程序不会分配地址,所以如果使用该指针进行运算,需要进行强制转化。
(2)传递数组
传递数组的方法和传递普通变量的方法相似,首先定义数组类型,然后将地址传递到xTaskCreate()函数中。
int g_buff[] = {4,8,12};
xTaskCreate(task_Param,
"taskParam",
128,
(void *)g_buff, //数组明就是数组的地址,还是数组首个元素的地址,所以这里不用取址符
osPriorityNormal+1,
&task_Param_TaskHandle);
验证方法可以和上面一样使用led或者dubeg在线调试,这里就不赘述了,记得在任务中使用变量的时需要对变量进行类型转化。
作者:YG点灯