微控制器各種燒寫檔案格式簡介

2022-11-07 07:18:03 字數 5470 閱讀 4528

各種燒寫檔案格式簡介-elf hex bin

一,elf

executable and linking format(elf)檔案是x86 linux系統下的一種常用目標檔案(object file)格式,有三種主要型別:

executable and linking format(elf)檔案是x86 linux系統下的一種常用目標檔案(object file)格式,有三種主要型別:

(1)適於連線的可重定位檔案(relocatable file),可與其它目標檔案一起建立可執行檔案和共享目標檔案。

(2)適於執行的可執行檔案(executable file),用於提供程式的程序映像,載入的記憶體執行。

(3)共享目標檔案(sharedobjectfile),聯結器可將它與其它可重定位檔案和共享目標檔案連線成其它的目標檔案,動態聯結器又可將它與可執行檔案和其它共享目標檔案結合起來建立乙個程序映像。

elf檔案格式比較複雜。

二,hex

什麼是intel hex格式?

intel hex檔案是記錄文字行的ascii文字檔案,在intel hex檔案中,每一行是乙個hex記錄由十六進製制數組成的機器碼或者資料常量,intel hex檔案經常被用於將程式或資料傳輸儲存到大多數程式設計器和模擬器使用intel hex檔案.

記錄格式

乙個intel hex檔案可以包含任意多的十六進製制記錄,每條記錄有五個域,下面是乙個記錄的格式.

:llaaaatt[dd...]cc

每一組字母是獨立的一域,每乙個字母是乙個十六進製制數字,每一域至少由兩個十六進製制數字組成,下面是位元組的描述.

:冒號是每一條intel hex記錄的開始

ll是這條記錄的長度域,他表示資料(dd)的位元組數目.

aaaa是位址域,他表示資料的起始位址

《如果是資料記錄,這表示將要燒錄的這條記錄中的資料在eprom中的偏移位址,

對於不支援擴充套件段位址和擴充套件線性位址的,如89c51,這就是此條記錄的起始位址》

tt這個域表示這條hex記錄的型別,他有可能是下面這幾種型別00 ----資料記錄01 ----檔案結束記錄02 ----擴充套件段位址記錄04 ----擴充套件線性位址記錄

dd是資料域,表示乙個位元組的資料,乙個記錄可能有多個資料位元組,位元組數目可以檢視ll域的說明

cc是效驗和域,表示記錄的效驗和,計算方法是將本條記錄冒號開始的所有字母對

《不包括本效驗字和冒號》所表示的十六進製制數字

《一對字母表示乙個十六進製制數,這樣的乙個十六進製制數為乙個位元組》

都加起來然後模除256得到的餘數最後求出餘數的補碼即是本效驗位元組cc.《例如:

:0300000002005e9d

cc=0x01+not((0x03+0x00+0x00+0x00+0x02+0x00+0x5e)%0x100)=0x01+0x9c=0x9d

c語言描述:uchar cc;

cc=(uchar)~(0x03+0x00+0x00+0x00+0x02+0x00+0x5e);cc++;>

資料記錄

intel hex檔案由若干個資料記錄組成,乙個資料記錄以乙個回車和乙個換行結束《回車為0x0d換行為0x0a>

比如下面的一條資料記錄

:10246200464c5549442050524f46494c4500464c33

10是此行記錄資料的位元組數目

2462是資料在記憶體《將要燒寫的eprom位址》中的起始位址00是記錄型別00(是乙個資料記錄)464c到464c是資料33是此行記錄的效驗和

擴充套件線性位址記錄(hex386)

擴充套件線性位址記錄也可稱為32位位址記錄和hex386記錄,這個紀錄包含高16(16-31位)位資料位址,這種擴充套件的線性記錄總是有兩個位元組資料,像下面這樣:

:02000004fffffc

02是記錄的資料位元組數目

0000是位址域這在擴充套件位址記錄中總是000004是記錄型別04(擴充套件位址記錄)ffff是高16位位址

fc是記錄效驗和,計算方法如下:

