[其他ST产品] 0级优化时osDelayUntil进入HardFaults

[复制链接]
555|10
 楼主| SocialButterfly 发表于 2025-6-19 08:00 | 显示全部楼层 |阅读模式
CUBE IDE与FREERTOS(CMSIS_V2)用于Nucleo STM32 F401 RE上
当我在-O 0优化中使用osDelayUntil时,在osDelayUntil执行之后,程序转到HardFault。
这个问题在其他级别的优化时不会出现。
****** in main ******
const osThreadAttr_t defaultTask_attributes = {
  .name = "defaultTask",
  .priority = (osPriority_t) osPriorityNormal,
  .stack_size = 128
};
defaultTaskHandle = osThreadNew(StartDefaultTask, NULL, &defaultTask_attributes);
void StartDefaultTask(void *argument)
{
/* USER CODE BEGIN 5 */
uint32_t tick;
tick = osKernelGetTickCount();
/* Infinite loop */
for(;;)
{
tick += 1000U;           // delay 1000 ticks periodically
osDelayUntil(tick);
  HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
}
/* USER CODE END 5 */
}

xiaoqizi 发表于 2025-8-2 20:19 | 显示全部楼层
当禁用所有优化,GCC/Keil等编译器会严格按源代码顺序生成指令,可能插入大量中间变量和临时寄存器操作,导致堆栈使用量激增
木木guainv 发表于 2025-8-2 22:29 | 显示全部楼层
若任务栈未预留足够容量,这些额外指令会导致栈指针越界,覆盖相邻内存区域,最终触发 HardFault
Jiangxiaopi 发表于 2025-8-3 09:22 | 显示全部楼层
由于 O0 不进行死代码消除,即使某些路径不可达,这些变量仍会被保留并占用栈空间
荣陶陶 发表于 2025-8-3 11:50 | 显示全部楼层
栈向下增长的特性使得超界的局部变量可能改写内核关键数据
Zhiniaocun 发表于 2025-8-3 14:12 | 显示全部楼层
FreeRTOS 的调度器依赖中断实现上下文切换
Zuocidian 发表于 2025-8-3 16:33 | 显示全部楼层
如果在延迟期间发生中断嵌套,且中断服务例程也使用了相同的栈空间,则可能出现双重压栈,加速栈溢出
Puchou 发表于 2025-8-3 19:03 | 显示全部楼层
某项目中 SysTick 定时器中断与主任务同时访问同一寄存器变量,导致栈指针偏移量超过预期值
Xiashiqi 发表于 2025-8-3 21:19 | 显示全部楼层
部分编译器为确保字对齐,会在结构体成员间自动填充字节
小海师 发表于 2025-8-4 07:43 | 显示全部楼层
在 FreeRTOSConfig.h 中增大对应任务的宏定义,建议比默认值提高 50%~100%
Haizangwang 发表于 2025-8-4 09:59 | 显示全部楼层
在 HardFaultHandler 中解析 SPSR和 PC,判断异常发生时的调用链
您需要登录后才可以回帖 登录 | 注册

本版积分规则

58

主题

58

帖子

0

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