你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。
chrome
firefox
safari
ie8及以上
ST
意法半导体官网
STM32
中文官网
ST
全球论坛
登录/注册
首页
技术问答
话题
资源
创客秀
视频
标签
积分商城
每日签到
STM32CubeMx生成F103ZE的代码只能使用2个任务
[复制链接]
沐紫
提问时间:2015-4-22 13:19 /
悬赏
10
ST金币
已解决
使用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 ...
赞
0
收藏
0
评论
3
分享
发布时间:2015-4-22 13:19
举报
请先
登录
后回复
3个回答
魏科
回答时间:2015-4-22 13:19:50
a1024a.1 32b0c
本帖最后由 魏科 于 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();
再次倡议大家不要发什么“帮顶”的回复了,这让这个社区变得很糟粕
赞
0
评论
回复
smare
回答时间:2015-4-22 21:41:24
a1024a.1 32b0c
我之前也需到这个问题。也是一至在到原因,发现FreeRTOS 和ucOSII不是有些差别。有一个总FreeRTOS 堆大小设置配置。configTOTAL_HEAP_SIZE……
TOTAL_HEAP_SIZE 设定。
赞
0
评论
回复
天天晓宇
回答时间:2015-4-23 09:15:54
a1024a.1 32b0c
学习一下,堆栈这个可能就是问题的关键
赞
0
评论
回复
所属标签
相似问题
关于
意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号
手机版
快速回复
返回顶部
返回列表
你好,我开始接触这个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();
再次倡议大家不要发什么“帮顶”的回复了,这让这个社区变得很糟粕