S-record文件 如S19 mot文件解析


以下對Motorola S-records的清晰完整的描述是多年前從一個Unix系統的用戶手冊中找到的。

Motorola S-records

名字

SREC — S-record文件和記錄格式,S-record file and record format

描述

每個S-record文件都包含多行按特殊格式組織的ASCII字符串。一行S-record的長度小於或等於78字節。

記錄順序

一個文件中的S-record間的排序並不重要,不應該默認某種順序。

記錄格式

一行S-record的通用格式如下:

類型 — 一個char[2]字段。這兩個字符描述了這條記錄的類型(S0、S1、S2、S3、S5、S7、S8或S9)。

長度 — 一個char[2]字段。把這兩個字符成對地看成一個十六進制的整型值,它代表了這條記錄中剩餘的字符對的個數。

地址 — 一個char[4、6或8]字段。把這些字符看做十六進制整型值,它們代表了數據字段要加載進的地址。這個字段的長度取決於描述地址所需要的字節數。兩字節的地址需要4個字符、三字節的地址需要6個字符、四字節的地址需要8個字符.

數據 — 一個char[0-64]字段。取決於記錄的類型,可能把它們看做描述信息;或者把這些字符看做十六進制整型值,每兩個代表一個字節,這時這些字節就是要被加載進對應地址的數據。

校驗和 — 一個char[2]字段。把這兩個字符成對地看成一個十六進制的整型值,這個值等於長度地址數據字段中對應的所有字節值相加後按位取反得到的值的最低有效字節值。

每一行記錄都由一個換行符結束。如果在傳輸到目標系統的時候需要任何額外的或者不同的結束符或延遲字符,那這是傳輸程序的事情。

不同類型的記錄

S0 記錄

記錄的類型是 ‘S0’ (0x5330)。不使用地址字段,地址字段會填充0(0x0000)。這時數據字段內放的是標題信息,分爲以下幾個部分。

char[20]的mname字段,代表模塊名字。
char[2]的ver字段,代表版本號。
char[2]的rev字段,代表修訂號。
char[0-36]的描述字段,代表文本註釋。

每個子字段都由ASCII字符組成,每兩個代表一個字節的十六進制值,比如版本號和修訂號,或者在模塊名和描述中看做ASCII字符對應的十六進制值。

S1 記錄

記錄的類型是 ‘S1’ (0x5331)。地址字段是兩字節地址。數據字段則包含着要寫入地址的數據。

S2 記錄

記錄的類型是 ‘S2’ (0x5332)。地址字段是三字節地址。數據字段則包含着要寫入地址的數據。

S3 記錄

記錄的類型是 ‘S3’ (0x5333)。地址字段是四字節地址。數據字段則包含着要寫入地址的數據。

S5 記錄

記錄的類型是 ‘S5’ (0x5335)。地址字段要看做兩字節的整型值,代表之前傳輸的S1、S2和S3記錄的總數。不使用數據字段。

S7 記錄

記錄的類型是 ‘S7’ (0x5337)。地址字段是四字節地址,代表着代碼的起始運行地址。不使用數據字段。

S8 記錄

記錄的類型是 ‘S8’ (0x5338)。地址字段是三字節地址,代表着代碼的起始運行地址。不使用數據字段。

S9 記錄

記錄的類型是 ‘S9’ (0x5339)。地址字段是兩字節地址,代表着代碼的起始運行地址。不使用數據字段。

示例

下面給出一個典型的S-record格式的文件。

S00600004844521B
S1130000285F245F2212226A000424290008237C2A
S11300100002000800082629001853812341001813
S113002041E900084E42234300182342000824A952
S107003000144ED492
S5030004F8
S9030000FC

這個文件包含一條S0記錄、四條S1記錄、一條S5記錄以及一條S9記錄。

S0記錄解釋如下:

  • S0:S-record類型S0,表明這是一條標題記錄。
  • 06:十六進制值06(十進制值6),表明後面有6個字符對(或ASCII字節)。
  • 00 00:4字符的兩字節地址字段,這裏全是0。
  • 48 44 52:ASCII字符H、D和R - “HDR”。
  • 1B:校驗和( 0x1B = ~(0x06 + 0x48 + 0x44 + 0x52) )

首個S1記錄解釋如下:

  • S1:S-record類型S1,表明這是一個要放在兩字節地址的數據記錄。
  • 13:十六進制值13(十進制值19),表明後面有19個字符對,包括一個兩字節地址、16字節的二進制數據以及一個一字節校驗和。
  • 00 00:4字符的兩字節地址字段;十六進制地址0x0000,後面的數據要加載到這裏。
  • 28 5F 24 5F 22 12 22 6A 00 04 24 29 00 08 23 7C:代表實際二進制值的16個字符對。
  • 2A:校驗和

第2和第3條S1記錄都包含0x13(19)個字符對,分別由校驗和13和52結束。第4條S1記錄包含07個字符對,校驗和爲92。

S5記錄解釋如下:

  • S5:S-record類型S5,表明這是條聲明S1記錄個數的計數記錄。
  • 03:十六進制值03(十進制值3),表明後面跟着3個字符對。
  • 00 04:十六進制值0004(十進制值4),表明這條記錄之前有4條數據記錄。
  • F8:校驗和

S9記錄解釋如下:

  • S9:S-record類型S9,表明這是條結束記錄。
  • 03:十六進制值03(十進制值3),表明後面跟着3個字符對。
  • 00 00:地址字段,十六進制值0(十進制值0)表明代碼的起始運行地址。
  • FC:校驗和。

注意事項

  • 沒有任何證據證明摩托羅拉公司曾經在S0記錄的數據字段中使用過標題信息。這估計是被某個第三方使用的。
  • 只有這個文檔提到了一條記錄的總長有78字節的限制,或說數據字段的長度有64字節的限制。爲了程序更加通用,不應該默認這個限制。
  • 長度字段的取值範圍爲0x3(2字節的地址字段+1字節的校驗和)到0xff;這是指剩下的字符對的總數,包括校驗和。
  • 如果你要寫代碼來轉換S-records,你應該假設一條記錄可以長達514(十進制)個字符(255 * 2 = 510,再加上類型字段和長度字段的4個字符),加上可能有的結束符。換句話說,在使用C語言創建輸入緩衝區時,你應該聲明一個大小爲515的字符數組,因爲要保留一個空間給字符串結束符’\0’。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章