你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32CubeMx生成F103ZE的代码只能使用2个任务

[复制链接]
沐紫 提问时间:2015-4-22 13:19 /
10ST金币
使用F103ZE系列芯片,用STM32CubeMx生成F1的代码只能使用2个任务,添加三个任务整个程序就死掉了。并且可以确定在osKernelStart()死掉。

这是网友在FAQ栏目中的提问,欢迎大家去FAQ帮助解答:https://www.stmcu.org.cn/faq/index/detail/id-70519



最佳答案

查看完整内容

你好,我开始接触这个STM32Cube+FreeRTOS的时候也是遇到这个问题,这个问题的原因是没有足够的内存分配给栈空间,以下是我的分析过程: 1.出现了调度器无法调度的问题,追查调度函数osKernelStart和vTaskStartScheduler发现错误出现在以下位置: xReturn = xTaskCreate( prvIdleTask, "IDLE", tskIDLE_STACK_SIZE, ( void * ) NULL, ( tskIDLE_PRIORITY | portPRIVILEGE_BIT ), NULL ); 也就是说创建IDLE任务时失败,使得xReturn ...
收藏 评论3 发布时间:2015-4-22 13:19

举报

3个回答
魏科 回答时间:2015-4-22 13:19:50
本帖最后由 魏科 于 2015-4-22 18:57 编辑

你好,我开始接触这个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();
再次倡议大家不要发什么“帮顶”的回复了,这让这个社区变得很糟粕
smare 回答时间:2015-4-22 21:41:24
我之前也需到这个问题。也是一至在到原因,发现FreeRTOS 和ucOSII不是有些差别。有一个总FreeRTOS 堆大小设置配置。configTOTAL_HEAP_SIZE……
TOTAL_HEAP_SIZE 设定。



未标题-1.png
天天晓宇 回答时间:2015-4-23 09:15:54
学习一下,堆栈这个可能就是问题的关键

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版