|
ARM處理器使用流水線來(lái)增加處理器指令流的速度,這樣可使幾個(gè)操作同時(shí)進(jìn)行,并使處理與存儲(chǔ)器系統(tǒng)之間的操作更加流暢,連續(xù),能提供0.9MIPS/MHZ的指令執(zhí)行速度。
PC代表程序計(jì)數(shù)器,流水線使用三個(gè)階段,因此指令分為三個(gè)階段執(zhí)行:1.取指(從存儲(chǔ)器裝載一條指令);2.譯碼(識(shí)別將要被執(zhí)行的指令);3.執(zhí)行(處理指令并將結(jié)果寫回寄存器)。而R15(PC)總是指向“正在取指”的指令,而不是指向“正在執(zhí)行”的指令或正在“譯碼”的指令。一般來(lái)說,人們習(xí)慣性約定將“正在執(zhí)行的指令作為參考點(diǎn)”,稱之為當(dāng)前第一條指令,因此PC總是指向第三條指令。當(dāng)ARM狀態(tài)時(shí),每條指令為4字節(jié)長(zhǎng),所以PC始終指向該指令地址加8字節(jié)的地址,即:PC值=當(dāng)前程序執(zhí)行位置+8;
ARM指令是三級(jí)流水線,取指,譯指,執(zhí)行時(shí)同時(shí)執(zhí)行的,現(xiàn)在PC指向的是正在取指的地址,那么cpu正在譯指的指令地址是PC-4(假設(shè)在ARM狀態(tài)下,一個(gè)指令占4個(gè)字節(jié)),cpu正在執(zhí)行的指令地址是PC-8,也就是說PC所指向的地址和現(xiàn)在所執(zhí)行的指令地址相差8。
當(dāng)突然發(fā)生中斷的時(shí)候,保存的是PC的地址
這樣你就知道了,如果返回的時(shí)候返回PC,那么中間就有一個(gè)指令沒有執(zhí)行,所以用SUB pc lr-irq #4。
但是在ADS中PC確實(shí)是指向即將執(zhí)行的指令處,這個(gè)是軟件處理后的結(jié)果,主要是為了用戶調(diào)試程序方便.
需要注意的是,當(dāng)前使用指令STM/STR保存R15時(shí)候,保存的可能是當(dāng)前指令地址值+8字節(jié),也可能保存的是當(dāng)前的指令地址+12字節(jié).到底是哪種,取決于芯片的具體的設(shè)計(jì)方式。無(wú)論如何,在同一芯片中,要么采用當(dāng)前的指令地址+8,要么采用當(dāng)前的指令地址+12。因此對(duì)于用戶來(lái)講,盡量避免使用STM/STR指令來(lái)保存R15的值。但是可以在開始的時(shí)候用一段程序?qū)π酒膐ffset進(jìn)行測(cè)試!
代碼如下:
SUB R1, PC, #4 ;獲得下面的存放下面存放STR指令的地址
STR PC,[R0]
LDR R0,[RO]
SUB R0, R0, R1
ARM7中斷與PC、LR的問題:
1,假設(shè)當(dāng)前是PC,PC-4,PC-8(三級(jí)流水)
2,發(fā)生IRQ異常,執(zhí)行保護(hù)操作,LR中保存由于FIQ或IRQ占先而沒有被執(zhí)行的指令的地址(即有些資料上把這個(gè)地址寫成PC或者當(dāng)前地址,很費(fèi)解甚至誤解)的下一條地址
3,清空流水線
4,進(jìn)入中斷服務(wù)程序
5,待流水線填滿,執(zhí)行操作才被重新掛起(解釋了ARM7為什么是0.9MIPS)
6,中斷返回前,對(duì)LR處理,LR=LR-4,指向之前被清空的已譯碼但沒被執(zhí)行的指令的地址
7,清空流水線,返回
8,重新對(duì)丟棄的前一次已譯碼指令取指
9,待流水線滿,開始繼續(xù)執(zhí)行
|
|