技術頻道

娓娓工業(yè)
您現(xiàn)在的位置: 中國傳動網(wǎng) > 技術頻道 > 應用方案 > ARMCortex-M4中斷的解決辦法

ARMCortex-M4中斷的解決辦法

時間:2018-08-14 15:50:06來源:網(wǎng)絡轉載

導語:?對于中斷優(yōu)先級配置的需求實際上主要體現(xiàn)在系統(tǒng)存在多個可能的中斷源情況下,這時為了保證代碼的可靠執(zhí)行,我們不得不考慮很現(xiàn)實的兩個問題,一個是如果兩個以上中斷同時發(fā)生,pending請求到CPU,CPU決策該先進哪一個相應的中斷服務Routine,第二個問題是CPU當前已經(jīng)在響應某個中斷服務。

其實都搞了這么長時間的ARM開發(fā),關于其至關重要的中斷優(yōu)先級問題我早就想跟大家伙分享分享了,可惜一方面想真正的講清楚這個問題估計又得大費周章和墨水,另一方面自己越來越忙進一步導致寫文章倒是越來越懶了。

對于中斷優(yōu)先級配置的需求實際上主要體現(xiàn)在系統(tǒng)存在多個可能的中斷源情況下,這時為了保證代碼的可靠執(zhí)行,我們不得不考慮很現(xiàn)實的兩個問題,一個是如果兩個以上中斷同時發(fā)生,pending請求到CPU,CPU決策該先進哪一個相應的中斷服務Routine,第二個問題是CPU當前已經(jīng)在響應某個中斷服務,此時來了另一個中斷請求,是否允許其打斷當前中斷服務轉而響應新的中斷請求即我們常說的中斷嵌套問題,不要告訴我沒考慮過哈(如果真是這樣,我只能不客氣的說,這樣搞單片機是不負責任的,很可能給項目帶來潛在的風險bug),那樣的話俺也白寫了,呵呵。那正題來了,對現(xiàn)在紅紅火火的ARMCortex-M4和M0+兩個核來說,他們是如何解決這兩個問題的呢,因為這兩個核在中斷優(yōu)先級管理上略有些區(qū)別(雖然都是NVIC和SCB兩個寄存器來管理),所以下面我分開來說,另外由于中斷優(yōu)先級管理屬于內(nèi)核問題,所以這方面的信息你不會在各大半導體廠家的官方手冊中找到,我們只能追根溯源直接到內(nèi)核的老家ARM官網(wǎng)去找,建議大家有興趣的到ARM官網(wǎng)把M4和M0+的內(nèi)核手冊下載下來簡單瞅瞅,可能會有意想不到的收獲哦,呵呵:

ARMCortex-M0+中斷優(yōu)先級和嵌套

無論是M0+或者是M4內(nèi)核,實際上他們兩個的中斷優(yōu)先級都是由NVIC和SCB兩個寄存器來管理的,在這里我默認大家都知道ARM的中斷源分為內(nèi)核中斷和IRQ中斷了哈(我怕再細講下去又沒完了,呵呵),而對IRQ的中斷管理是由NVIC來主導的,內(nèi)核的中斷管理則是由SCB來主導的,我們先講IRQ中斷的優(yōu)先級問題(關于中斷使能和禁能不在本篇討論范圍內(nèi)哈),打開M0+的內(nèi)核手冊找到NVIC_IPR寄存器(InterruptPriorityRegisters)如下圖所示:

注意觀察我高亮標注的幾塊,從這幾塊中可以抽象出核心的幾個問題,第一個是NVICIPR一共有8個寄存器,而每個寄存器管理4個IRQ中斷,乘法口訣算一下,我們就明白了為啥M0+的IRQ中斷源最多只支持32個了,再加上16個內(nèi)核中斷,加法口訣再算一下,也就是說M0+最多就是48個中斷源,所以M0+算是比較好搞的了,一會兒講M4就該頭疼了,呵呵;第二個問題是優(yōu)先級寄存器里面的配置值越低表明相應的中斷優(yōu)先級越高;第三個問題是每個PRIxx的8位中只有最高兩位[7:6]有效,也就是說實際上M0+的優(yōu)先級只有四個即0,1,2,3,4,其中0的優(yōu)先級是最高的;第四個問題,為啥我放到最后說呢,因為這是比較容易忽略的問題,即word-accessible,也就是說這幾個寄存器都只能按字操作,切記不要為了顯示我們的編程技巧而使用指向字節(jié)的指針只對某個單獨中斷的優(yōu)先級進行配置。

至于嵌套的問題,對M0+是比較簡單的,即只要相應中斷的優(yōu)先級比較高即可隨時搶占比它優(yōu)先級低的中斷服務。至于內(nèi)核中斷,其中斷優(yōu)先級則由SCB模塊的SCB_SHPR寄存器來管理如下圖所示,實際上我們平時常用的就是systemtick中斷,其優(yōu)先級配置同NVIC,這里就不贅述了。另外,我這里提一下,即如果我們不對優(yōu)先級進行配置的話,則默認相應中斷源的向量號越低其優(yōu)先級越高,不過如前面我提到的,我是強烈建議在多中斷的情況最好把每個用到的中斷優(yōu)先級都根據(jù)實際需求進行相應配置,避免潛在的風險。

ARMCortex-M4中斷優(yōu)先級和嵌套

