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()
,看是否有線程需要切換。