
ARM是單片機學習過程中必然需要接觸的,很多朋友在對ARM的啟動過程中遇到了這樣或者那樣的問題。雖然大部分問題都能通過查閱資料或者求助于有經驗的人來得到答案,但這樣的方式其實并不利于對ARM系列整體的理解與把握,問題始終還會出現,因此了解ARM的啟動流程便非常必要。本文將對ARM9的啟動流程進行介紹,感興趣的朋友快來隨小編一起看一看吧。
AT91SAM系列的ARM內置了一片bootrom,如果選擇了合適的BMS電平(高電平),那么芯片啟動后會將bootrom映射到0x0地址。啟動bootrom后會從外面的的NVM(dataflash,nandflash..)中去尋找是否存在"合法"的固件程序。如果存在,就將這個固件拷貝到內部SRAM中來運行。而此固件程序一般放置的就是bootstrap。再由它去完成u-boot和kernel等等的搬移。
順序如下:bootrom(ROM)->bootstrap(SRAM)->u-boot(SDRAM)->kernel(SDRAM)。
對于dataflash和nandflash的NVM,ATMEL很巧妙的將第6個向量處放置的內容當做Bootstrap的大小。但是打開AT91bootstrap的源碼時,可以發現第6個向量處有2種寫法:
1、B.(或弄一個標號,跳轉本身)
2、.word_edata
第一種是直接放了一跳ARM跳轉本身的指令在此位置,轉換為機器碼之后是一個非常大的數,遠遠超出了SRAM的大小。第二種是用了匯編器的一個預留關鍵字_edata,它指向數據段的結尾。按道理應該是和編譯出來的bin同樣大小才正確。但是通過將bin文件打開查看第6個向量確不相等,才會發現是由于基地址并不是0x0導致。
由于bootstrap最終是在SRAM里運行,以SAM9260為例,SRAM基地址是0x20000。所以是_edata=0x20000+程序大小,還是無法滿足要求。這兩種方式都不正確,那BOOTROM是怎么知道要拷貝多大的長度呢?這里有人猜測是不是超過最大的長度就OK了,即SRAM大小減去BOOTROM程序本身所需的堆棧,這是一個合理的解釋,不過實際操作會浪費很多時間。
而真相是:原來SAM-BA軟件中有一個sendbootfile的操作,這個操作暗地里讀取文件大小將其寫入第六個向量再寫入0地址,所以bootstrap必須用SAM-BA的sendbootfile的方式燒寫,如果自己從0地址sendfile是啟動不了的,大家可以做實驗驗證。
通過以上的介紹,可以看到ARM9的啟動流程可以分為4種,只要對這四種流程進行一定程度的了解,就能應對大多數在ARM9流程當中所遇到的問題。此外,本文對于BOOTROM拷貝的長度也作出了通俗易懂的解釋,這就方便了初學者對于ARM9的理解。其實很多時候問題的發生都是因為不夠了解導致的,在學習一款器件或知識點之前進行充分的理解,才能避免一些錯誤的發生。
聲明:本內容為作者獨立觀點,不代表電源網。本網站原創內容,如需轉載,請注明出處;本網站轉載的內容(文章、圖片、視頻)等資料版權歸原作者所有。如我們采用了您不宜公開的文章或圖片,未能及時和您確認,避免給雙方造成不必要的經濟損失,請電郵聯系我們,以便迅速采取適當處理措施;歡迎投稿,郵箱∶editor@netbroad.com。
微信關注 | ||
![]() |
技術專題 | 更多>> | |
![]() |
技術專題之EMC |
![]() |
技術專題之PCB |