よく分からなくなるモトローラSレコードフォーマットまとめ

組込ソフトの開発現場では、モトローラSレコードを直接見たり、少し加工したりすることもしばしばです。その都度、,ネットをみたり、昔作ったツールのコードを見たり手間なので自分用に必要なことだけをまとめておきます。

レコードの種類

レコードレイアウトはより、まずレコードの種類で悩みます。

種類項目名説明
S0コメントROM書き用なら削除してよい。
コンパイラが吐いたものなら削除していい。
生産情報ょ埋込むユーザさんもいるのでたくさんある場合は注意。
S116bitアドレスデータS2、S3と混在もOK。並びは基本アドレスの昇順。
S224bitアドレスデータS1、S3と混在もOK。並びは基本アドレスの昇順。
S332bitアドレスデータS1、S2と混在もOK。並びは基本アドレスの昇順。
S4リサーブ
S516bitアドレスデータレコード数ほとんど見たことがない。
ROM読書き時は無視してもよい。
S624bitアドレスデータレコード数ほとんど見たことがない。
ROM読書き時は無視してもよい。
S7S3セグメントの末尾に付与される。ここのデータ数値は諸説あるようだが、ROM読書きでは使用しない。
チェックサムではない。
次セグメントのアドレスoffsetは、Intel Hexの方である。
S8S2セグメントの末尾に付与される。ここのデータ数値は諸説あるようだが、ROM読書きでは使用しない。
チェックサムではない。
次セグメントのアドレスoffsetは、Intel Hexの方である。
S9S1セグメントの末尾に付与される。ここのデータ数値は諸説あるようだが、ROM読書きでは使用しない。
チェックサムではない。
次セグメントのアドレスoffsetは、Intel Hexの方である。
その他全体のチェックサム行はない

レコードのフォーマット

まず vim の .mot 設定をSetupしましょう。詳しくはこちら。

S1レコード:

byte位置 1基点桁数内容
12レコードタイプ
32レコード長、16進、
データ長 ÷2 + 8
48アドレス、16進
13桁以降2~512データ、16進、データ長は最大255
後ろから2チェックサム,
0xFF – アドレス以降の2桁毎のバイナリ値の総和を256で割った余り

S2レコード:

byte位置 1基点桁数内容
12レコードタイプ
32レコード長、16進、
データ長÷2 + 12
412アドレス、16進
17桁以降2~512データ、16進、データ長は最大255
後ろから2チェックサム、上に同じ

S3レコード:

byte位置 1基点桁数内容
12レコードタイプ
32レコード長、16進、
データ長桁数÷2 + 16
416アドレス、16進
21桁以降2~512データ、16進、データ長は最大255
後ろから2チェックサム、上に同じ

読込み時は、

  • コンパイラによって、マイコンのアドレス範囲によって、S1、S2、S3 がごちゃ混ぜになる場合がある。(コンパイラ次第ではレコード種を指定すれば回避化可能)
  • コンパイラによって、レコードデータ長が統一されない場合がある。
  • コンパイラによって、ブランクが空く場合がある。(コンパイラ次第では出力アドレス範囲を指定すれば回避可能)

自ら生成する場合は、

  • 利用先システムよって、レコードデータ長が統一されないと異常動作する場合がある。
  • 利用先システムよって、ブランクあると異常動作する場合がある。
  • 利用先システムよって、データフラッシュやRAM領域など、アドレスが 0xFxxx xxxx で書かれたデータを読むと落ちる場合がある。(絶対アドレスとしてメモリ確保されてしまうと当然足りない…)

弊方では、モトローラSレコード、Intel Hex fileのROMデータ加工アプリケーションとAPIライブラリも開発しております。自社で作るのは面倒、時間がない、土台となるコードがないなどありましたら、こちらより気軽にご相談ください。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です