首先從開發(fā)板硬件講起:
思考問題: 開發(fā)板上電后,程序是如何啟動呢???
這里分 nor flash 啟動 和 nand flash 啟動
講解 :
nand flash 啟動:
______________________________________________________________________________________________________________________
由于NAND FLASH是接在NAND FLASH控制器上而不是系統(tǒng)總線上,所以沒有在S3C2440A的8個BANK中分配地址空間。如果S3C2440被配置成從Nand Flash啟動,在S3C2440上電后,Nand Flash控制器的會自動的把Nand Flash上的前4K數(shù)據(jù)搬移到內(nèi)部SRAM中,也就是所謂的”Steppingstone”, 同時把這段片內(nèi)SRAM映射到nGCS0片選的空間(即0x00000000)。系統(tǒng)會從這個內(nèi)部SRAM中啟動,程序員需要完成的工作,就是把最核心的啟動程序放在Nand Flash的前4K中,也就是說,你需要編寫一個長度小于4K的引導程序,作用是將主程序拷貝到RAM (一般是SDRAM)中運行。而在Nand Flash方式啟動的情況下,系統(tǒng)是”看不到”Nor Flash的,因為Nor Flash也是掛在nGCS0上的,而nGCS0的地址空間已經(jīng)被占用了。
________________________________________________________________________________________________________________________
1、系統(tǒng)上電后,首先自動判斷是否是autoboot模式,如果使用 s3c2410是帶有nandflash的,并且被設置成autoboot,從nandflash開始啟動.
2、在判斷是autoboot模式后,mcu內(nèi)置的nandflash控制器自動將nandflash的最前面的4k區(qū)域(這4k區(qū)域存放著 bootloader的最前面4k代碼)拷貝到samsung所謂的"steppingstone"里面(steppingstone是在S3C2440 中,實際上是一塊4k大小的SRAM,).
3、在拷貝完前4k代碼后,nandflash控制器自動將"steppingstone"映射到arm
地址空間0x00000000開始的前4k區(qū)域.
4、在映射過程完成后.nandflash控制器將pc指針直接指向arm
地址空間的0x00000000位置,準備開始執(zhí)行"steppingstone"上的代碼.
5、而"steppingstone"上從nandflash拷貝過來的4k代碼,是程序員寫的bootloader的前4k代碼.這個 bootloader在之前寫好,并已經(jīng)被燒寫到nandflash的0x00000000開始的最前面區(qū)域..而這"steppingstone"上的 4k代碼就是bootloader的前4k代碼.
6、在pc指向arm
地址空間的0x00000000后,系統(tǒng)就開始執(zhí)行指令代碼.這4k代碼的任務是:初始化硬件,設置
中斷向量表,設置
堆棧,然后一個很重要的任務是,將nandflash的最前面區(qū)域的bootloader(包含4k啟動代碼)拷貝到SDRAM中去,bootloader代碼的大小是寫好bootloader就確定的.然后只需要確定bootloader想映射到SDRAM的起始位置就ok.
7、在完成對nandflash上的bootloader搬移后,找到4k代碼的搬移代碼最后一個指令的下一個指令在SDRAM的bootloader的地址,然后跳轉到該位置,繼續(xù)執(zhí)行bootloader的剩余代碼(引導系統(tǒng)).
具體可以看: http://blog.csdn.net/r91987/article/details/7625916 雖然沒有圖,但是說得很好啊
因為代碼必須從 地址 0x000000 開始啟動,而 nor flash 就是0x000000 但是nand flash 地址確是 0x30000000 行不通,但是我們有個 4KB 的 steping stone(ARM 芯片自己有的)地址是 0x00000,這樣可以
硬件復制前4KB 代碼到 stepping stone 再轉到 0x30000000 的 SDRAM 中去
nor flash 啟動,由于 nor flash 可以存放 bios , 但是 可讀不可寫,但是 bootloader 里面的 RW 段 和 ZI 段 要被寫,自然也要進行代碼的搬遷工作(參考 楊鑄 97頁)
————————————————————————————————————————————————————————————————————————————————————————————————————————————————
————————————————————————————————————————————————————————————————————————————————————————————————————————————————
啟動代碼詳解:
總得來說,裸機開發(fā) 啟動代碼只有 100 多條 匯編指令, 通過啟動代碼可以近一步熟悉 ARM 匯編指令, 好處是為以后熟練運用 ARM C語言, 匯編語言混合編程以及 uboot的移植打下基礎。
那么怎樣才算ARM匯編 過關呢???? 只要看得懂啟動代碼就可以了。。。。。。。。。。““““ ““ “ “““ “。。。。。。!然后自己會修改就行了!啊啊啊啊啊。岚 “““ ““ “ 。。。。。。。。。!