新建文本文档.txt
刚开始接触这个STM32Cube+FreeRTOS的时候也是遇到这个问题,这个问题的原因是没有足够的内存分配给栈空间,以下是我的分析过程:
1.出现了调度器无法调度的问题,追查调度函数osKernelStart和vTaskStartScheduler发现错误出现在以下位置:
xReturn = xTaskCreate( prvIdleTask, "IDLE", tskIDLE_STACK_SIZE, ( void * ) NULL, ( tskIDLE_PRIORITY | portPRIVILEGE_BIT ), NULL );
也就是说创建IDLE任务时失败,使得xReturn 不等于 pdPASS,那么vTaskStartScheduler代码后续的:
if(xRetern == pdPass)
{
......
}
就不会执行,调度器就无法工作
2.继续跟踪读IDLE任务分配的代码,一直到函数xTaskGenericCreate,发现程序在这个地方出错:
pxNewTCB = prvAllocateTCBAndStack( usStackDepth, puxStackBuffer );
if(pxNewTCB != NULL)
{
......
}
最后会返回内存不足的错误,如下代码:
xReturn = errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY;
traceTASK_CREATE_FAILED();
这个地方给任务分配TCB控制块和栈的内存空间,产生了失败
3.您可以继续跟踪prvAllocateTCBAndStack函数,看看内存可用空间是怎么定义的
4.我给出的具体方法是减小栈空间字节数或者其他内存节省办法
我将原来是128的栈空间修改成了64就可以成功运行3个任务了,但是我认为随着任务的增多还是会出现这个内存不足的问题,以下是创建任务的代码,供你参考:
while(NULL == defaultTaskHandle)
{
osThreadDef(test_task, test_task, osPriorityNormal, 1, 64);//128);
defaultTaskHandle = osThreadCreate(osThread(test_task), NULL);
}
while(NULL == uc1recv_TaskHandle)
{
osThreadDef(uc1recv_task, uc1recv_task, osPriorityHigh, 1, 64);//128);
uc1recv_TaskHandle = osThreadCreate(osThread(uc1recv_task), NULL);
}
#if 1
while(NULL == uc2recv_TaskHandle)
{
osThreadDef(uc2recv_task, uc2recv_task, osPriorityAboveNormal, 1, 64);//128);
uc2recv_TaskHandle = osThreadCreate(osThread(uc2recv_task), NULL);
}
#endif
osKernelStart();