資源描述:
《hex格式文件學習筆記.doc》由會員上傳分享,免費在線閱讀,更多相關內容在教育資源-天天文庫。
1、前兩天做s3c2440的nandfalsh實驗時,有些問題(函數的指定地址存放)沒有弄懂,今天花了一天的時間,算是把這個問題給解決掉了,為了更加深入的了解以及以后的復習之用,決定把他總結以下。首先,先認識一個問題,就是為什么能夠指定地址存放?這個就涉及到生成hex鏡像文件(不是bin文件),hex文件中包含了下載的地址(后面會詳細解釋),當下載軟件如j-link,j-tag或是usb下載會根據hex文件中的地址信息將代碼下到指定的地址單元中去。這里需要注意的是由于nandflash是不參與cpu編址的,它的地址是相對自己而言,所以如果要在nandflash中下載到指定地址,需要通
2、過u-boot來實現。并且u-boot必須支持這個功能,而其他的存儲器是沒這個問題,因為它們參與cpu的統(tǒng)一編址。好,現在問題來了,hex中的地址怎么來的呢?這個就是adslink器功勞了,我們指導ads連接器在配置的時候有三種模式,第一種模式很少用,一般我們是使用第二種而第三種,第二種是用的最多的,是生成簡單的鏈接文件,不能對函數實現指定地址存放,第三種是生成復雜的鏈接文件,可以實現函數的指定地址存放,這是通過scatter文件實現的(后面會詳細介紹)下面就看一下hex文件全稱IntelHEXntelHEX文件是由一行行符合IntelHEX文件格式的文本所構成的ASCII文本文
3、件。在IntelHEX文件中,每一行包含一個HEX記錄。這些記錄由對應機器語言碼和/或常量數據的十六進制編碼數字組成。IntelHEX文件通常用于傳輸將被存于ROM或者EPROM中的程序和數據。大多數EPROM編程器或模擬器使用IntelHEX文件。 記錄格式 IntelHEX由任意數量的十六進制記錄組成。每個記錄包含5個域,它們按以下格式排列: :llaaaatt[dd...]cc 每一組字母對應一個不同的域,每一個字母對應一個十六進制編碼的數字。每一個域由至少兩個十六進制編碼數字組成,它們構成一個字節(jié),就像以下描述的那樣: :每個IntelHEX記錄都由冒號開頭.
4、 ll是數據長度域,它代表記錄當中數據字節(jié)(dd)的數量. aaaa是地址域,它代表記錄當中數據的起始地址. tt是代表HEX記錄類型的域,它可能是以下數據當中的一個: 00–數據記錄 01–文件結束記錄 02–擴展段地址記錄 04–擴展線性地址記錄??????05?-?開始線性地址記錄后面則是真正的數據記錄 dd是數據域,它代表一個字節(jié)的數據.一個記錄可以有許多數據字節(jié).記錄當中數據字節(jié)的數量必須和數據長度域(ll)中指定的數字相符. cc是校驗和域,它表示這個記錄的校驗和.校驗和的計算是通過將記錄當中所有十六進制編碼數字對的值相加,以256為模進行以下補足.
5、 數據記錄 IntelHEX文件由任意數量以回車換行符結束的數據記錄組成.數據記錄外觀如下: :10246200464C5549442050524F46494C4500464C33 其中: 10是這個記錄當中數據字節(jié)的數量. 2462是數據將被下載到存儲器當中的地址. 00是記錄類型(數據記錄) 464C…464C是數據. 33是這個記錄的校驗和. 擴展線性地址記錄(HEX386) 擴展線性地址記錄也叫作32位地址記錄或HEX386記錄.這些記錄包含數據地址的高16位.擴展線性地址記錄總是有兩個數據字節(jié),外觀如下: :02000004FFFFFC 其中:
6、 02是這個記錄當中數據字節(jié)的數量. 0000是地址域,對于擴展線性地址記錄,這個域總是0000. 04是記錄類型04(擴展線性地址記錄) FFFF是地址的高16位. FC是這個記錄的校驗和,計算方法如下: 01h+NOT(02h+00h+00h+04h+FFh+FFh). 當一個擴展線性地址記錄被讀取,存儲于數據域的擴展線性地址被保存,它被應用于從IntelHEX文件讀取來的隨后的記錄.線性地址保持有效,直到它被另外一個擴展地址記錄所改變. 通過把記錄當中的地址域與被移位的來自擴展線性地址記錄的地址數據相加獲得數據記錄的絕對存儲器地址. 以下的例子演示了這個過程
7、.. 來自數據記錄地址域的地址2462 擴展線性地址記錄的數據域+FFFF ------------ 絕對存儲器地址FFFF2462 擴展段地址記錄(HEX86) 擴展段地址記錄也叫HEX86記錄,它包括4-19位數據地址段.擴展段地址記錄總是有兩個數據字節(jié),外觀如下: :020000021200EA 其中: 02是記錄當中數據字節(jié)的數量. 0000是地址域.對于擴展段地址記錄,這個域總是0000. 02是記錄類型02(擴展段地址記錄) 1200是地址段.