STM32+HAL+FreeRTOS,已经修改了系统时钟为定时器,为什么还卡死在HAL_Delay()

问题

使用CubeMX创建了STM32的工程,启用了FreeRTOS,使用的是HAL库,运行后发现卡死在HAL_Delay(),修改了Timebase Source后正常了,后来加入了USB,又卡死了,参考这篇文章解决,后来我又加了一个串口进行通信测试,发现又卡死了,唉。。。

具体原因

其实,通过上述的两种配置后,不应该出现HAL_Delay()卡死的问题了,如果你确实遇到了,可以看看是不是和我相同的问题。

我的问题其实是因为调用HAL_Delay()的地方太靠前了,在osKernelStart();调用之前调用的,这样是会有问题的,事实也验证了这一点,具体原因我们参考一下文心一言的回答吧:

在嵌入式系统或RTOS(实时操作系统)环境中,通常不建议在osKernelStart(或任何RTOS内核启动函数)之前调用与硬件抽象层(HAL)相关的函数,如HAL_Delay()。原因有以下几点:

RTOS未初始化:在RTOS内核启动之前,RTOS提供的服务(如任务调度、时间管理、中断管理等)都还没有被初始化。因此,依赖于RTOS服务的函数(如HAL_Delay(),如果它依赖于RTOS的时间管理)可能不会按预期工作。

系统状态不确定:在RTOS启动之前,系统的状态是不确定的。此时,调用某些函数可能会导致不可预测的行为或系统崩溃。

HAL函数依赖RTOS:某些HAL函数可能依赖于RTOS提供的服务。在RTOS启动之前调用这些函数可能会导致问题。

不恰当的延迟:HAL_Delay()函数通常用于在RTOS环境中创建延迟。但是,在RTOS启动之前,你可能没有有效的任务调度器或时间管理功能,因此延迟可能无法正确实现。

如果你需要在RTOS启动之前进行某种形式的延迟,你可能需要考虑使用以下方法:

忙等待:使用简单的循环来创建延迟。这种方法会阻塞CPU,但在RTOS启动之前,这可能是唯一可行的方法。

c

for (volatile uint32_t i = 0; i < SOME_LARGE_NUMBER; i++) {

// 空循环,创建延迟

}

硬件定时器:如果硬件支持,并且你有足够的硬件知识,你可以直接使用硬件定时器来创建延迟。但是,请注意,这种方法需要你对硬件有深入的了解,并且可能需要编写特定的硬件相关代码。

调整启动顺序:如果可能的话,尝试调整你的启动顺序,以便在需要延迟之前启动RTOS。这样,你就可以使用RTOS提供的服务来创建延迟。

总的来说,在RTOS启动之前调用HAL_Delay()(或任何依赖于RTOS服务的函数)通常是不安全的,并且可能会导致不可预测的行为或系统崩溃。你应该尽量避免这样做,并寻找其他方法来满足你的需求。

总结

关于卡死在HAL_Delay()的问题,网上有很多类似的解决方法,资料还是挺多的,如果你尝试了所有的方法还是没有解决,那就看看是不是和我的问题相同吧,提供一个思路。

相关推荐
jianqiang.xue40 分钟前
收官:从v0.1到“研发新常态“,一套嵌入式智能体的落地与边界
stm32·单片机·物联网·架构·esp32
HUI-4741 小时前
EG1131|SOT23‑6 30V/1.5A 电流模式同步降压 DC‑DC,小体积消费类电源优选
嵌入式硬件·硬件工程
天空'之城1 小时前
单片机基础核心知识点汇总(三十)
单片机·嵌入式硬件
笨笨饿1 小时前
#137_死机恢复现场_Armino平台AP系统swd调试
git·python·stm32·单片机·嵌入式硬件·物联网·vim
linnux领域1 小时前
面包板供电“插哪都不亮“?一个暗断点引发的排查——硬件新手三板斧
单片机·嵌入式硬件·esp32·arduino·面包板·硬件入门
Jaixln_HRF1 小时前
芯维尔CN8010 1.2A/6V同步降压转换器芯片,集成350/230mΩ MOSFET与1.5MHz高频,用于汽车电子/IoT/便携仪器
嵌入式硬件·物联网·硬件工程
ACP广源盛139246256733 小时前
M6/M5 Pro Mac mini 端侧 AI 落地@ACP#IX6024 PCIe2.0 交换芯片在轻量化 AI 服务中的机会与应用场景
大数据·数据库·人工智能·嵌入式硬件·macos·开源
深圳市恒锐丰科技杨生3 小时前
EG2124A 260V 三相独立半桥栅极驱动芯片|BLDC 外置 MOS 三相桥驱动方案
嵌入式硬件·硬件工程
学linux的QQ蛋4 小时前
吃透传输层:UDP 无连接、TCP 可靠传输、套接字函数、粘包问题详解
单片机·tcp/ip·udp
kruptos4 小时前
嵌入式 Linux 驱动开发:第一个内核模块怎么写?
linux·运维·驱动开发·嵌入式硬件