日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > windows >内容正文

windows

Cortex-M3 PendSV 中断 系统调用 说明

發(fā)布時間:2024/1/18 windows 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Cortex-M3 PendSV 中断 系统调用 说明 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

參考 Cortex-M3權(quán)威指南中文版

PendSV異常是和系統(tǒng)調(diào)用有些類似,cpu 需要手動將往NVIC 的PendSV 懸起寄存器中寫1,然后產(chǎn)生中斷, 系統(tǒng)調(diào)用(SVC)是cortex-M3? CPU執(zhí)行 SVC指令之后產(chǎn)生中斷(arm中一般是SWI 指令),都是軟件的方式產(chǎn)生的中斷,稱其為內(nèi)中斷。

PendSV 和SVC? 兩個內(nèi)中斷的不同之處在于:

SVC指令執(zhí)行之后,必須立即響應(yīng)(保證能夠立即硬件入棧r0-r3等寄存器,這是因?yàn)镾VC中斷需要傳遞參數(shù)到中斷模式,所以必須立即響應(yīng),保證寄存器中存儲的參數(shù)不被破壞,另一個原因是用戶態(tài)程序,即線程模式的程序有的時候必須得到SVC中斷響應(yīng)函數(shù)的返回值才能繼續(xù)執(zhí)行,否則強(qiáng)行繼續(xù)執(zhí)行,將會出錯),SVC的中斷服務(wù)程序(ISR)立即執(zhí)行,如果此時有別的ISR正在執(zhí)行,且此中斷的優(yōu)先級比SVC的優(yōu)先級高,將會產(chǎn)生硬fault,

(注:SVC通常在用戶級線程模式下運(yùn)行,但可以在特權(quán)級線程模式或者h(yuǎn)andler模式下運(yùn)行,詳見《cortex m3 權(quán)威指南》第12章,非基級的線程模式 一節(jié),如果在一個中斷的ISR中調(diào)用 SVC,而且此ISR的優(yōu)先級比SVC的優(yōu)先級高,那么會產(chǎn)生硬fault,這是合理的,SVC必須立即得到響應(yīng),但是響應(yīng)過程中允許被其他中斷打斷? 例如在svc中斷觸發(fā)后,開始硬件入棧,但svc的ISR還沒有開始執(zhí)行,此時來了個優(yōu)先級比SVC優(yōu)先級更高的中斷,那么優(yōu)先級高的中斷將以 晚到中斷 的形式執(zhí)行, 執(zhí)行完畢后 SVC的ISR再以? 咬尾中斷 的形式執(zhí)行)

SVC中斷 和 其他中斷還有不同之處,? 其他中斷一般都是 不需要參數(shù)和返回值的,? 所以中斷觸發(fā)之后的 硬件入棧 之后 和 執(zhí)行出棧序列 之前,中斷的ISR一般是不修改 保存在棧的R0-R3、xpsr、PC? 和 LR 寄存器的,(也有特殊情況,例如 上述提到過的 《cortex m3 權(quán)威指南》第12章,非基級的線程模式 一節(jié)), 但是SVC中斷是可能需要 參數(shù)或者 返回值的,? 參數(shù)和返回值要借助? R0-R3寄存器來傳遞,? 考慮到cortex-m3的晚到中斷、咬尾中斷等硬件機(jī)制,? SVC觸發(fā)后, SVC的ISR執(zhí)行過程中不能直接讀取R0-R3寄存器獲取參數(shù),而是要到棧中讀取 保存的R0-R3寄存器的值,來獲取參數(shù),SVC的ISR 返回? 返回值的時候,也不能直接 向R0寄存器中寫入返回值,出棧序列執(zhí)行后,R0的值會被棧中保存的R0的值覆蓋,正確的做法是,修改棧中保存的R0的值,修改為要返回的值

注:這里說的 線程模式 handler模式? 特權(quán)級 用戶級的關(guān)系如下:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

SVC一般在用戶線程模式下執(zhí)行。它設(shè)計(jì)的本意就是讓用戶模式完成到普通模式的切換。

PendSV中斷,一般在特權(quán)模式下 往 NVIC 的PendSV 懸起寄存器中寫1,來觸發(fā),一般在SysTick中斷的ISR中執(zhí)行,也就是Handler模式下并且,PendSV的優(yōu)先級一般設(shè)置成最低,PendSV的ISR一般等到其他中斷全部響應(yīng)完成后,再響應(yīng),PendSV(懸起異常)設(shè)計(jì)的理念就是可以將此異常懸起, 這樣就可以完美應(yīng)用在? 上下文切換的場景中。? 上下文切換可以再SVC和SysTick的ISR中完成,這里只說SysTick(系統(tǒng)滴答時鐘中斷),如果SysTick發(fā)生時,程序執(zhí)行在用戶級的線程模式,則沒有問題,如下圖:

? ? ? ? ? ? ? ? ? ? ? ? ??