01h + not(02h + 00h + 00h + 04h + ffh + ffh)

當乙個擴充套件線性位址記錄被讀到後,擴充套件線性位址記錄的資料區域將被儲存並應用到後面從intel hex檔案中讀出的記錄,這個擴充套件線性記錄一直有效,直到讀到下乙個擴充套件線性記錄.

絕對記憶體位址=資料記錄中的位址+移位後的擴充套件線性位址

下面舉例說明這個過程

從資料記錄的位址域得到位址2462

從擴充套件線性位址記錄的位址域得到位址ffff絕對記憶體位址ffff2462

擴充套件段位址記錄(hex86)

擴充套件段位址記錄也被稱為hex86記錄,包含4-19位的資料位址段,這個擴充套件段位址記錄總是有兩位元組資料,如下:

:020000021200ea

02是記錄中的資料位元組數目

0000是位址域,在擴充套件段位址記錄中,這個域總是000002是記錄型別02(擴充套件段位址的標示)1200是該段的位址ea是效驗和計算如下:

01h + not(02h + 00h + 00h + 02h + 12h + 00h).

當擴充套件段位址記錄被讀後,擴充套件段位址將被儲存並應用到以後從intel hex檔案讀出的記錄,這個段位址一直有效直到讀到下乙個擴充套件段位址記錄

絕對記憶體位址=資料記錄中的位址+移位後的擴充套件段位址

資料記錄中的位址域移位後擴充套件段位址記錄中的位址域

下面舉例說明這個過程

從資料記錄的位址域得到位址2 4 6 2

從擴充套件段位址記錄的位址域得到位址1 2 0 0絕對記憶體位址0 0 0 1 4 4 6 2

檔案結束記錄(eof)

乙個intel hex檔案必須有乙個檔案結束記錄,這個記錄的型別域必須是01,乙個eof記錄總是這樣::00000001ff

00是記錄中資料位元組的數目

0000這個位址對於eof記錄來說無任何意義01記錄型別是01(檔案結束記錄標示)ff是效驗和計算如下