我前面提到一句,M4雖然指令集是向下兼容M0+的,但是在中斷優(yōu)先級管理上是有區(qū)別的,由于M4的中斷源比較多(最多允許256),所以其對中斷優(yōu)先級管理是略有些復雜的,不過一定要仔細看下去,因為我們平時會比較常用到,但是我敢肯定不是所有人的用法是正確的,為啥?待我下面繼續(xù)分解(放心,還沒完呢,呵呵),先繼續(xù)上圖:

繼續(xù)找上圖亮點,一個是M4最高支持16+4*60=256個中斷源,第二個這60個寄存器是可以按字節(jié)操作的(我們可以繼續(xù)的裝逼用指針了,哈哈),第三個跟M0+一樣即值越小優(yōu)先級越高,最后則是最大的區(qū)別,即每個寄出去你的8位數(shù)據(jù)都是可以定義其中斷優(yōu)先級了,說到這里,aquestionisraised,那是不是意味著M4的優(yōu)先級最高可以256個級別呢。我只能說,大家想多了,呵呵,繼續(xù)看下圖吧,可見PRIGROUP定義了這8位數(shù)據(jù)到底該怎么用了,這里出現(xiàn)了兩個新名詞,即GroupPriority和Subpriority,至于這兩個優(yōu)先級是什么意思那大家繼續(xù)看圖2,大家先仔細理解理解,我喝口水先。。。Ok,繼續(xù)回來,從下面兩張圖可以看到在M4內(nèi)核中,其對中斷優(yōu)先級管理是分了兩個部分,一個是組優(yōu)先級一個是子優(yōu)先級,即組優(yōu)先級是管理搶占優(yōu)先級的(即是否能嵌套),即高的組優(yōu)先級中斷(數(shù)值低)可以搶占低的組優(yōu)先級(數(shù)值高)中斷的,而如果組優(yōu)先級是一樣的,即使子優(yōu)先級比正在執(zhí)行的中斷的子優(yōu)先級高也是不能搶占的,那又有同志們要問問題了,那子優(yōu)先級有啥用?呵呵,正如圖2所說,在組優(yōu)先級一致的情況下,多個中斷請求同時發(fā)生,這樣的情況下子優(yōu)先級高的可以先執(zhí)行的,而子優(yōu)先級低的則只能暫時pending等著了,呵呵。而回到PRIGROUP的作用是用來配置NVIC的8位數(shù)據(jù)域是如何分配給搶占優(yōu)先級和子優(yōu)先級的,而一般情況下,最好是各留4位給這二位大爺和小爺了,即每位爺最多可配16個優(yōu)先級,而PRIGROUP是從哪來的呢,呵呵,實際上它是SCB_AIRCR寄存器的其中3位如圖3所示。

呼。。。終于搞完了,總算把這個問題給寫出來了,我腦袋里可以騰出點地方給其他問題了,哈哈。另外實際上我上面寫了這么多理論的東西,但是ARM早已在CMSIS庫里的頭文件中把這部分函數(shù)API給出來了(core_cm4.h和core_cm0plus.h),而我之所以不閑麻煩的還是把這個寫出來,還是我這個知其然也要知其所以然的思想在作怪了。不過最后,我還是給出M0+和M4的中斷優(yōu)先級配置的兩個配置供廣大博友參考吧,然后其他就不多聊了,未完待續(xù):

M0+

NVIC_SetPriority(PORTA_IRQn,1);

NVIC_SetPriority(PORTB_IRQn,2);

M4+

NVIC_SetPriorityGrouping(0x03);

NVIC_SetPriority(PORTA_IRQn,NVIC_EncodePriority(0x03,1,2));

NVIC_SetPriority(PORTB_IRQn,NVIC_EncodePriority(0x03,2,2));

標簽:

點贊

分享到:

上一篇:變頻器的薄膜電容應用電路介紹!

下一篇:解決薄膜電容器有偏差的方法

中國傳動網(wǎng)版權與免責聲明:凡本網(wǎng)注明[來源:中國傳動網(wǎng)]的所有文字、圖片、音視和視頻文件,版權均為中國傳動網(wǎng)(m.u63ivq3.com)獨家所有。如需轉載請與0755-82949061聯(lián)系。任何媒體、網(wǎng)站或個人轉載使用時須注明來源“中國傳動網(wǎng)”,違反者本網(wǎng)將追究其法律責任。

本網(wǎng)轉載并注明其他來源的稿件,均來自互聯(lián)網(wǎng)或業(yè)內(nèi)投稿人士,版權屬于原版權人。轉載請保留稿件來源及作者,禁止擅自篡改,違者自負版權法律責任。

相關資訊

網(wǎng)站簡介|會員服務|聯(lián)系方式|幫助信息|版權信息|網(wǎng)站地圖|友情鏈接|法律支持|意見反饋|sitemap

傳動網(wǎng)-工業(yè)自動化與智能制造的全媒體“互聯(lián)網(wǎng)+”創(chuàng)新服務平臺

網(wǎng)站客服服務咨詢采購咨詢媒體合作

Chuandong.com Copyright ?2005 - 2024 ,All Rights Reserved 深圳市奧美大唐廣告有限公司 版權所有
粵ICP備 14004826號 | 營業(yè)執(zhí)照證書 | 不良信息舉報中心 | 粵公網(wǎng)安備 44030402000946號