使用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点灯

物联沃分享整理
物联沃-IOTWORD物联网 » 使用xTaskCreate()函数在freeROTS中传递参数的方法详解

发表回复