單片機(jī)程序?qū)懞弥?,我們都要把程?a href="http://wenjunhu.com/soft/special/" target="_blank">下載到單片機(jī)的內(nèi)存中,單片機(jī)才會(huì)按照程序員的邏輯執(zhí)行命令實(shí)現(xiàn)功能。之前也講過(guò)下載單片機(jī)的幾種方式,比如ISP下載,JTAG下載,下載文件的格式最常見(jiàn)的是hex文件,這個(gè)格式大家都是知道的,還有一種bin文件是單片機(jī)的下載文件。下面介紹這兩種格式的區(qū)別。
HEX文件和BIN文件是我們經(jīng)常碰到的2種文件格式。下面簡(jiǎn)單介紹一下這2種文件格式的區(qū)別:
1 - HEX文件是包括地址信息的,而B(niǎo)IN文件格式只包括了數(shù)據(jù)本身
2 -在燒寫(xiě)或下載HEX文件的時(shí)候,一般都不需要用戶指定地址,因?yàn)镠EX文件內(nèi)部的信息已經(jīng)包括了地址。
? ? ? ? 而燒寫(xiě)B(tài)IN文件的時(shí)候,用戶是一定需要指定地址信息的。
3 - BIN文件格式
對(duì)二進(jìn)制文件而言,其實(shí)沒(méi)有”格式”。文件只是包括了純粹的二進(jìn)制數(shù)據(jù)。
4 - HEX文件格式
HEX文件都是由記錄(RECORD)組成的。在HEX文件里面,每一行代表一個(gè)記錄。記錄的基本格式為:
+---------------------------------------------------------------+
| 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:用來(lái)記錄數(shù)據(jù),HEX文件的大部分記錄都是數(shù)據(jù)記錄
‘01’ End of File Record: 用來(lái)標(biāo)識(shí)文件結(jié)束,放在文件的最后,標(biāo)識(shí)HEX文件的結(jié)尾
‘04’ Extended Linear Address Record: 用來(lái)標(biāo)識(shí)擴(kuò)展線性地址的記錄
‘02’ Extended Segment Address Record: 用來(lái)標(biāo)識(shí)擴(kuò)展段地址的記錄
在上面的后2種記錄,都是用來(lái)提供地址信息的。每次碰到這2個(gè)記錄的時(shí)候,都可以根據(jù)記錄計(jì)算出一個(gè)“基”地址。
對(duì)于后面的數(shù)據(jù)記錄,計(jì)算地址的時(shí)候,都是以這些“基”地址為基礎(chǔ)的。
數(shù)據(jù)記錄的具體格式:
+---------------------------------------------------------------+
| RECORD | RECLEN | LOAD | RECTYPE | INFO or DATA | CHKSUM |
| MARK ‘:’ | | OFFSET | ‘00’ | | |
+---------------------------------------------------------------+
| 1-byte | 1-byte | 2-byte | 1-byte | n-byte | 1-byte |
+---------------------------------------------------------------+
看個(gè)例子:
?。?20000040000FA
?。?0000400FF00A0E314209FE5001092E5011092E5A3
?。?0000001FF
對(duì)上面的HEX文件進(jìn)行分析:
第1條記錄的長(zhǎng)度為02,LOAD OFFSET為0000,RECTYPE為04,說(shuō)明該記錄為擴(kuò)展段地址記錄。數(shù)據(jù)為0000,校驗(yàn)和為
FA。從這個(gè)記錄的長(zhǎng)度和數(shù)據(jù),我們可以計(jì)算出一個(gè)基地址,這個(gè)地址為0X0000。后面的數(shù)據(jù)記錄都以這個(gè)地址為基
地址。
第2條記錄的長(zhǎng)度為10(16),LOAD OFFSET為0004,RECTYPE為00,說(shuō)明該記錄為數(shù)據(jù)記錄。
數(shù)據(jù)為FF00A0E314209FE5001092E5011092E5,共16個(gè)BYTE。這個(gè)記錄的校驗(yàn)和為A3。此時(shí)的基地址為0X0000,加上OFFSET,
這個(gè)記錄里的16BYTE的數(shù)據(jù)的起始地址就是0x0000 + 0x0004 = 0x0004.
第3條記錄的長(zhǎng)度為00,LOAD OFFSET為0000,TYPE = 01,校驗(yàn)和為FF。說(shuō)明這個(gè)是一個(gè)END OF FILE RECORD,標(biāo)識(shí)文件的結(jié)尾。
在上面這個(gè)例子里,實(shí)際的數(shù)據(jù)只有16個(gè)BYTE:FF00A0E314209FE5001092E5011092E5,其起始地址為0x4
Intel hex文件記錄中的數(shù)字都是16進(jìn)制格式,兩個(gè)16進(jìn)制數(shù)字代表一個(gè)字節(jié)。CC域是數(shù)據(jù)域中的實(shí)際字節(jié)數(shù),地址、記錄類型和校驗(yàn)和域沒(méi)有計(jì)算在內(nèi)。校驗(yàn)和是取記錄中從數(shù)據(jù)字節(jié)計(jì)數(shù)域(CC)到數(shù)據(jù)域(。。。)最后一個(gè)字節(jié)的所有字節(jié)總和的2的補(bǔ)碼。
而B(niǎo)in文件是最純粹的二進(jìn)制機(jī)器代碼,沒(méi)有格式,或者說(shuō)是“順序格式”按assembly code順序翻譯成binary machine code.由于分析出來(lái)Hex文件中的數(shù)據(jù)域ASCII碼表示的十六進(jìn)制與二進(jìn)制一一對(duì)應(yīng),而且我公司DSP又是16位的,以一個(gè)word為最小單位,所以四個(gè)十六進(jìn)制ASCII碼代表一條機(jī)器指令單位或者地址。借于上面分析,編寫(xiě)了工具代碼。大體原理是用fscanf函數(shù)在每行的數(shù)據(jù)域讀入四個(gè)ASCII碼,以短整形(short int 16bit)形式儲(chǔ)存,在把這個(gè)短整形變量順序fwrite到文件流中去即可。
HEX文件和BIN文件大小有區(qū)別
HEX文件是用ASCII來(lái)表示二進(jìn)制的數(shù)值。例如一般8-BIT的二進(jìn)制數(shù)值0x3F,用ASCII來(lái)表示就需要分別表示字符‘3’
和字符‘F’,每個(gè)字符需要一個(gè)BYTE,所以HEX文件需要 》 2倍的空間。
對(duì)一個(gè)BIN文件而言,你查看文件的大小就可以知道文件包括的數(shù)據(jù)的實(shí)際大小。而對(duì)HEX文件而言,你看到的文件
大小并不是實(shí)際的數(shù)據(jù)的大小。一是因?yàn)镠EX文件是用ASCII來(lái)表示數(shù)據(jù),二是因?yàn)镠EX文件本身還包括別的附加信息。
評(píng)論
查看更多