SREC

维基百科,自由的百科全书

Motorola S-record摩托罗拉公司所創立的檔案格式,可以將二進制的資訊轉換為用ASCII文字表示的十六进制資料,此檔案格式也稱為SRECORDSRECS19S28S37MOT。此檔案格式常用在微處理器的闪存資料寫入,EPROMEEPROM的資料寫入,或是其他可編程邏輯元件的編程寫入。一般的應用中,會用編譯器或是組譯器將程式的原始碼(可能是C語言或是組合語言)轉換為機器碼,再輸出為S-record或其他格式檔案。燒錄器可以讀取這些檔案,將機器碼寫入非揮發性記憶體中,或是截入到目的系統中,以便執行。

簡介[编辑]

S-record檔案格式是摩托罗拉公司在1970年代中期,為了摩托罗拉6800處理器所創的檔案格式。針對摩托罗拉6800處理器及其他嵌入式系统软件开发工具可以將可執行檔及資料轉換為S-record格式。PROM燒錄器可以讀取S-record,燒錄到嵌入式系统的PROM或EPROM中。

其他HEX格式[编辑]

也存在類似用途的其他ASCII檔案格式。BPNF、BHLF及B10F是早期的二進制格式,不過檔案較大,也沒有可變性。十六進制格式用一個字元表示四個位元,相較於二進制格式用一個字元表示一個位元,檔案比較精簡。許多十六進制格式(包括S-record)的可變性較大,其中可以包括位址的資訊,因此其內容可以只對應PROM的一部份。Intel HEX格式常用在Intel的處理器上。Tek Hex是另一種HEX格式,其中包括了除錯用的符號表

格式[编辑]

記錄結構[编辑]

S 記錄種類 位元組數量 位址 資料 檢查碼

SREC格式的檔案包括一組的ASCII字元記錄。記錄從左到右的結構如下[1]

  1. 記錄種類,二個字元,第一個字元為大寫的S(0x53),後面是數字字元的0至9,定義記錄的種類。
  2. 位元組數量,由16進制的二位數組成,表示記錄中剩下的位元組數(16進制二位數表示一個位元組),此欄位的最小值為3,對應16進制的位址欄位加上一個位元組的檢查碼,最大值為255(0xFF)。
  3. 位址,依記錄種類不同,位址可能是四位/六位/八位的16進制數字,位址會以大端序(高位元組放前面)的格式記錄。
  4. 資料,由2n個16進制數字組成。若是S1/S2/S3種類的記錄,每筆記錄的資料一般最多是32個位元組,可以在每行80個字的終端機螢幕顯示,不過記錄資料若只有16個位元組,在視覺上比較容易識別
  5. 檢查碼,由2個16進制數字組成,是位元組數量、位址和資料對應的位元組相加後,取最低位元組英语least significant byte,再計算一補數,以下有計算檢查的例子。

文字列的結束字元[编辑]

SREC記錄之間會用一個或是多個ASCII字元的行分隔字元隔開,因此每一個記錄就會佔一行。此作法透過直觀的分隔英语delimiter記錄來提高易讀性,而且在HEX記錄之間的填充也可以提高語法分析器的效率。

產生HEX的程式一般會依其操作系统的習慣使用對應的行分隔字元。例如,Linux程式會用單一的LF字元( 換行符號,16進制0A)作為一行的結尾[1],但Windows程式會用CR字元(回车符,16進制0D)之後接著LF字元,作為一行的結尾。

記錄種類[编辑]

以下的表格說明十種可能出現的S-records,其中的S4保留,目前沒有定義,S6一開始也是保留,後來有新的定義。

