時(shÃ)間:2018-08-14 15:50:06來(lái)æºï¼šç¶²(wÇŽng)絡(luò)轉(zhuÇŽn)載
其實(shÃ)都æžäº†é€™ä¹ˆé•·(zhÇŽng)時(shÃ)é–“çš„ARM開發(fÄ),關(guÄn)于其至關(guÄn)é‡è¦çš„䏿–·å„ª(yÅu)先級(jÃ)å•(wèn)é¡Œæˆ‘æ—©å°±æƒ³è·Ÿå¤§å®¶ä¼™åˆ†äº«åˆ†äº«äº†ï¼Œå¯æƒœä¸€æ–¹é¢æƒ³çœŸæ£çš„講清楚這個(gè)å•(wèn)題估計(jì)åˆå¾—大費(fèi)å‘¨ç« å’Œå¢¨æ°´ï¼Œå¦ä¸€æ–¹é¢è‡ªå·±è¶Šä¾†(lái)越忙進(jìn)一æ¥å°Ž(dÇŽo)è‡´å¯«æ–‡ç« å€’æ˜¯è¶Šä¾†(lái)越懶了。
å°(duì)äºŽä¸æ–·å„ª(yÅu)先級(jÃ)é…置的需求實(shÃ)際上主è¦é«”ç¾(xià n)在系統(tÇ’ng)å˜åœ¨å¤šå€‹(gè)å¯èƒ½çš„䏿–·æºæƒ…æ³ä¸‹ï¼Œé€™æ™‚(shÃ)為了ä¿è‰ä»£ç¢¼çš„å¯é 執(zhÃ)行,我們ä¸å¾—ä¸è€ƒæ…®å¾ˆç¾(xià n)實(shÃ)的兩個(gè)å•(wèn)題,一個(gè)是如果兩個(gè)ä»¥ä¸Šä¸æ–·åŒæ™‚(shÃ)發(fÄ)生,pendingè«‹(qÇng)求到CPU,CPU決ç–該先進(jìn)哪一個(gè)相應(yÄ«ng)çš„ä¸æ–·æœå‹™(wù)Routine,第二個(gè)å•(wèn)題是CPUç•¶(dÄng)å‰å·²ç¶“(jÄ«ng)在響應(yÄ«ng)æŸå€‹(gè)䏿–·æœå‹™(wù)ï¼Œæ¤æ™‚(shÃ)來(lái)了å¦ä¸€å€‹(gè)䏿–·è«‹(qÇng)求,是å¦å…許其打斷當(dÄng)å‰ä¸æ–·æœå‹™(wù)轉(zhuÇŽn)而響應(yÄ«ng)æ–°çš„ä¸æ–·è«‹(qÇng)æ±‚å³æˆ‘們常說(shuÅ)çš„ä¸æ–·åµŒå¥—å•(wèn)題,ä¸è¦å‘Šè¨´æˆ‘æ²’(méi)考慮éŽ(guò)哈(如果真是這樣,我åªèƒ½ä¸å®¢æ°£çš„說(shuÅ),這樣æžå–®ç‰‡æ©Ÿ(jÄ«)是ä¸è² (fù)責(zé)任的,很å¯èƒ½çµ¦é …(xià ng)目帶來(lái)潛在的風(fÄ“ng)險(xiÇŽn)bug),那樣的話俺也白寫了,呵呵。那æ£é¡Œä¾†(lái)了,å°(duì)ç¾(xià n)在紅紅ç«ç«çš„ARMCortex-M4å’ŒM0+兩個(gè)æ ¸ä¾†(lái)說(shuÅ),他們是如何解決這兩個(gè)å•(wèn)é¡Œçš„å‘¢ï¼Œå› ?yà n)檫@兩個(gè)æ ¸åœ¨ä¸æ–·å„ª(yÅu)先級(jÃ)管ç†ä¸Šç•¥æœ‰äº›å€(qÅ«)別(雖然都是NVICå’ŒSCB兩個(gè)寄å˜å™¨ä¾†(lái)管ç†ï¼‰ï¼Œæ‰€ä»¥ä¸‹é¢æˆ‘分開來(lái)說(shuÅ),å¦å¤–ç”±äºŽä¸æ–·å„ª(yÅu)先級(jÃ)管ç†å±¬äºŽå…§(nèi)æ ¸å•(wèn)題,所以這方é¢çš„ä¿¡æ¯ä½ 䏿œƒ(huì)在å„大åŠå°Ž(dÇŽo)é«”å» å®¶çš„å®˜æ–¹æ‰‹å†Š(cè)䏿‰¾åˆ°ï¼Œæˆ‘們åªèƒ½è¿½æ ¹æº¯æºç›´æŽ¥åˆ°å…§(nèi)æ ¸çš„è€å®¶ARM官網(wÇŽng)去找,建è°å¤§å®¶æœ‰èˆˆè¶£çš„到ARM官網(wÇŽng)把M4å’ŒM0+的內(nèi)æ ¸æ‰‹å†Š(cè)下載下來(lái)ç°¡(jiÇŽn)單瞅瞅,å¯èƒ½æœƒ(huì)æœ‰æ„æƒ³ä¸åˆ°çš„æ”¶ç²å“¦ï¼Œå‘µå‘µï¼š
ARMCortex-M0+䏿–·å„ª(yÅu)先級(jÃ)和嵌套
ç„¡(wú)論是M0+或者是M4å…§(nèi)æ ¸ï¼Œå¯¦(shÃ)際上他們兩個(gè)çš„ä¸æ–·å„ª(yÅu)先級(jÃ)都是由NVICå’ŒSCB兩個(gè)寄å˜å™¨ä¾†(lái)管ç†çš„,在這里我默èª(rèn)大家都知é“ARMçš„ä¸æ–·æºåˆ†ç‚ºå…§(nèi)æ ¸ä¸æ–·å’ŒIRQ䏿–·äº†å“ˆï¼ˆæˆ‘怕å†ç´°(xì)è¬›ä¸‹åŽ»åˆæ²’(méi)完了,呵呵),而å°(duì)IRQçš„ä¸æ–·ç®¡ç†æ˜¯ç”±NVIC來(lái)主導(dÇŽo)的,內(nèi)æ ¸çš„ä¸æ–·ç®¡ç†å‰‡æ˜¯ç”±SCB來(lái)主導(dÇŽo)的,我們先講IRQ䏿–·çš„優(yÅu)先級(jÃ)å•(wèn)題(關(guÄn)äºŽä¸æ–·ä½¿èƒ½å’Œç¦èƒ½ä¸åœ¨æœ¬ç¯‡è¨Žè«–范åœå…§(nèi)哈),打開M0+的內(nèi)æ ¸æ‰‹å†Š(cè)找到NVIC_IPR寄å˜å™¨ï¼ˆInterruptPriorityRegisters)如下圖所示:
注æ„觀察我高亮標(biÄo)注的幾塊,從這幾塊ä¸å¯ä»¥æŠ½è±¡å‡ºæ ¸å¿ƒçš„幾個(gè)å•(wèn)題,第一個(gè)是NVICIPR一共有8個(gè)寄å˜å™¨ï¼Œè€Œæ¯å€‹(gè)寄å˜å™¨ç®¡ç†4個(gè)IRQ䏿–·ï¼Œä¹˜æ³•å£è¨£ç®—一下,我們就明白了為啥M0+çš„IRQ䏿–·æºæœ€å¤šåªæ”¯æŒ32個(gè)了,å†åŠ ä¸Š16個(gè)å…§(nèi)æ ¸ä¸æ–·ï¼ŒåŠ æ³•å£è¨£å†ç®—一下,也就是說(shuÅ)M0+最多就是48個(gè)䏿–·æºï¼Œæ‰€ä»¥M0+算是比較好æžçš„了,一會(huì)兒講M4就該é 疼了,呵呵;第二個(gè)å•(wèn)題是優(yÅu)先級(jÃ)寄å˜å™¨é‡Œé¢çš„é…置值越低表明相應(yÄ«ng)çš„ä¸æ–·å„ª(yÅu)先級(jÃ)越高;第三個(gè)å•(wèn)題是æ¯å€‹(gè)PRIxxçš„8ä½ä¸åªæœ‰æœ€é«˜å…©ä½[7:6]有效,也就是說(shuÅ)實(shÃ)際上M0+的優(yÅu)先級(jÃ)åªæœ‰å››å€‹(gè)å³0,1,2,3,4,其ä¸0的優(yÅu)先級(jÃ)是最高的;第四個(gè)å•(wèn)題,為啥我放到最åŽèªª(shuÅ)å‘¢ï¼Œå› ?yà n)檫@是比較容易忽略的å•(wèn)題,å³word-accessible,也就是說(shuÅ)這幾個(gè)寄å˜å™¨éƒ½åªèƒ½æŒ‰å—æ“作,切記ä¸è¦ç‚ºäº†é¡¯ç¤ºæˆ‘們的編程技巧而使用指å‘å—節(jié)的指é‡åªå°(duì)æŸå€‹(gè)å–®ç¨(dú)䏿–·çš„優(yÅu)先級(jÃ)進(jìn)行é…置。
至于嵌套的å•(wèn)題,å°(duì)M0+是比較簡(jiÇŽn)單的,å³åªè¦ç›¸æ‡‰(yÄ«ng)䏿–·çš„優(yÅu)先級(jÃ)比較高å³å¯éš¨æ™‚(shÃ)æ¶å 比它優(yÅu)先級(jÃ)ä½Žçš„ä¸æ–·æœå‹™(wù)。至于內(nèi)æ ¸ä¸æ–·ï¼Œå…¶ä¸æ–·å„ª(yÅu)先級(jÃ)則由SCB模塊的SCB_SHPR寄å˜å™¨ä¾†(lái)管ç†å¦‚下圖所示,實(shÃ)際上我們平時(shÃ)常用的就是systemtick䏿–·ï¼Œå…¶å„ª(yÅu)先級(jÃ)é…ç½®åŒNVIC,這里就ä¸è´…述了。å¦å¤–,我這里æä¸€ä¸‹ï¼Œå³å¦‚果我們ä¸å°(duì)優(yÅu)先級(jÃ)進(jìn)行é…置的話,則默èª(rèn)相應(yÄ«ng)䏿–·æºçš„å‘é‡è™Ÿ(hà o)越低其優(yÅu)先級(jÃ)越高,ä¸éŽ(guò)如å‰é¢æˆ‘æåˆ°çš„,我是強(qiáng)烈建è°åœ¨å¤šä¸æ–·çš„æƒ…æ³æœ€å¥½æŠŠæ¯å€‹(gè)ç”¨åˆ°çš„ä¸æ–·å„ª(yÅu)先級(jÃ)éƒ½æ ¹æ“š(jù)實(shÃ)際需求進(jìn)行相應(yÄ«ng)é…置,é¿å…潛在的風(fÄ“ng)險(xiÇŽn)。
ARMCortex-M4䏿–·å„ª(yÅu)先級(jÃ)和嵌套
我å‰é¢æåˆ°ä¸€å¥ï¼ŒM4雖然指令集是å‘下兼容M0+çš„ï¼Œä½†æ˜¯åœ¨ä¸æ–·å„ª(yÅu)先級(jÃ)管ç†ä¸Šæ˜¯æœ‰å€(qÅ«)別的,由于M4çš„ä¸æ–·æºæ¯”較多(最多å…許256),所以其å°(duì)䏿–·å„ª(yÅu)先級(jÃ)ç®¡ç†æ˜¯ç•¥æœ‰äº›å¾©(fù)雜的,ä¸éŽ(guò)一定è¦ä»”ç´°(xì)çœ‹ä¸‹åŽ»ï¼Œå› ?yà n)槲覀兤ç¶r(shÃ)會(huì)æ¯”è¼ƒå¸¸ç”¨åˆ°ï¼Œä½†æ˜¯æˆ‘æ•¢è‚¯å®šä¸æ˜¯æ‰€æœ‰äººçš„用法是æ£ç¢ºçš„,為啥?待我下é¢ç¹¼çºŒ(xù)分解(放心,還沒(méi)完呢,呵呵),先繼續(xù)上圖:
繼續(xù)找上圖亮點(diÇŽn),一個(gè)是M4最高支æŒ16+4*60=256個(gè)䏿–·æºï¼Œç¬¬äºŒå€‹(gè)這60個(gè)寄å˜å™¨æ˜¯å¯ä»¥æŒ‰å—節(jié)æ“作的(我們å¯ä»¥ç¹¼çºŒ(xù)çš„è£é€¼ç”¨æŒ‡é‡äº†ï¼Œå“ˆå“ˆï¼‰ï¼Œç¬¬ä¸‰å€‹(gè)è·ŸM0+一樣å³å€¼è¶Šå°å„ª(yÅu)先級(jÃ)越高,最åŽå‰‡æ˜¯æœ€å¤§çš„å€(qÅ«)åˆ¥ï¼Œå³æ¯å€‹(gè)å¯„å‡ºåŽ»ä½ çš„8使•¸(shù)據(jù)都是å¯ä»¥å®šç¾©å…¶ä¸æ–·å„ª(yÅu)先級(jÃ)了,說(shuÅ)到這里,aquestionisraisedï¼Œé‚£æ˜¯ä¸æ˜¯æ„味著M4的優(yÅu)先級(jÃ)最高å¯ä»¥256個(gè)ç´š(jÃ)別呢。我åªèƒ½èªª(shuÅ),大家想多了,呵呵,繼續(xù)看下圖å§ï¼Œå¯è¦‹PRIGROUP定義了這8使•¸(shù)據(jù)到底該怎么用了,這里出ç¾(xià n)了兩個(gè)æ–°å詞,å³GroupPriorityå’ŒSubpriority,至于這兩個(gè)優(yÅu)先級(jÃ)æ˜¯ä»€ä¹ˆæ„æ€é‚£å¤§å®¶ç¹¼çºŒ(xù)看圖2,大家先仔細(xì)ç†è§£ç†è§£ï¼Œæˆ‘å–壿°´å…ˆã€‚。。Ok,繼續(xù)回來(lái),從下é¢å…©å¼µåœ–å¯ä»¥çœ‹åˆ°åœ¨M4å…§(nèi)æ ¸ä¸ï¼Œå…¶å°(duì)䏿–·å„ª(yÅu)先級(jÃ)ç®¡ç†æ˜¯åˆ†äº†å…©å€‹(gè)部分,一個(gè)是組優(yÅu)先級(jÃ)一個(gè)是å優(yÅu)先級(jÃ),å³çµ„優(yÅu)先級(jÃ)是管ç†?yè)屨純?yÅu)先級(jÃ)çš„ï¼ˆå³æ˜¯å¦èƒ½åµŒå¥—),å³é«˜çš„組優(yÅu)先級(jÃ)䏿–·ï¼ˆæ•¸(shù)值低)å¯ä»¥æ¶å 低的組優(yÅu)先級(jÃ)(數(shù)å€¼é«˜ï¼‰ä¸æ–·çš„,而如果組優(yÅu)先級(jÃ)是一樣的,å³ä½¿å優(yÅu)先級(jÃ)比æ£åœ¨åŸ·(zhÃ)è¡Œçš„ä¸æ–·çš„å優(yÅu)先級(jÃ)高也是ä¸èƒ½æ¶å çš„ï¼Œé‚£åˆæœ‰åŒå¿—們è¦å•(wèn)å•(wèn)題了,那å優(yÅu)先級(jÃ)有啥用?呵呵,æ£å¦‚圖2所說(shuÅ),在組優(yÅu)先級(jÃ)一致的情æ³ä¸‹ï¼Œå¤šå€‹(gè)䏿–·è«‹(qÇng)æ±‚åŒæ™‚(shÃ)發(fÄ)生,這樣的情æ³ä¸‹å優(yÅu)先級(jÃ)高的å¯ä»¥å…ˆåŸ·(zhÃ)行的,而å優(yÅu)先級(jÃ)低的則åªèƒ½æš«æ™‚(shÃ)pendingç‰è‘—了,呵呵。而回到PRIGROUP的作用是用來(lái)é…ç½®NVICçš„8使•¸(shù)據(jù)域是如何分é…給æ¶å 優(yÅu)先級(jÃ)å’Œå優(yÅu)先級(jÃ)的,而一般情æ³ä¸‹ï¼Œæœ€å¥½æ˜¯å„ç•™4ä½çµ¦é€™äºŒä½å¤§çˆºå’Œå°çˆºäº†ï¼Œå³æ¯ä½çˆºæœ€å¤šå¯é…16個(gè)優(yÅu)先級(jÃ),而PRIGROUP是從哪來(lái)的呢,呵呵,實(shÃ)際上它是SCB_AIRCR寄å˜å™¨çš„å…¶ä¸3ä½å¦‚圖3所示。
呼。。。終于æžå®Œäº†ï¼Œç¸½ç®—把這個(gè)å•(wèn)題給寫出來(lái)了,我腦袋里å¯ä»¥é¨°å‡ºé»ž(diÇŽn)地方給其他å•(wèn)題了,哈哈。å¦å¤–實(shÃ)際上我上é¢å¯«äº†é€™ä¹ˆå¤šç†è«–çš„æ±è¥¿ï¼Œä½†æ˜¯ARM早已在CMSIS庫(kù)é‡Œçš„é æ–‡ä»¶ä¸æŠŠé€™éƒ¨åˆ†å‡½æ•¸(shù)API給出來(lái)了(core_cm4.hå’Œcore_cm0plus.h),而我之所以ä¸é–‘麻煩的還是把這個(gè)寫出來(lái),還是我這個(gè)知其然也è¦çŸ¥å…¶æ‰€ä»¥ç„¶çš„æ€æƒ³åœ¨ä½œæ€ªäº†ã€‚ä¸éŽ(guò)最åŽï¼Œæˆ‘還是給出M0+å’ŒM4çš„ä¸æ–·å„ª(yÅu)先級(jÃ)é…置的兩個(gè)é…置供廣大åšå‹åƒè€ƒå§ï¼Œç„¶åŽå…¶ä»–å°±ä¸å¤šèŠäº†ï¼Œæœªå®Œå¾…續(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));
標(biÄo)簽:
ä¸Šä¸€ç¯‡ï¼šè®Šé »å™¨çš„è–„è†œé›»å®¹æ‡‰(yÄ«ng)用電路介紹ï¼
下一篇:解決薄膜電容器有å差的方法
ä¸åœ‹(guó)傳動(dòng)ç¶²(wÇŽng)版權(quán)與å…責(zé)è²æ˜Žï¼šå‡¡æœ¬ç¶²(wÇŽng)注明[來(lái)æºï¼šä¸åœ‹(guó)傳動(dòng)ç¶²(wÇŽng)]的所有文å—ã€åœ–片ã€éŸ³è¦–å’Œè¦–é »æ–‡ä»¶ï¼Œç‰ˆæ¬Š(quán)å‡ç‚ºä¸åœ‹(guó)傳動(dòng)ç¶²(wÇŽng)(www.hysjfh.com)ç¨(dú)家所有。如需轉(zhuÇŽn)載請(qÇng)與0755-82949061è¯(lián)系。任何媒體ã€ç¶²(wÇŽng)站或個(gè)人轉(zhuÇŽn)載使用時(shÃ)é ˆæ³¨æ˜Žä¾†(lái)æºâ€œä¸åœ‹(guó)傳動(dòng)ç¶²(wÇŽng)â€ï¼Œé•å者本網(wÇŽng)將追究其法律責(zé)任。
本網(wÇŽng)轉(zhuÇŽn)載并注明其他來(lái)æºçš„稿件,å‡ä¾†(lái)自互è¯(lián)ç¶²(wÇŽng)或æ¥(yè)å…§(nèi)投稿人士,版權(quán)屬于原版權(quán)人。轉(zhuÇŽn)載請(qÇng)ä¿ç•™ç¨¿ä»¶ä¾†(lái)æºåŠä½œè€…ï¼Œç¦æ¢æ“…自篡改,é•è€…è‡ªè² (fù)版權(quán)法律責(zé)任。
相關(guÄn)資訊