前言
在RT-Thread中,全局中斷的操作很多,大家都知道全局中斷的【disable】與【enable】
需要正確的理解全局中斷的disable與enable。
如下,保證鏈表的正確操作,【中斷保護】
/* lock interrupt */
temp = rt_hw_interrupt_disable();
/* remove from old list */
rt_list_remove(&(object- >list));
/* unlock interrupt */
rt_hw_interrupt_enable(temp);
問題與分析:
rt_hw_interrupt_disable后,就無法觸發中斷了嗎?
經過實際的驗證,與分析rt_hw_interrupt_disable的實現方法:得到如下結論:
rt_hw_interrupt_disable 只是屏蔽了全局【中斷請求】,配置使能的中斷,依舊可以【中斷】,只是,中斷處理函數ISR,暫不執行。
也就是說,如果硬件配置使能了中斷,rt_hw_interrupt_disable 后,依舊具備【中斷】功能。如你配置一個GPIO外部中斷,并使能中斷。rt_hw_interrupt_disable 后,外部中斷可以產生,只是不觸發執行【ISR】。
【重點】:當rt_hw_interrupt_disable 后,觸發的中斷,ISR暫時無法執行,但硬件正常置【pending】中斷標志位。
當rt_hw_interrupt_enable后,【pending】的中斷,會執行中斷【ISR】處理程序。
概念的梳理
單個中斷的產生:配置使能硬件中斷,如按鍵,GPIO外部中斷,按下觸發中斷,硬件置【pending】中斷標志位,并執行中斷【ISR】
單個中斷的禁止:配置禁能硬件中斷,如按鍵,按下不再觸發中斷。即使有【ISR】中斷處理函數,不會執行。
全局中斷的禁止:也就是不再觸發任何物理中斷,【沒找到這個功能函數】!
全局中斷請求的屏蔽:rt_hw_interrupt_disable,觸發的中斷,只能置【pending】中斷標志位,CPU繼續執行操作。
互斥或是臨界值的操作,可以使用屏蔽全局中斷請求+處理+打開全局中斷請求的方式,讓操作獨占的方式完成操作。
梳理RT-Thread PM中睡眠流程
睡眠操作執行在:idle線程(最低線程優先級)
進入SLEEP前,是禁止全局中斷請求的!rt_hw_interrupt_disable
睡眠前的引腳處理等,進入睡眠,CPU停止運行,【凍結】在這里!!
睡眠過程中,依舊可以被【使能的中斷】,如按鍵GPIO外部中斷、LPTimer等觸發并喚醒CPU。
CPU喚醒后,繼續下一條操作,【睡眠后的處理】
PM退出睡眠,開啟全局中斷請求rt_hw_interrupt_enable,此時,開啟響應中斷ISR。
根據中斷【pending】標志位,進入喚醒中斷處理函數【ISR】并執行。
如此,深睡眠時,系統時鐘停了,引腳關了,喚醒時,恢復時鐘與引腳即可!【睡眠整個流程是完整的】
不用擔心會被中斷切出去,甚至任務切換,造成系統運行在錯誤的時鐘下。
不用擔心關閉了全局中斷請求,按鍵、LPTimer等,無法觸發中斷,喚醒MCU。
總結
需要正確的理解中斷的觸發及執行流程
正確的理解RT-Thead 全局中斷的操作:rt_hw_interrupt_disable 與 rt_hw_interrupt_enable.
-
GPIO
+關注
關注
16文章
1216瀏覽量
52377 -
ISR
+關注
關注
0文章
38瀏覽量
14471 -
外部中斷
+關注
關注
1文章
132瀏覽量
15886 -
RT-Thread
+關注
關注
31文章
1305瀏覽量
40386 -
MCU芯片
+關注
關注
3文章
253瀏覽量
11627
發布評論請先 登錄
相關推薦
評論