記錄
欄位
記錄用途 位址
欄位
資料
欄位
記錄
說明
S0 檔案頭 16-bit
"0000"
是 此記錄會包括許多設備商定義的ASCII文字,每個位元組由二個16進制數字表示。此欄位的資料常會以C风格字符串的方式表示。其中的文字資料可能會包括:檔案/模組名稱,版本編號,日期/時間,產品名稱。PCB上的記憶體IC名稱、版權說明等。[1]
S1 資料 16-bit
位址
是 此記錄是啟始位址是16位元的資料[1],一般會用在8-bit的微處理器中,例如AVR、PIC、8051、68xx、6502、80xx、Z80。其資料欄位的位元組數量是「位元組數量」欄位的值減3(2個位元組對應16位元的位址,1個位元組對應檢查碼)。
S2 Data 24-bit
Address
是 此記錄是啟始位址是24位元的資料[1]。其資料欄位的位元組數量是「位元組數量」欄位的值減4(3個位元組對應24位元的位址,1個位元組對應檢查碼)。
S3 Data 32-bit
Address
是 此記錄是啟始位址是32位元的資料This record contains data that starts at a 32-bit address.[1],一般會用在32-bit的微處理器中,例如ARM和680x0其資料欄位的位元組數量是「位元組數量」欄位的值減5(4個位元組對應32位元的位址,1個位元組對應檢查碼)。
S4 保留 不適用 不適用 此記錄保留
S5 個數 16位元
計數值
否 此欄位是可有可無的欄位,其中有S1 / S2 / S3記錄的數量,用16位元來計數[1]。此欄位適用於記錄數量小於等於65,535(0xFFFF)的情形,若是超過,會改用S6欄位。
S6 個數 24位元
計數值
否 此欄位是可有可無的欄位,其中有S1 / S2 / S3記錄的數量,用24位元來計數。此欄位可以適用於記錄數量大於等於65,536(0x010000),但小於等於16,777,215(0xFFFFFF)。這個較新的欄位是最新的變更[1]
S7 起始位址
(檔案終止符)
32位元
位址
否 此欄位用32位元記錄啟始的位址[1][2],用來作為一連串S3記錄的結尾。若SREC檔案只用來燒錄記憶體設備,不需執行位置的資料,此處的位址可以用0代替。
S8 起始位址
(檔案終止符)
24位元
位址
否 此欄位用24位元記錄啟始的位址[1][2],用來作為一連串S2記錄的結尾。若SREC檔案只用來燒錄記憶體設備,不需執行位置的資料,此處的位址可以用0代替。
S9 起始位址
(檔案終止符)
16位元
位址
否 此欄位用16位元記錄啟始的位址[1][2],用來作為一連串S1記錄的結尾。若SREC檔案只用來燒錄記憶體設備,不需執行位置的資料,此處的位址可以用0代替。

記錄順序[编辑]

有些Unix文件中提到「檔案中S-records的順序不重要,不應假設其順序。」[1],不過大部份產生SREC的軟體都會按照次序排列S-records。一般的檔案順序會由一個(選擇性)的S0檔頭記錄,之後有一筆或是多筆S1/S2/S3資料記錄,可能有一個S5/S6記錄來說明記錄個數,最後由一個適當的S7/S8/S9記錄作結束。

S19-格式,16位元位址的記錄
  1. S0
  2. S1(一筆或多筆記錄)
  3. S5(選擇性的記錄)
  4. S9
S28-格式,24位元位址的記錄
  1. S0
  2. S2(一筆或多筆記錄)
  3. S5(選擇性的記錄)
  4. S8
S37-格式,32位元位址的記錄
  1. S0
  2. S3(一筆或多筆記錄)
  3. S5(選擇性的記錄)
  4. S7

限制[编辑]

記錄長度:Unix手冊中提到:「每個S-record記錄的長度小於等於78個字元」。手冊進一步的限制資料欄位字元限制在64個字元(32個位元組)以內[1]。用8個字元表示位址的資料欄位,若資料為64個字元,總長度為78個字元(2+2+8+64+2,此計算省略了記錄尾端的終止符號或是換行符號)。這個檔案可以用80字元寬的列表機列印。在手冊下面有說明:「此說明只是針對記錄總長度在78個字元的情形,不一定適用於所有情形。」[1]。若省略此限制,S-record的最大長度為514字元:記錄種類2個字元,位元組數量2個位元(其值會是0xFF=255),以及位址、資料及檢查碼共2*255個字元。而且需要額外的空間儲存換行符號以及字串結束字元。若記錄長度太長,會有一些問題:「Motorola S-record格式定義允許一行到514個字元,另外加上行終結符號。EPROM燒錄器需要有夠大的行暫存器來處理這麼長的資料,但有這麼大暫存器的EPROM燒錄器不多。」[3]

