你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。
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管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
微信公众号
手机版
快速回复
返回顶部
返回列表
你好,我开始接触这个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();
再次倡议大家不要发什么“帮顶”的回复了,这让这个社区变得很糟粕
TOTAL_HEAP_SIZE 设定。