嵌(qian)入式開(kai)發之arm狀態和thumb狀態詳解
時(shi)間:2018-08-03 來源:未(wei)知
學(xue)習嵌入式(shi)開發,那當(dang)然(ran)會涉及(ji)到arm狀態(tai)和(he)thumb狀態(tai),很(hen)多初學(xue)者對這兩(liang)個狀態(tai)一(yi)直(zhi)不是很(hen)理解(jie),都是一(yi)直(zhi)處于(yu)迷茫中,今天(tian)我就用(yong)實(shi)際的(de)例子來教給(gei)你,對于(yu)arm狀態(tai)和(he)thumb狀態(tai)的(de)學(xue)習。
我們首先(xian)先(xian)來清楚一下:arm處理(li)器的工作狀態(tai)(tai)(tai)分(fen)為3種,一是(shi):ARM狀態(tai)(tai)(tai),二是(shi):Thumb狀態(tai)(tai)(tai)及Thumb-2狀態(tai)(tai)(tai),三(san)是(shi):調試狀態(tai)(tai)(tai)
對于(yu)arm狀態(tai)(tai)和Thumb狀態(tai)(tai)我們可(ke)以用一個(ge)簡單的(de)比喻來(lai)先了(le)解一下:我們可(ke)以把(ba)ARM核比作(zuo)一個(ge)高(gao)中學校,那種包(bao)含(han)普(pu)通(tong)(tong)高(gao)中和職(zhi)業(ye)高(gao)中的(de)。普(pu)通(tong)(tong)高(gao)中就(jiu)相(xiang)當于(yu)ARM狀態(tai)(tai),職(zhi)業(ye)高(gao)中就(jiu)相(xiang)當于(yu)Thumb狀態(tai)(tai),這樣還不能理(li)解的(de)話(hua):可(ke)以認為 泡泡卡(ka)丁(ding)車 中普(pu)通(tong)(tong)模(mo)式(shi)和加(jia)速模(mo)式(shi),,卡(ka)丁(ding)車加(jia)速要等(deng)到(dao)集氣(qi)(qi)管(guan)(guan)加(jia)滿,然后“ctrl”一下,就(jiu)切換到(dao)了(le)加(jia)速模(mo)式(shi),氣(qi)(qi)放(fang)完了(le)就(jiu)又回來(lai)了(le),不管(guan)(guan)加(jia)速模(mo)式(shi)還是普(pu)通(tong)(tong)模(mo)式(shi)都(dou)是在跑(pao),只是速度不一樣而已。

而ARM狀(zhuang)(zhuang)(zhuang)態(tai)和(he)Thumb狀(zhuang)(zhuang)(zhuang)態(tai)也是可以直接通過(guo)某些(xie)指(zhi)令直接切換(huan),都(dou)是在運行程序,只不(bu)過(guo)指(zhi)令長度不(bu)一(yi)樣而已。這(zhe)個概念對初學者相當重要,因為當ARM Thumb是什么還沒弄清(qing)楚,怎么能理解(jie)兩種狀(zhuang)(zhuang)(zhuang)態(tai)呢?通過(guo)上面(mian)的(de)例子,我(wo)想大(da)家(jia)都(dou)大(da)概了(le)解(jie)了(le)ARM狀(zhuang)(zhuang)(zhuang)態(tai)和(he)Thumb狀(zhuang)(zhuang)(zhuang)態(tai)的(de)一(yi)些(xie)關系了(le)吧,那么這(zhe)樣就可以深入了(le)解(jie)ARM狀(zhuang)(zhuang)(zhuang)態(tai)是什么,Thumb狀(zhuang)(zhuang)(zhuang)態(tai)是什么了(le)。
另外(wai):ARM的M系列主要用Thumb指(zhi)(zhi)令,ARM9和A系列主要用ARM指(zhi)(zhi)令
S3C2440.S啟動代碼中(zhong)根本就沒(mei)用(yong)Thumb指令。
ARM狀態此時處理器(qi)執(zhi)行32位的(de)(de)字對齊(qi)(qi)的(de)(de)ARM指令,Thumb狀態此時處理器(qi)執(zhi)行16位的(de)(de),半字對齊(qi)(qi)的(de)(de)THUMB指令。 切(qie)換(huan)程(cheng)序:從(cong)(cong)ARM到Thumb: LDR R0,=lable+1 BX R0 從(cong)(cong)ARM到Thumb: LDR R0,=lable BX R0
1,ARM狀態(tai)
arm處理(li)器工作于32位指令(ling)(ling)的狀態,所有指令(ling)(ling)均為32位
2,thumb狀態
arm執行16位指令的狀態,即(ji)16位狀態
3,接下來就(jiu)是arm與(yu)thumb間的切換了,他們到底是如何切換的,這些是你需要掌握(wo)的
(1)由thumb狀態切換到(dao)ARM狀態
寄(ji)存器最低(di)位設置為0
BX指(zhi)令:R0[0]=0,則執行BX
R0指令將進入arm狀態
當處理器進行異(yi)常處理時,則從異(yi)常向量地址開始(shi)執行,將自動進入(ru)ARM狀態。
(2)由arm狀態切換到(dao)thumb
狀態(tai)將寄存(cun)器(qi)的(de)最低位設置為1
BX指令:R0[0]=1,則執行BX
R0指令將進入thumb狀態
注意:ARM處理器(qi)復(fu)位后開始執行(xing)代碼時總是只處于ARM狀(zhuang)態;
Cortex-M3只有Thumb-2狀(zhuang)態和調試狀(zhuang)態;
由于Thumb-2具(ju)有(you)16位/32位指(zhi)令功能,因此有(you)了thumb-2就無需Thumb了。
另外,具有Thumb-2技術的ARM處理器也無需再(zai)ARM狀(zhuang)(zhuang)態(tai)和Thumb-2狀(zhuang)(zhuang)態(tai)間進(jin)行切換了,因(yin)為thumb-2具有32位指令功能。
上面(mian)這些(xie)你(ni)(ni)都(dou)明(ming)白了嗎,其(qi)實總的(de)(de)(de)來說,arm狀(zhuang)態(tai)和Thumb狀(zhuang)態(tai)的(de)(de)(de)他(ta)們最根本(ben)的(de)(de)(de)區別就是(shi)(shi)指令的(de)(de)(de)位數不(bu)同(tong)而已,就像arm狀(zhuang)態(tai)是(shi)(shi)32位的(de)(de)(de),thumb是(shi)(shi)16位的(de)(de)(de),你(ni)(ni)只(zhi)要把他(ta)們之間的(de)(de)(de)這些(xie)東西都(dou)掌握(wo)好(hao),那對你(ni)(ni)學(xue)(xue)習(xi)arm狀(zhuang)態(tai)和thumb狀(zhuang)態(tai)是(shi)(shi)很容易(yi)的(de)(de)(de),快快學(xue)(xue)起來吧(ba)!