但是如果,Systick發(fā)生時,是在其他中斷的ISR中,則系統(tǒng)是不允許系統(tǒng)調(diào)用發(fā)生的,如果允許將會產(chǎn)生如下效果:

? ? ? ? ? ? ? ? ? ? ? ? ?

我們可以看到,IRQ中間被中斷了,并且中斷的時間 包含上下文切換以及任務(wù)B的一個時間片,這個時間是不確定的,IRQ的沒有得到及時的響應(yīng),這在實(shí)時系統(tǒng)中是堅(jiān)決不允許的。所以 就引入了 PendSV,如果在SYSTICK來臨的時候,檢測到有IRQ在執(zhí)行,就延緩上下文切換, 在SYSTICK的ISR中 使用PendSV懸起一個異常,等之前的IRQ執(zhí)行完之后,在執(zhí)行上下文切換,如下圖:

? ? ? ? ? ? ? ? ? ?

事件的流水賬記錄如下:
1. 任務(wù) A 呼叫SVC 來請求任務(wù)切換(例如,等待某些工作完成)
2. OS 接收到請求,做好上下文切換的準(zhǔn)備,并且pend 一個PendSV 異常。
3. 當(dāng) CPU 退出SVC 后,它立即進(jìn)入PendSV,從而執(zhí)行上下文切換。
4. 當(dāng) PendSV 執(zhí)行完畢后,將返回到任務(wù)B,同時進(jìn)入線程模式。
5. 發(fā)生了一個中斷,并且中斷服務(wù)程序開始執(zhí)行
6. 在 ISR 執(zhí)行過程中,發(fā)生SysTick 異常,并且搶占了該ISR。
7. OS 執(zhí)行必要的操作,然后pend 起PendSV 異常以作好上下文切換的準(zhǔn)備。
8. 當(dāng) SysTick 退出后,回到先前被搶占的ISR 中,ISR 繼續(xù)執(zhí)行
9. ISR 執(zhí)行完畢并退出后,PendSV 服務(wù)例程開始執(zhí)行,并且在里面執(zhí)行上下文切換
10. 當(dāng) PendSV 執(zhí)行完畢后,回到任務(wù)A,同時系統(tǒng)再次進(jìn)入線程模式。
詳見Cortex-M3權(quán)威指南124頁。

注,這里我想說明的是根據(jù)圖7.16我的個人推論,可能是錯誤的,? 在linux中? 每一個用戶空間的進(jìn)程都有自己的用戶棧,和核心棧,如果cortex-m3結(jié)合rt-thread也是用這個模式,可以印證圖7.16,當(dāng)IRQ執(zhí)行的過程中,Systick異常發(fā)生, IRQ的執(zhí)行上下文現(xiàn)場被保存在任務(wù)A的核心棧中,然后執(zhí)行上下文切換,上下文切換完成后,寄存器MSP和PSP分別指向了任務(wù)B的核心棧指針和用戶棧指針,然后IRQ隨著任務(wù)A被封存而封存,任務(wù)B壓根不知道任務(wù)A的 棧中還封存著一個IRQ,因?yàn)槿蝿?wù)B及時有權(quán)限不應(yīng)該去破話另一個任務(wù)的棧空間。直到任務(wù)A重新得到CPU,IRQ接著在任務(wù)A的棧空間繼續(xù)執(zhí)行,可惜從中斷產(chǎn)生到中斷服務(wù)程序結(jié)束,已經(jīng)隔了十萬八千年。

經(jīng)過實(shí)際驗(yàn)證,Cortex m3結(jié)合rt-thread 應(yīng)該沒有使用和linux一樣的模型,? 而是所有的線程共享內(nèi)核棧,即MSP 執(zhí)行的棧空間所有線程共享,這里和linux-arm有個小區(qū)別,linux-arm 中斷來臨的時候,保存現(xiàn)場都是保存在內(nèi)核棧中,這個內(nèi)核棧是每一個內(nèi)核線程獨(dú)有的, 而 Cortex-m3--rtthread? 是中斷來臨之前使用用戶棧(PSP寄存器所指的棧空間),保護(hù)現(xiàn)場就在用戶棧,中斷來臨之前使用核心棧(MSP寄存器所指),保護(hù)現(xiàn)場就用核心棧,但由于PendSV懸起中斷的引入,所以線程切換的都借助PendSV來完成,這就保證線程切換的PendSV來臨之前保護(hù)現(xiàn)場,一定在用戶棧,用戶棧是每個線程所獨(dú)有的,所以,綜上所述,? 針對線程切換所對應(yīng)的中斷,? linux-arm保存現(xiàn)場都是在核心棧, 而cortex-rtthread都是在用戶棧,但是他們都能保證,保存現(xiàn)場所用 的空間是每一個內(nèi)核線程獨(dú)有的。

?

總結(jié)

以上是生活随笔為你收集整理的Cortex-M3 PendSV 中断 系统调用 说明的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。