前言
在RT-Thread中,全局中斷的操作很多,大家都知道全局中斷的【disable】與【enable】
需要正確的理解全局中斷的disable與enable。
如下,保證鏈表的正確操作,【中斷保護(hù)】
/* 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后,就無法觸發(fā)中斷了嗎?
經(jīng)過實(shí)際的驗(yàn)證,與分析rt_hw_interrupt_disable的實(shí)現(xiàn)方法:得到如下結(jié)論:
rt_hw_interrupt_disable 只是屏蔽了全局【中斷請求】,配置使能的中斷,依舊可以【中斷】,只是,中斷處理函數(shù)ISR,暫不執(zhí)行。
也就是說,如果硬件配置使能了中斷,rt_hw_interrupt_disable 后,依舊具備【中斷】功能。如你配置一個GPIO外部中斷,并使能中斷。rt_hw_interrupt_disable 后,外部中斷可以產(chǎn)生,只是不觸發(fā)執(zhí)行【ISR】。
【重點(diǎn)】:當(dāng)rt_hw_interrupt_disable 后,觸發(fā)的中斷,ISR暫時無法執(zhí)行,但硬件正常置【pending】中斷標(biāo)志位。
當(dāng)rt_hw_interrupt_enable后,【pending】的中斷,會執(zhí)行中斷【ISR】處理程序。
概念的梳理
單個中斷的產(chǎn)生:配置使能硬件中斷,如按鍵,GPIO外部中斷,按下觸發(fā)中斷,硬件置【pending】中斷標(biāo)志位,并執(zhí)行中斷【ISR】
單個中斷的禁止:配置禁能硬件中斷,如按鍵,按下不再觸發(fā)中斷。即使有【ISR】中斷處理函數(shù),不會執(zhí)行。
全局中斷的禁止:也就是不再觸發(fā)任何物理中斷,【沒找到這個功能函數(shù)】!
全局中斷請求的屏蔽:rt_hw_interrupt_disable,觸發(fā)的中斷,只能置【pending】中斷標(biāo)志位,CPU繼續(xù)執(zhí)行操作。
互斥或是臨界值的操作,可以使用屏蔽全局中斷請求+處理+打開全局中斷請求的方式,讓操作獨(dú)占的方式完成操作。
梳理RT-Thread PM中睡眠流程
睡眠操作執(zhí)行在:idle線程(最低線程優(yōu)先級)
進(jìn)入SLEEP前,是禁止全局中斷請求的!rt_hw_interrupt_disable
睡眠前的引腳處理等,進(jìn)入睡眠,CPU停止運(yùn)行,【凍結(jié)】在這里!!
睡眠過程中,依舊可以被【使能的中斷】,如按鍵GPIO外部中斷、LPTimer等觸發(fā)并喚醒CPU。
CPU喚醒后,繼續(xù)下一條操作,【睡眠后的處理】
PM退出睡眠,開啟全局中斷請求rt_hw_interrupt_enable,此時,開啟響應(yīng)中斷ISR。
根據(jù)中斷【pending】標(biāo)志位,進(jìn)入喚醒中斷處理函數(shù)【ISR】并執(zhí)行。
如此,深睡眠時,系統(tǒng)時鐘停了,引腳關(guān)了,喚醒時,恢復(fù)時鐘與引腳即可!【睡眠整個流程是完整的】
不用擔(dān)心會被中斷切出去,甚至任務(wù)切換,造成系統(tǒng)運(yùn)行在錯誤的時鐘下。
不用擔(dān)心關(guān)閉了全局中斷請求,按鍵、LPTimer等,無法觸發(fā)中斷,喚醒MCU。
總結(jié)
需要正確的理解中斷的觸發(fā)及執(zhí)行流程
正確的理解RT-Thead 全局中斷的操作:rt_hw_interrupt_disable 與 rt_hw_interrupt_enable.
-
GPIO
+關(guān)注
關(guān)注
16文章
1216瀏覽量
52282 -
ISR
+關(guān)注
關(guān)注
0文章
38瀏覽量
14458 -
外部中斷
+關(guān)注
關(guān)注
1文章
132瀏覽量
15859 -
RT-Thread
+關(guān)注
關(guān)注
31文章
1305瀏覽量
40313 -
MCU芯片
+關(guān)注
關(guān)注
3文章
253瀏覽量
11590
發(fā)布評論請先 登錄
相關(guān)推薦
評論