打印
[其他ST产品]

0级优化时osDelayUntil进入HardFaults

[复制链接]
257|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 不进行死代码消除,即使某些路径不可达,这些变量仍会被保留并占用栈空间

使用特权

评论回复
5
荣陶陶| | 2025-8-3 11:50 | 只看该作者
栈向下增长的特性使得超界的局部变量可能改写内核关键数据

使用特权

评论回复
6
Zhiniaocun| | 2025-8-3 14:12 | 只看该作者
FreeRTOS 的调度器依赖中断实现上下文切换

使用特权

评论回复
7
Zuocidian| | 2025-8-3 16:33 | 只看该作者
如果在延迟期间发生中断嵌套,且中断服务例程也使用了相同的栈空间,则可能出现双重压栈,加速栈溢出

使用特权

评论回复
8
Puchou| | 2025-8-3 19:03 | 只看该作者
某项目中 SysTick 定时器中断与主任务同时访问同一寄存器变量,导致栈指针偏移量超过预期值

使用特权

评论回复
9
Xiashiqi| | 2025-8-3 21:19 | 只看该作者
部分编译器为确保字对齐,会在结构体成员间自动填充字节

使用特权

评论回复
10
小海师| | 2025-8-4 07:43 | 只看该作者
在 FreeRTOSConfig.h 中增大对应任务的宏定义,建议比默认值提高 50%~100%

使用特权

评论回复
11
Haizangwang| | 2025-8-4 09:59 | 只看该作者
在 HardFaultHandler 中解析 SPSR和 PC,判断异常发生时的调用链

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

35

主题

35

帖子

0

粉丝