資料欄位:有些文件建議資料欄位最長到32位元組的資料(64個字元)[1]。S0/S1/S2/S3的最小資料欄位長度為0,最大資料資料欄位長度視位址欄位長度而定。因為位元組數量最大值是255(0xFF),資料欄位的長度為255減1(檢查碼)再減去位址欄位的位元組長度)。S0/S1 records最多可以到252位元組的資料,S2 record最多可以到251位元組的資料,S3 record最多可以到250位元組的資料。

註解:SREC檔案格式不支援註解,有些軟體會省略開頭不是S的資料行,也會省略檢查碼之後的欄位,有時會有這些部份來寫註解(但沒有相容性)。例如CCS PIC編譯器支援在Intel HEX英语Intel HEX檔案最前面或是最後面的行,前面加上分號當成註解,其手冊提到:「有些燒錄器(尤其是MPLAB)不喜歡在檔案最前面出現註解,因此我們有選項,可以把註解放在檔案後面。[4]

例子[编辑]

不同顏色的含義

  記錄種類   位元組數量   位址   資料   檢查碼

檢查碼的計算[编辑]

以下是一個記錄的例子:

S1137AF00A0A0D0000000000000000000000000061

其檢查碼計算方式如下:

  1. 加總:將每個位元組相加13 + 7A+F0 + 0A+0A+0D+00+00+00+00+00+00+00+00+00+00+00+00+00 = 19E (16進制)
  2. 取最低位元組:總和的最低位元組 = 9E(16進制)。
  3. 取補數:計算最低位元組的一補數 = 61(16進制)。

16位元的記憶體位址[编辑]

S00F000068656C6C6F202020202000003C
S11F00007C0802A6900100049421FFF07C6C1B787C8C23783C6000003863000026
S11F001C4BFFFFE5398000007D83637880010014382100107C0803A64E800020E9
S111003848656C6C6F20776F726C642E0A0042
S5030003F9
S9030000FC

相關條目[编辑]

參考資料[编辑]

  1. ^ 1.00 1.01 1.02 1.03 1.04 1.05 1.06 1.07 1.08 1.09 1.10 1.11 1.12 1.13 1.14 Motorola S-records from Unix man pages.. [2014-06-30]. (原始内容存档于2014-06-20). 
  2. ^ 2.0 2.1 2.2 Motorola, Appendix C, M68000 Family Programmer's Reference Manual (PDF) rev. 1, Motorola (Freescale): C–1–C–5, 1992 [2019-07-23], ISBN 978-0137232895, (原始内容存档 (PDF)于2015-09-24) 
  3. ^ srec_examples. sourceforge.net. [2019-07-23]. (原始内容存档于2019-08-24). 
  4. ^ CCS Compiler Reference Manual PCB/PCM/PCH (PDF), Custom Computer Services, Inc.: 107, 2014-05 [2015-02-08], (原始内容存档 (PDF)于2015-03-19) 

延伸閱讀[编辑]

  • M68HC05EVM Evaluation Module User's Manual 4th, Motorola (Freescale), 1990  Appendix A, "S Record Information", page A-1, states, "For compatibility with teletypewriters, some programs may limit the number of [data] bytes to as few as 28 (56 printable characters in the S-record)."
  • M146805EVM Evaluation Module Users Manual 1st, Motorola (Freescale), 1983 
  • MCM6830L7 MIKBUG / MINIBUG ROM, Engineering Note 100, Motorola (Freescale), 1975 

外部連結[编辑]

軟體