引言 在前面的文章中提到過(guò),很多情況下應用程序需要在ARM跟Thumb狀態(tài)之間相互切換,這部分就討論交互工作的實(shí)現方法和一些注意問(wèn)題。 1 需要交互的原因 前面提到過(guò),Thumb指令在某些特殊情況下具有比ARM指令更為出色的表現,主要是在代碼長(cháng)度和窄帶寬存儲器系統性能兩方面。正是因為T(mén)humb指令在特定環(huán)境下的優(yōu)勢,它在很多方面得到了廣泛應用。但是因為下面一些原因,Thumb又不可能獨立地組成一個(gè)應用系統。 ◇ Thumb指令集在功能上只是ARM指令集的一個(gè)子 集,某些功能只能在A(yíng)RM狀態(tài)下執行,如CPSR和 協(xié)處理器的訪(fǎng)問(wèn)。 ◇ 進(jìn)行異常響應時(shí),處理器會(huì )自動(dòng)進(jìn)入ARM狀態(tài)。 ◇ 從系統優(yōu)化考慮,在寬帶存儲器上不應該放置 Thumb代碼,很多窄帶系統具有寬帶的內部存儲器。 ◇ 即使是一個(gè)單純的Thumb應用系統,也必須加一 個(gè)匯編的交互頭程序,因為系統總是自動(dòng)從ARM 開(kāi)始啟動(dòng)。 所以,不可避免地會(huì )產(chǎn)生ARM與Thumb之間交互的問(wèn)題。 2 狀態(tài)切換的實(shí)現 處理器在 ARM/Thumb之間的狀態(tài)切換是通過(guò)一條專(zhuān)用的跳轉交換指令BX來(lái)實(shí)現的。BX指令以通用寄存器(R0~R15)為操作數,通過(guò)拷貝Rn到PC來(lái)實(shí)現 4GB空間范圍內的一個(gè)絕對跳轉。BX利用Rn寄存器中存儲的目標地址值的最后一位來(lái)判斷跳轉后的狀態(tài)。如圖1所示,是用BX指令實(shí)現狀態(tài)切換。 ![]() 無(wú)論ARM還是Thumb,其指令存儲在存儲器中都是邊界對齊的(4字節或2字節對齊)。因此,在執行跳轉過(guò)程中,PC寄存器中的最低位肯定被舍棄,不起作用。在BX指令的執行過(guò)程中,最低位正好被用作狀態(tài)判斷的標識,不會(huì )造成存儲器訪(fǎng)問(wèn)不對齊的錯誤。 圖 2 中是一段直接進(jìn)行狀態(tài)切換的例程: ![]() 下面是一段直接進(jìn)行狀態(tài)切換的例程。 ;從ARM狀態(tài)開(kāi)始 CODE32 ;匯編關(guān)鍵字 ADR R0, Into_Thumb+1 ;得到目標地址,末位置1, ;轉向Thumb BX R0 ;執行 ? ;其它代碼 CODE16 ;匯編關(guān)鍵字 Into_Thumb ;Thumb代碼段起始地址 … ;Thumb代碼 ADR R5, Back_to_ARM ;得到目標地址,末位缺 ;省為0,轉向ARM BX R5 ;執行 … ;其它代碼 CODE32 ;匯編關(guān)鍵字 Back_to_ARM ;ARM代碼段起始地址 我們知道,在A(yíng)RM的狀態(tài)寄存器CPSR 中,bit-5是狀態(tài)控制位T-bit,決定當前處理器的運行狀態(tài)。如果直接修改CPSR的狀態(tài)位,也能夠達到改變處理器運行狀態(tài)的目的。但是這樣會(huì )帶來(lái)一個(gè)問(wèn)題,因為ARM采用多級流水線(xiàn)的結構,所以在程序執行過(guò)程中,指令流水線(xiàn)上會(huì )存在幾條預取指令(具體數目視流水線(xiàn)級數而不同)。當修改CPSR的 T-bit后,狀態(tài)的轉變會(huì )造成流水線(xiàn)上預取指令的執行錯誤。而如果用BX指令,則執行后會(huì )進(jìn)行流水線(xiàn)的刷新動(dòng)作,清除流水線(xiàn)上的殘余指令,在新的狀態(tài)下重新開(kāi)始指令預取,從而保證狀態(tài)轉變時(shí)指令流的正確銜接。 3 ARM/Thumb之間的函數調用 在無(wú)交互的子程序調用中,其過(guò)程比較簡(jiǎn)單。實(shí)現調用通常只需要一條指令: BL function 實(shí)現返回也只需要從LR恢復PC即可: MOV PC, LR 函數的調用過(guò)程如圖3所示。 ![]() 如果子函數和父函數不在同一種狀態(tài)下執行,因為狀態(tài)切換,需要對函數調用作更多的考慮。 ① BL不能完成狀態(tài)切換,需要由BX來(lái)切換狀態(tài)。 ② BX不能自動(dòng)保存返回地址到LR,需要在BX之前先保存好LR。 ③ 用“BX LR”來(lái)返回,不能使用“MOV PC, LR”,因為這條指令同樣不能實(shí)現狀態(tài)切換。返回時(shí)要仔細考慮保存在LR中最低位的內容是否正確。 假如用戶(hù)直接使用匯編語(yǔ)言進(jìn)行狀態(tài)交互跳轉,上述的幾個(gè)問(wèn)題都需要用手工編碼加以處理。如果用戶(hù)使用高級語(yǔ)言進(jìn)行開(kāi)發(fā),不需要為ARM/Thumb之間的相互調用增加額外編碼,但是最好要對其調用過(guò)程加以了解。下面以ARM ADS中的編譯工具為例進(jìn)行說(shuō)明,如圖4所示。 ![]() ① 兩個(gè)函數func1()和func2()被編譯成不同的指令集(ARM或Thumb)。 注意:func1()和 func2()在這里位于二個(gè)不同的源文件中。 ② 編譯時(shí)必須告訴編譯器和鏈接器足夠的信息,一方面讓編譯器能夠使用正確的指令碼進(jìn)行編譯,另一方面,當在不同的狀態(tài)之間發(fā)生函數調用時(shí),鏈接器將插入一段鏈接代碼(veneers)來(lái)實(shí)現狀態(tài)轉換。 上述過(guò)程中的一個(gè)特點(diǎn)是:func1()還是使用通常的BL指令來(lái)進(jìn)行子程序調用,而 func2()返回時(shí)則直接使用“BX LR”,沒(méi)有對LR進(jìn)行判斷和最低位的設置。這是因為當執行BL指令對LR進(jìn)行保存時(shí),其最低位會(huì )被自動(dòng)設置,以滿(mǎn)足返回時(shí)狀態(tài)切換的需要,可直接使用 “BX LR”。 在上面的例子中,為了讓編譯器在編譯函數func2()時(shí)使用BX而不是BL進(jìn)行返回,必須告訴編譯器要按照滿(mǎn)足交互工作要求的方式進(jìn)行編譯。在A(yíng)RM的編譯器選項設置中,應選擇“-apcs /interwork”。這樣,函數的返回指令會(huì )被正確設置,并且當鏈接器進(jìn)行目標代碼的鏈接時(shí),能夠在需要的地方插入正確的鏈接代碼實(shí)現狀態(tài)切換。 當然,插入了鏈接代碼會(huì )相應地增加代碼長(cháng)度,通常一段veneer包含3條指令,即12B字節長(cháng)度?梢杂谩-info veneers”選項使鏈接器輸出所有veneers的位置和長(cháng)度信息。 4 交互程序之間的兼容性 因為在指定交互選項后,編譯及鏈接后的輸出代碼跟在無(wú)交互情況下不同,所以當多個(gè)源文件如果使用了不同的設置進(jìn)行編譯,相互之間的調用可能產(chǎn)生兼容性問(wèn)題。圖5說(shuō)明了這些關(guān)系。 ![]() 在一個(gè)使用交互工作的項目工程管理中,對此要加以仔細考慮。 5 V5架構的擴展 ARM在V5版本的架構中,對ARM/Thumb的交互增加了新的支持。針對前面第3節中提到的函數調用和返回問(wèn)題,V5版本中專(zhuān)門(mén)對指令做了擴展。 ① 增加了新指令BLX,解決了原來(lái)BX和BL指令各自的欠缺。使交互的函數調用可以由一條指令實(shí)現,省去了跳轉代碼的開(kāi)銷(xiāo)。 ② 擴展了以PC為目標地址的數據傳輸指令功能。PC加載值的最低位將被自動(dòng)送到狀態(tài)寄存器CPSR的T狀態(tài)位。也就是說(shuō),通過(guò)給PC賦值的方法也能實(shí)現狀態(tài)的切換,這樣就使習慣的函數返回方法——從堆棧中恢復寄存器,也能實(shí)現交互調用函數的正確返回了。 所以,V5架構以后的代碼,不再需要額外的鏈接代碼,縮小了代碼長(cháng)度,提高了狀態(tài)切換時(shí)的執行效率。當然,在V5及以后的架構中,繼續保持了對以前代碼的良好兼容性。 6 Thumb-2 ARM和Thumb因為其各自的優(yōu)勢,都得到了極為廣泛的應用。在一個(gè)應用程序中,用戶(hù)要根據系統的具體情況靈活分配,使用不同的編譯器,把不同的代碼編譯成ARM或Thumb,以希望得到最優(yōu)的代碼長(cháng)度和性能平衡。這樣做能夠達到系統優(yōu)化的目的,但是也給設計人員帶來(lái)了額外的交互處理工作。最近,ARM公司公布了一項新的發(fā)明——Thumb-2指令集,該指令集同時(shí)包含32位和16位指令,在代碼長(cháng)度和性能之間作了最佳的平衡。這樣,以后用戶(hù)就可以用一個(gè)統一的Thumb-2編譯器來(lái)解決現在面臨的很多問(wèn)題了。 如圖6所示,是Thumb-2指令集跟ARM和Thumb之間的比較。 ![]() 引證文獻 1. 楊志強 嵌入式系統設計與發(fā)展 [期刊論文] -青海師范大學(xué)學(xué)報(自然科學(xué)版)2005(03) 2. 劉志勇 基于A(yíng)RM的無(wú)線(xiàn)視頻傳輸硬件系統的初步研究與開(kāi)發(fā) [學(xué)位論文] 碩士2005 3. 李晶 基于 LINUX的無(wú)線(xiàn)局域網(wǎng)芯片驅動(dòng)程序的設計與開(kāi)發(fā) [學(xué)位論文] 碩士2005 作 者:ARM中國 費浙平 來(lái) 源:單片機與嵌入式系統應用 2003(12) |