<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > UCOS-II中OS_CPU_IRQ_ISR移植過(guò)程分析

UCOS-II中OS_CPU_IRQ_ISR移植過(guò)程分析

作者: 時(shí)間:2016-12-01 來(lái)源:網(wǎng)絡(luò ) 收藏


16-19、接下來(lái)的操作本應該是完成將SP的值保存到任務(wù)堆??臻g的,但是在UC/OS-II中存在一個(gè)全局變量OSIntNesting,它表明了中斷嵌套的次數,因此需要對這個(gè)值進(jìn)行一次加1操作。

21、接下來(lái)的操作就是判斷是否在中斷嵌套中,也就是對全局變量進(jìn)行比較操作,如果這個(gè)值是1,則認為只有一個(gè)中斷產(chǎn)生,如果不等于1,則認為實(shí)在中斷嵌套中。

本文引用地址:http://dyxdggzs.com/article/201612/324516.htm

CMP R1,#1 ;if(OSIntNesting==1){

22、BNE %F1;如果是在中斷嵌套中,則直接跳轉到下面的中斷處理函數中


23-25、

LDR R4,=OSTCBCur ;OSTCBHighRdy->OSTCBStkPtr=SP;

LDR R5,[R4]
STR SP,[R5]
說(shuō)明是從任務(wù)到中斷的過(guò)程,也就是只有一個(gè)中斷產(chǎn)生,不是在中斷嵌套中,這時(shí)就需要將SP的值保存到任務(wù)控制塊中。 以上的操作也就完成了任務(wù)情景的保存操作,接下來(lái)的操作就應該是真正的中斷處理函數啦。

27、1 MSR CPSR_c,#IRQMODE|NOINT;實(shí)質(zhì)上是完成CPU模式的切換操作,進(jìn)入到IRQ模式下。

接下來(lái)的實(shí)際處理過(guò)程就如前面兩篇文章中討論的中斷處理過(guò)程。

29-30、

LDR R0, =INTOFFSET

LDR R0, [R0]

得到INTOFFSET的值,實(shí)際上就是得到偏移量,實(shí)質(zhì)上就是中斷號產(chǎn)生中斷,通過(guò)這個(gè)寄存器可以快速的確定在二級向量表中該中斷的向量位置,該向量表中就保存了對應中斷處理函數的函數地址。

32、LDR R1, IRQIsrVect

43、IRQIsrVect DCD HandleEINT0

這兩句說(shuō)明了我前面的分析,IRQIsrVect實(shí)際上就是一個(gè)標號,其中存儲了HandleEINT0,HandleEINT0又是我們IRQ中斷向量的入口地址(前一篇文章已經(jīng)說(shuō)明),也就是說(shuō)HandleEINT0是二級向量表的開(kāi)始地址。因此此時(shí)R1中實(shí)際上就保存了HandleEINT0。

33、MOV LR, PC;就是完成簡(jiǎn)單的保存過(guò)程,這個(gè)過(guò)程實(shí)質(zhì)上就是保存了函數調用的返回地址。

34、LDR PC, [R1, R0, LSL #2];這句代碼的意義是將地址R1+R0*4處的內容加載到PC中,也就是實(shí)現函數的跳轉,即函數的調用過(guò)程。其中R1=HandleEINT0,而R0恰好又是一個(gè)偏移量,每一個(gè)指針的空間是4個(gè)字節,那么R1+R0*4地址處剛好就是對應中斷號的向量。其中就保存了對應中斷函數的地址。因此PC就保存了這個(gè)調用函數的入口地址。也就是實(shí)現了處理函數調用過(guò)程。

35、 MSR CPSR_c,#SVCMODE|NOINT; 執行這句代碼的前提就是被調用的函數執行完畢了,相關(guān)的入棧出棧操作也已經(jīng)完成,恢復到了調用前的狀態(tài)。此時(shí)需要將CPU的模式切換到SVC模式下。

36、BL OSIntExit ;這個(gè)操作完成了中斷的切換,如果不是在中斷嵌套中,那么最高優(yōu)先級的任務(wù)就會(huì )被執行,進(jìn)入最高優(yōu)先的任務(wù)之后就不會(huì )再返回了,這是UC/OS-II中任務(wù)的特點(diǎn),之后的代碼也就不會(huì )執行了。這是特別需要注意的。但是如果任務(wù)處在中斷嵌套中,那么OSIntExit只是減少中斷嵌套的次數,并不完成其他的操作。那么這時(shí)候就需要恢復之前被中斷的任務(wù)了,也就是需要完成任務(wù)堆棧的彈出操作。

39-41、

LDMFD SP!,{R4} ;POP the tasks CPSR

MSR SPSR_cxsf,R4

LDMFD SP!,{R0-R12,LR,PC}^

這幾句代碼的實(shí)現實(shí)質(zhì)上是完成了在中斷嵌套中時(shí)的任務(wù)切換操作。

討論:

不知道我理解的對不對,我認為這段代碼存在一定的問(wèn)題,具體的問(wèn)題如下,因為在中斷嵌套中,CPU執行的肯定就是中斷服務(wù)函數,此時(shí)的任務(wù)處于低優(yōu)先級的,并不需要我們保存任務(wù)的信息。為什么這段代碼能夠運行的原因我認為主要是因為這種處理的方式是不可能導致中斷嵌套問(wèn)題產(chǎn)生的。因為我們在進(jìn)入中斷以后關(guān)閉了中斷使能位,不會(huì )產(chǎn)生中斷嵌套也就看不出問(wèn)題所在。我認為如果在支持中斷嵌套的CPU中,應該首先檢測是否在中期嵌套中,如果在中斷嵌套中,則不需要任務(wù)寄存器的保存,如果不在,則需要保存。

關(guān)閉中斷的方式避免了中斷嵌套產(chǎn)生的可能,這也說(shuō)明一直需要保存任務(wù)的情景,使得這段代碼是有效的。

總結:

在討論ARM的移植過(guò)程中,我覺(jué)得首先應該搞清楚每一種情況下CPU的工作模式,同時(shí)搞清楚寄存器的特殊性,同時(shí)搞清楚中斷處理的一般過(guò)程。


上一頁(yè) 1 2 下一頁(yè)

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>