01h + not(00h + 00h + 00h + 01h總結

形如:bbaaaatthhhh...hhhhcc

bb: byte

aaaa:資料記錄的開始位址,高位在前,地位在後因為這個格式只支援8bits,位址被倍乘

所以,為了得到實際的pic的位址,需要將位址除以2tt: type

00資料記錄01記錄結束

04擴充套件位址記錄(表示32位位址的字首,當然這種只能在inhx32)hhhh:乙個字(word)的資料記錄,高byte在前,低byte在後tt之後,總共有bb/2個字的資料cc:乙個byte的checksum

因為pic16f873a只有4k的程式空間

所以,不會有tt=04的linear address record

三,bin

bin檔案就是直接的二進位制檔案,內部沒有位址標記。一般用程式設計器燒寫時從00開始,而如果**執行,則**到編譯時的位址即可。

總結:可以由elf檔案轉化為其它兩種檔案,hex也可以直接轉換為bin檔案,但是bin要轉化為hex檔案必須要給定乙個基位址。而hex和bin不能轉化為elf檔案,因為elf的資訊量要大。

另外還有一種ads的除錯檔案axf,它可以轉化為bin檔案,用以下命令fromelf-nodebug -bin 即可。

hex檔案和bin檔案的區別

hex檔案和bin檔案是我們經常碰到的2種檔案格式。下面簡單介紹一下這2種檔案格式的區別:

1-hex檔案是包括位址資訊的,而bin檔案格式只包括了資料本身

在燒寫或**hex檔案的時候,一般都不需要使用者指定位址,因為hex檔案內部的資訊已經包括了位址。而燒寫bin

檔案的時候,使用者是一定需要指定位址資訊的。

3-bin檔案格式

對二進位制檔案而言,其實沒有」格式」。檔案只是包括了純粹的二進位制資料。

4-hex檔案格式

hex檔案都是由記錄(record)組成的。在hex檔案裡面,每一行代表乙個記錄。記錄的基本格式為:

| record | reclen | load | rectype | info or data | chksum || mark ':' | | offset | | | |

1-byte | 1-byte | 2-byte | 1-byte | n-byte | 1-byte

記錄型別包括:

'00' data rrecord:用來記錄資料,hex檔案的大部分記錄都是資料記錄

'01' end of file record:用來標識檔案結束,放在檔案的最後,標識hex檔案的結尾'04' extended linear address record:用來標識擴充套件線性位址的記錄'02' extended segment address record:

用來標識擴充套件段位址的記錄

在上面的後2種記錄,都是用來提供位址資訊的。每次碰到這2個記錄的時候,都可以根據記錄計算出乙個「基」位址。

對於後面的資料記錄,計算位址的時候,都是以這些「基」位址為基礎的。

資料記錄的具體格式:

| record | reclen | load | rectype | info or data | chksum || mark ':' | | offset | '00' | | |

1-byte | 1-byte | 2-byte | 1-byte | n-byte | 1-byte

看個例子:

:020000040000fa

:10000400ff00a0e314209fe5001092e5011092e5a3:00000001ff

對上面的hex檔案進行分析:

第1條記錄的長度為02,loadoffset為0000,rectype為04,說明該記錄為擴充套件段位址記錄。資料為0000,校驗和為

fa。從這個記錄的長度和資料,我們可以計算出乙個基位址,這個位址為0x0000。後面的資料記錄都以這個位址為基位址。

第2條記錄的長度為10(16),load offset為0004,rectype為00,說明該記錄為資料記錄。

資料為ff00a0e314209fe5001092e5011092e5,共16個byte。這個記錄的校驗和為a3。此時的基位址為0x0000,加上offset,

這個記錄裡的16byte的資料的起始位址就是0x0000 + 0x0004 = 0x0004.

第3條記錄的長度為00,loadoffset為0000,type=01,校驗和為ff。說明這個是乙個end of file record,標識檔案的結尾。

在上面這個例子裡,實際的資料只有16個byte:ff00a0e314209fe5001092e5011092e5,其起始位址為0x4

4-hex檔案和bin檔案大小有區別

hex檔案是用ascii來表示二進位制的數值。例如一般8-bit的二進位制數值0x3f,用ascii來表示就需要分別表示字元'3'

和字元'f',每個字元需要乙個byte,所以hex檔案需要》 2倍的空間。

對乙個bin檔案而言,你檢視檔案的大小就可以知道檔案包括的資料的實際大小。而對hex檔案而言,你看到的檔案

大小並不是實際的資料的大小。一是因為hex檔案是用ascii來表示資料,二是因為hex檔案本身還包括別的附加資訊。

要想詳細了解hex檔案格式,請googleintelhex,就能找到詳細的pdf文件。

微控制器實習

第四次實習 樓道照明燈 一 實習題目 樓道照明燈 二 實習目的 綜合實驗,掌握80c51微控制器的程式設計除錯方法。三 實習內容 實現樓道間照明燈的方便控制,乙個照明燈,在樓上和樓下各有乙個 閉合式 開關控制。開關的閉合並不直接決定燈的亮滅,而開關狀態的改變才是決定燈亮滅的關鍵。即不管兩個開關當前的...

微控制器總結

微控制器引腳 80c51的資料儲存器配置 80c51的特殊功能暫存器 sfr 五個中斷源 兩個外部中斷,兩個定時器計數器中斷,乙個序列介面中斷。int0 int1輸入低電平或負跳變訊號作為中斷觸發事件 t0 t1定時器 計數器中斷 序列口中斷 8051微控制器中斷源的向量位址 tcon的中斷標誌 中...

微控制器學習

自己不知不覺已經走過了五年的微控制器學習之旅。在2003年最初接觸微控制器的時候,在我心中覺得51就是微控制器,微控制器就是51,根本不知道還有其他微控制器的存在。那時候老師只教會了我們組合語言,根本不知道用c語言也可以進行微控制器開發。幸運的是,我加入了微控制器興趣小組,在老師的指導下,做了一系列...