13.4代碼重定位_拷貝代碼和鏈接腳本的改進(jìn)
本節(jié)進(jìn)行拷貝代碼的改進(jìn)和鏈接腳本的改進(jìn)。
前面重定位時,需要ldrb命令從的Nor Flash讀取1字節(jié)數(shù)據(jù),再用strb命令將1字節(jié)數(shù)據(jù)寫到SDRAM里面。?

????????JZ2440上的Nor Flash是16位,SDRAM是32位。 假設(shè)現(xiàn)在需要復(fù)制16byte數(shù)據(jù), 采用ldrb命令每次只能加載1byte,因此CPU需要發(fā)出16次命令,內(nèi)存控制器每次收到命令后,訪問硬件Nor Flash,因此需要訪問硬件16次; 同理,訪問SDRAM時,CPU需要執(zhí)行strb 16次,內(nèi)存控制器每次收到命令后,訪問硬件SDRAM,也要16次,這樣總共訪問32次。
????????現(xiàn)在對其進(jìn)行改進(jìn),使用ldr從Nor Flash中讀,ldr命令每次加載4字節(jié)數(shù)據(jù),因此CPU只需執(zhí)行4次,但由于Nor Flash是16位的,內(nèi)存控制器每次收到CPU命令后,需要拆分成兩次訪問,因此需要訪問硬件8次;
使用str寫SDRAM,CPU只需執(zhí)行4次,內(nèi)存控制器每次收到命令后,直接硬件訪問32位的SDRAM,因此這里只需要4次,這樣總共訪問只需要12次。
在整個操作中,花費(fèi)時間最長的就是硬件訪問,改進(jìn)后代碼,減少了硬件訪問的次數(shù),極大的提高了效率。

根據(jù)上面原理修改代碼,修改start.S:?

然后編譯燒寫,發(fā)現(xiàn)啟動后沒有輸出字符。修改主程序,嘗試以整數(shù)格式輸出字符,發(fā)現(xiàn)輸出的數(shù)從0開始,應(yīng)該是 全局變量被破壞了。
屏蔽掉start.S里面的清理命令,測試是否是清除bss段是清除了全局變量。?

屏蔽后,正常輸出,鎖定了問題大致位置。查看反匯編文件,原來是沒有向4取整。 修改鏈接腳本讓bss段,使用ALIGN(4)向4取整。?

現(xiàn)在重新編譯燒寫,測試結(jié)果正常。 再次查看反匯編文件,發(fā)現(xiàn)現(xiàn)在bss段以4字節(jié)對齊,清理bss段也是正常的。?

同樣的問題也會出在代碼重定位這里,如何保證data段起始地址也是向4對齊呢? 也是使用ALIGN(4)向4取整。?

Uboot是裸機(jī)的集大成者,可以參考uboot鏈接腳本也是類似的。