1. 问题:串口乱码,或者延时时间不准确
解决:查看外部晶振配置是否正确,文件stm32f4xx.h
中HSE_VALUE
要与实际的晶振大小相同。
#define HSE_VALUE ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */
同时,system_stm32f4xx.c
文件中PLL_M
页要修改为对应值。
#define PLL_M 8
涉及公式:
PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N
SYSCLK = PLL_VCO / PLL_P
2. 中断锁与调度器锁
rt_hw_interrupt_disable()
称为中断锁
,实现主要是CPSID I
指令,所以上锁后系统不再响应其他中断。rt_exit_critical()
称为调度器锁
,实现主要是rt_scheduler_lock_nest++
,在系统调度函数rt_schedule()
中会判断rt_scheduler_lock_nest
是否为 0,如果不为 0 则不进行线程切换,所以调度器上锁后只是不进行线程调度,还是会响应其他中断。在解锁函数rt_exit_critical()
中会调用rt_schedule()
,看是否有线程需要切换。