ARM基礎(chǔ):ARM知識(shí)通俗理解
/******************************************************************************************************************
參考:
說明:。
******************************************************************************************************************/
記一下概念的東西,有我自己的認(rèn)識(shí):
關(guān)于ARM THUMB兩個(gè)狀態(tài),我自己的見解就是就像現(xiàn)在的電腦,新買的CPU都是64位的,但是也可以裝成32位的系統(tǒng)xp或win7,這就是CPU工作的32位狀態(tài)。而如果裝了64位的win7那CPU就工作在64位了,那么是ARM狀態(tài)就對(duì)應(yīng)上邊例子中的64位的,THUMB對(duì)應(yīng)32位的,這應(yīng)該是一個(gè)過度。我問過u-boot Linux都是一直工作在ARM狀態(tài),一直都沒有一點(diǎn)THUMB狀態(tài),對(duì)于那種剛開始學(xué)這個(gè),沒做過項(xiàng)目的老師們一再講這個(gè)就現(xiàn)在想想沒有多大的意義了。對(duì)于PC機(jī)來說現(xiàn)在是32位到64位的過渡,但是對(duì)于已經(jīng)是后32位的時(shí)代的,還要講16的東西,就該往前看看多說說64位的事了。
關(guān)于匯編學(xué)習(xí)的程序,先說它在哪里用到了吧。在u-boot 或者Linux的起始時(shí)用的是匯編,至于為什么這樣,可以想想飛機(jī)的原理,飛機(jī)就是要擺脫輪子的慢,但是在飛機(jī)的起飛階段,飛機(jī)還是要用輪子的。這是為什么,因?yàn)檩喿涌梢杂兴膬?yōu)點(diǎn)。就想上邊兩種情況要用匯編一樣,這樣作用就明了了。真正造車的才會(huì)深入了解輪子的各種信息(這種就是指芯片公司的AP工程師)。嵌入式學(xué)習(xí)者就像說相聲的各個(gè)方面都要學(xué)習(xí),京劇,二人轉(zhuǎn)。不過那都叫學(xué)唱,同樣道理對(duì)于嵌入式學(xué)習(xí)者來說,匯編的作用也就是這了。
關(guān)于匯編中的標(biāo)號(hào)就是一個(gè)內(nèi)存地址的別名:
如下圖的START其實(shí)就是30000000,但是你在跳轉(zhuǎn)的時(shí)候還是記憶START是更容易的。
關(guān)于DCD和SPACE:
StackUsrDCDUsrStackSpace
AREAMyStacks,DATA,NOINIT,ALIGN=2
UsrStackSpaceSPACEUSR_STACK_LEGTH*4
以上代碼等價(jià)于C語言中的:
int*p=malloc(USR_STACK_LEGTH*4)
我個(gè)人認(rèn)為匯編因?yàn)橹胁荒軐⑦@樣寫,所以就找了UsrStackSpace來作中間量,它只是打醬油的,沒有在歷史上起到重要作用。
StackUsrDCDSPACEUSR_STACK_LEGTH*4
也可以這么說,如果代碼僅有上邊的,那么:StackUsr DCD UsrStackSpace會(huì)顯得多余了,因?yàn)楹谜涂梢钥闯鲋苯又蠻srStackSpace就可以了。
但是由于UsrStackSpace代表這一塊內(nèi)存的首地址了,我要是以后經(jīng)常訪問尾地址了怎么辦,再來一個(gè)玩意來存著尾地址。就用StackUsr了。讓StackUsr干活還要把它伺候好了,它本身也要占個(gè)位置,這就用到了DCD了,DCD給StackUsr找個(gè)位置,然后就開始給它任務(wù)了。如果把UsrStackSpace交給它,那么StackUsr和UsrStackSpace就一個(gè)樣了;如果把UsrStackSpace+(USR_STACK_LEGTH-1)*4給它,那么StackUsr指向了這個(gè)塊的末地址。至于誰會(huì)這要求,那就是堆棧了!
關(guān)于堆棧,就是棧。我有我的看法,這就好比一個(gè)好師傅在拆一個(gè)錄音機(jī),螺絲大小不一。那么拆的時(shí)候一般會(huì)將它們按照順序放著,這么做的目的就是為了一會(huì)兒修好了之后再裝的時(shí)候能一個(gè)一個(gè)對(duì)應(yīng)著裝上去。慢慢引入解釋就是說這個(gè)師傅把拆下的螺絲都放到了棧中,就是一個(gè)司空見慣的一個(gè)東西起了一個(gè)新名。師傅是靠各個(gè)螺絲的物理位置不同來安裝的,但是對(duì)于計(jì)算機(jī)來說它是“平面”的,只有先后順序沒有物理位置,只能靠拆下每個(gè)螺絲的順序來區(qū)別了,相當(dāng)于畫一個(gè)表,有123..順序,然后將螺絲一一放入對(duì)應(yīng)位置,裝的時(shí)候就反序一個(gè)裝上去。這樣就不會(huì)有錯(cuò)了。說這么一大堆就是一個(gè)怕搞錯(cuò)了。
計(jì)算機(jī)什么時(shí)候這樣做呢,就是用C語言編程在調(diào)用子函數(shù)時(shí)候,這個(gè)時(shí)候就相當(dāng)于這個(gè)師傅要拆錄音機(jī)了。子函數(shù)調(diào)用完后,就要回來繼續(xù)運(yùn)行主函數(shù),這個(gè)時(shí)候就相當(dāng)于師傅要裝上錄音機(jī)了。這時(shí)候就要看看在調(diào)用子函數(shù)時(shí)有沒有做好善后工作了,有沒有把主函數(shù)的狀態(tài)保存下來,回來的時(shí)候好還原出來當(dāng)初的狀態(tài)。放狀態(tài)的容器就是“?!保瑸橐策€原時(shí)不出錯(cuò),要狀態(tài)所涉及的所有東西一一按照順序放到這個(gè)容器里,到時(shí)候還原的時(shí)候再按時(shí)一定的順序取出來,如果兩個(gè)順序都定死了,以后就不會(huì)出錯(cuò)了。關(guān)于制定這兩個(gè)順序大家想到了,規(guī)定一個(gè)這個(gè)容器只有一個(gè)口.....(關(guān)于這個(gè)順序暫時(shí)還沒有想到通俗的例子)