新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > UCOS-II中OS_CPU_IRQ_ISR移植過程分析

UCOS-II中OS_CPU_IRQ_ISR移植過程分析

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


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

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

本文引用地址:http://www.butianyuan.cn/article/201612/324516.htm

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

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


23-25、

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

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

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

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

29-30、

LDR R0, =INTOFFSET

LDR R0, [R0]

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

32、LDR R1, IRQIsrVect

43、IRQIsrVect DCD HandleEINT0

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

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

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

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

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

39-41、

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

MSR SPSR_cxsf,R4

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

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

討論:

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

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

總結(jié):

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


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

關(guān)鍵詞: UCOS-IIOS_CPU_IRQ_ISR移植過

評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