RT-Thread论坛
直播中

贾埃罗

8年用户 1799经验值
私信 关注

在rtthread启动函数中调用HAL_Dealy()导致卡死的原因?

看到文章推荐将系统的左右初始化都放入rt_hw_board_init()内,于是将所有初始化都搬进去,结果由于内部调用了Hal_Delay(),导致卡死,HAL库的时钟源被设置成tiM6,但是TIM6的定时器中断根本进不去,其计数变量自然也不会增加,可是将初始化都放到启动调度之后,也就是main()就一切正常,所以还是不推荐都放入rt_hw_board_init()中。
具体什么原因并不知道

回帖(1)

廖阿朋

2024-9-29 16:31:38
在 RT-Thread 操作系统中,`rt_hw_board_init()` 函数是系统启动时最先调用的函数之一,用于进行硬件初始化。而 `HAL_Delay()` 函数是 HAL 库中用于实现延时的函数,它依赖于定时器中断来实现延时功能。

你遇到的问题可能是由于以下几个原因导致的:

1. **定时器初始化未完成**:在 `rt_hw_board_init()` 函数中调用 `HAL_Delay()` 时,如果定时器(如 TIM6)还没有被正确初始化,那么定时器中断可能无法正常工作,导致延时无法实现。

2. **中断优先级问题**:在 `rt_hw_board_init()` 函数中调用 `HAL_Delay()` 时,如果中断优先级设置不当,可能会导致定时器中断被其他高优先级的中断抢占,从而无法进入定时器中断处理函数。

3. **中断使能问题**:在 `rt_hw_board_init()` 函数中调用 `HAL_Delay()` 时,如果定时器中断没有被正确使能,那么即使定时器计数器达到预设值,也不会触发中断。

4. **系统时钟配置问题**:如果系统时钟配置不正确,可能会导致定时器计数器的计数速度不符合预期,从而影响延时的准确性。

5. **RT-Thread 调度器未启动**:在 `rt_hw_board_init()` 函数中调用 `HAL_Delay()` 时,如果 RT-Thread 的调度器还没有启动,那么延时函数可能无法正常工作,因为 RT-Thread 的调度器负责管理任务的切换和时间片分配。

为了解决这个问题,你可以尝试以下方法:

- **确保定时器初始化**:在调用 `HAL_Delay()` 之前,确保定时器已经被正确初始化。

- **检查中断优先级**:确保定时器中断的优先级设置正确,不会被其他中断抢占。

- **使能定时器中断**:确保定时器中断已经被正确使能。

- **检查系统时钟配置**:确保系统时钟配置正确,以保证定时器计数器的计数速度符合预期。

- **在调度器启动后调用延时函数**:将延时函数的调用放在 `main()` 函数中,确保在 RT-Thread 调度器启动后再调用延时函数。

如果问题仍然存在,建议仔细检查硬件初始化代码和 HAL 库的配置,确保所有必要的初始化都已经完成。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分