FreeRTOS创建任务保存以及任务堆栈大小记录

一、问题出处,堆设置小导致任务创建失败

今天在修改公司程序时,当我新建一个任务时,编译下载发现有一个任务创建失败,返回的句柄一直是空,程序如下图

 osThreadId udp_serverTaskHandle=NULL;

 udp_serverTaskHandle=sys_thread_new("udp_printf_thread", udp_printf_thread, NULL, 384, 3);


if(udp_serverTaskHandle==NULL)

{
        printf("udp_serverTaskHandle error\n");

}

在我运行时候,串口输出的任务创还能错误,一直查最终排查出问题,

原来任务有5个,设置的堆大小为:

#define configTOTAL_HEAP_SIZE                    ((size_t)(20*1024))//单位: Byte

当我添加上一个新的任务时,即此时共6个任务,但是由于堆不够,导致最后一个任务一个创还能失败

当我将堆的大小增大后,问题就解决了。

问题:怎么判断堆大小不够或者不合适?

答:这个我也不是很清楚,但是我们可以进行测试,在每个任务创建后,记得判断下句柄,看是否创建成功,因为堆大小设置太小程序会报错,或者像我这样任务失败

二、栈的大小设置

//空闲任务使用的栈大小
#define configMINIMAL_STACK_SIZE                ((unsigned short)128)
/* 定义空闲任务的栈空间大小, 单位: Word, 无默认需定义 
注意:这个配置的单位是字,而不是字节!在RAM中,一个字是4byte!!!

正常是选择128个字最少,但是要综合评估自己MCURAM大小

以上的堆栈大小都是占用MCU的RAM,所以要确定预留一半RAM大小

三、任务创建设置的栈

    osThreadDef(Usart_task, usart_task, osPriorityLow, 0, 300);//osPriorityHigh  //串口解析任务
    usart_tasktasktTaskHandle = osThreadCreate(osThread(Usart_task), NULL);

这里的300是300字节,是栈的大小,这里用于在当前任务中比如临时申请的静态变量等,当你需要再任务创建临时变量大,你这个数值就需要加大,否则程序会跑飞

你可能感兴趣的:(单片机,嵌入式硬件)