[STM32F1] stm32cubeide 生成的 _sbrk 与 FreeRtos 不兼容吗

[复制链接]
573|13
 楼主| 铁头电子player 发表于 2025-5-31 02:00 | 显示全部楼层 |阅读模式
Stm32CubeIde 生成了 _sbrk(int incr) 函数。工程中使用了 FreeRtos。
_sbrk 检查堆栈指针。
if (heap_end + incr > stack_ptr)
   {
      errno = ENOMEM;
      return (caddr_t) -1;
   }
但是 FreeRtos 为堆中的每个任务分配堆栈。最终要分配内存的任务的某些堆栈指针将小于heap_end。
编译提示各种错误

t60yz 发表于 2025-5-31 23:37 | 显示全部楼层
heap_end + incr > stack_ptr 的检查 容易误报溢出(ENOMEM),导致 malloc() 返回 NULL。
三生万物 发表于 2025-6-9 12:30 | 显示全部楼层
在使用STM32CubeIDE和FreeRTOS时,遇到_sbrk函数的问题,通常是由于内存管理和堆栈分配之间的冲突导致的
远山寻你 发表于 2025-6-9 13:00 | 显示全部楼层
_sbrk是C库的一部分,用于管理堆内存,而FreeRTOS为每个任务分配独立的堆栈空间。两个机制在内存管理上可能产生冲突,尤其是在内存不足或配置不当时
江河千里 发表于 2025-6-9 14:21 | 显示全部楼层
其实_sbrk用于管理堆内存的扩展。它通过检查堆的结束指针(heap_end)和堆栈指针(stack_ptr)来确保堆内存不会溢出到堆栈区域
淡漠安然 发表于 2025-6-9 15:32 | 显示全部楼层
错误提示表明heap_end + incr > stack_ptr,意味着请求的堆内存扩展超出了堆栈指针的位置。
暖了夏天蓝了海 发表于 2025-6-9 16:00 | 显示全部楼层
FreeRTOS为每个任务分配独立的堆栈空间。如果堆栈分配不当,可能会导致堆栈指针低于堆的结束指针,从而触发_sbrk中的错误检查
别乱了阵脚 发表于 2025-6-9 21:00 | 显示全部楼层
在STM32CubeIDE中,可以通过调整链接器脚本(.ld文件)来增加堆的大小
冰春彩落下 发表于 2025-6-9 22:00 | 显示全部楼层
在FreeRTOSConfig.h中,确保configMINIMAL_STACK_SIZE和任务特定的堆栈大小足够大
夜阑风雨 发表于 2025-6-9 23:00 | 显示全部楼层
这通常是由于堆栈大小设置不当或堆大小设置不当引起的
光辉梦境 发表于 2025-6-10 00:31 | 显示全部楼层
查找_end和_estack的定义,并确保堆的大小足够满足应用程序的需求
一秒落纱 发表于 2025-6-10 13:00 | 显示全部楼层
确保FreeRTOS任务的堆栈大小足够大。可以在FreeRTOS配置中增加任务的堆栈大小。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

48

主题

50

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部