一、问题出处,堆设置小导致任务创建失败
今天在修改公司程序时,当我新建一个任务时,编译下载发现有一个任务创建失败,返回的句柄一直是空,程序如下图
?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字节,是栈的大小,这里用于在当前任务中比如临时申请的静态变量等,当你需要再任务创建临时变量大,你这个数值就需要加大,否则程序会跑飞