S-Record
Das Motorola-S-Record-Format ist ein ASCII-basiertes Datenformat zur Kodierung von Binärdateien. Es ist auch als SREC- oder S19-Format bekannt. Hauptsächlich wird es zum Abspeichern des Programmcodes von Mikrocontrollern in eingebetteten Systemen verwendet. Es wurde in den 1970er Jahren vom Hersteller Motorola für dessen 6800-Mikroprozessor entwickelt.
Ein ähnliches, wenn auch leicht unterschiedliches Format ist das Intel-HEX-Format, welches u. a. für Intel-Prozessoren verwendet wird.
Die ASCII-Kodierung erlaubt die Bearbeitung bzw. das Öffnen der Datei mit einem Texteditor. Da es Prüfsummen enthält, können bei einer Übertragung beschädigte Datensätze erkannt werden.<ref>srec - Linux man page</ref>
Format
Eine S-Record-Datei besteht aus einer Reihe von ASCII-Datensätzen (engl. Records). Alle Hexadezimalzahlen sind Big endian, d. h. das höchstwertige Byte wird als erstes, also auf der kleineren Adresse gespeichert. Die Datensätze haben folgende Struktur:
- Start code, ein Zeichen: S
- Record type (Datensatztyp), eine Ziffer, 0 bis 9, definiert den Typ des Datensatzes
- Byte count (die Anzahl der Bytes), zwei hexadezimale Ziffern, 0 bis F, beinhaltet die Anzahl der Bytes (also jeweils zwei hexadezimale Ziffern), die im restlichen Datensatz (Adresse, Daten und Prüfsumme) folgen.
- Adresse, vier, sechs oder acht hexadezimale Ziffern (abhängig vom Datensatztyp), die die Speicheradresse der darauf folgenden Daten festlegen.
- Datenfeld, eine Folge von 2n hexadezimalen Ziffern, also n Datenbytes
- Checksum (Prüfsumme), zwei hexadezimale Ziffern – das Einerkomplement des niederwertigen Bytes der Summe von byte count, Adresse (byteweise) und der Daten (ebenfalls byteweise)
Es gab einige Programme, die die Anzahl der Zeichen in einem S-Record aus Gründen der Kompatibilität mit Fernschreibern auf 56 druckbare Zeichen begrenzten<ref name="Programmer's Reference Manual">https://www.nxp.com/docs/en/reference-manual/M68000PRM.pdf (PDF; 2,4 MB) Appendix C</ref>. Eine UNIX-Manpage schreibt von einer Begrenzung auf 78 druckbare Zeichen<ref><templatestyles src="Webarchiv/styles.css" />{{#if:20150619132413
| {{#ifeq: 20150619132413 | *
| {{#if: Archivierte Kopie | {{#invoke:WLink|getEscapedTitle|Archivierte Kopie}} | {{#invoke:Webarchiv|getdomain|http://www.ee.nmt.edu/~teare/ee308l/datasheets/S_RECORD.TXT}} }} (Archivversionen)
| {{#iferror: {{#time: j. F Y|20150619132413}}
| {{#if: || }}Der Wert des Parameters {{#if: wayback | wayback | Datum }} muss ein gültiger Zeitstempel der Form YYYYMMDDHHMMSS sein!
| {{#if: Archivierte Kopie | {{#invoke:WLink|getEscapedTitle|Archivierte Kopie}} | {{#invoke:Webarchiv|getdomain|http://www.ee.nmt.edu/~teare/ee308l/datasheets/S_RECORD.TXT}} }} {{#ifeq: | [] | [ | ( }}{{#if: {{#if: 2019-05-11 10:47:26 InternetArchiveBot | 2019-05-11 10:47:26 InternetArchiveBot | }} | des Vorlage:Referrer }} vom {{#time: j. F Y|20150619132413}} im Internet Archive{{#if: | ; }}{{#ifeq: | [] | ] | ) }}
}}
}}
| {{#if:
| {{#iferror: {{#time: j. F Y|{{{webciteID}}}}}
| {{#switch: {{#invoke:Str|len|{{{webciteID}}}}}
| 16= {{#if: Archivierte Kopie | {{#invoke:WLink|getEscapedTitle|Archivierte Kopie}} | {{#invoke:Webarchiv|getdomain|http://www.ee.nmt.edu/~teare/ee308l/datasheets/S_RECORD.TXT}} }} {{#ifeq: | [] | [ | ( }}{{#if: {{#if: 2019-05-11 10:47:26 InternetArchiveBot | 2019-05-11 10:47:26 InternetArchiveBot | }} | des Vorlage:Referrer }} vom {{#time: j. F Y| 19700101000000 + {{#expr: floor {{#expr: {{#invoke:Str|sub|{{{webciteID}}}|1|10}}/86400}} }} days}} auf WebCite{{#if: | ; }}{{#ifeq: | [] | ] | ) }}
| 9 = {{#if: Archivierte Kopie | {{#invoke:WLink|getEscapedTitle|Archivierte Kopie}} | {{#invoke:Webarchiv|getdomain|http://www.ee.nmt.edu/~teare/ee308l/datasheets/S_RECORD.TXT}} }} {{#ifeq: | [] | [ | ( }}{{#if: {{#if: 2019-05-11 10:47:26 InternetArchiveBot | 2019-05-11 10:47:26 InternetArchiveBot | }} | des Vorlage:Referrer}} vom {{#time: j. F Y| 19700101000000 + {{#expr: floor {{#expr: {{#invoke:Str|sub|{{#invoke:Expr|base62|{{{webciteID}}}}}|1|10}}/86400}} }} days}} auf WebCite{{#if: | ; }}{{#ifeq: | [] | ] | ) }}
| #default= Der Wert des Parameters {{#if: webciteID | webciteID | ID }} muss entweder ein Zeitstempel der Form YYYYMMDDHHMMSS oder ein Schüsselwert mit 9 Zeichen oder eine 16-stellige Zahl sein!{{#if: || }}
}}
| c|{{{webciteID}}}}} {{#if: Archivierte Kopie | {{#invoke:WLink|getEscapedTitle|Archivierte Kopie}} | {{#invoke:Webarchiv|getdomain|http://www.ee.nmt.edu/~teare/ee308l/datasheets/S_RECORD.TXT}} }} ({{#if: {{#if: 2019-05-11 10:47:26 InternetArchiveBot | 2019-05-11 10:47:26 InternetArchiveBot | }} | des Vorlage:Referrer}} vom {{#time: j. F Y|{{{webciteID}}}}} auf WebCite{{#if: | ; }}{{#ifeq: | [] | ] | ) }}
}}
| {{#if:
| Vorlage:Webarchiv/Today
| {{#if:
| Vorlage:Webarchiv/Generisch
| {{#if: Archivierte Kopie | {{#invoke:WLink|getEscapedTitle|Archivierte Kopie}} | {{#invoke:Webarchiv|getdomain|http://www.ee.nmt.edu/~teare/ee308l/datasheets/S_RECORD.TXT}} }}
}}}}}}}}{{#if:2019-05-11 10:47:26 InternetArchiveBot
| Vorlage:Webarchiv/archiv-bot
}}{{#invoke:TemplatePar|check
|all = url=
|opt = text= wayback= webciteID= archive-is= archive-today= archiv-url= archiv-datum= ()= archiv-bot= format= original=
|cat = Wikipedia:Vorlagenfehler/Vorlage:Webarchiv
|errNS = 0
|template = Vorlage:Webarchiv
|format = *
|preview = 1
}}{{#ifexpr: {{#if:20150619132413|1|0}}{{#if:|+1}}{{#if:|+1}}{{#if:|+1}}{{#if:|+1}} <> 1
| {{#if: || }}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Genau einer der Parameter 'wayback', 'webciteID', 'archive-today', 'archive-is' oder 'archiv-url' muss angegeben werden.|1}}
}}{{#if:
| {{#switch: {{#invoke:Webarchiv|getdomain|{{{archiv-url}}}}}
| web.archive.org =
{{#if: || }}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Im Parameter 'archiv-url' wurde URL von Internet Archive erkannt, bitte Parameter 'wayback' benutzen.|1}}
| webcitation.org =
{{#if: || }}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Im Parameter 'archiv-url' wurde URL von WebCite erkannt, bitte Parameter 'webciteID' benutzen.|1}}
| archive.today |archive.is |archive.ph |archive.fo |archive.li |archive.md |archive.vn =
{{#if: || }}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Im Parameter 'archiv-url' wurde URL von archive.today erkannt, bitte Parameter 'archive-today' benutzen.|1}}
}}{{#if:
| {{#iferror: {{#iferror:{{#invoke:Vorlage:FormatDate|Execute}}|}}
| {{#if: || }}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Der Wert des Parameter 'archiv-datum' ist ungültig oder hat ein ungültiges Format.|1}}
| }}
| {{#if: || }}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Der Pflichtparameter 'archiv-datum' wurde nicht angegeben.|1}}
}}
| {{#if:
| {{#if: || }}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Der Parameter 'archiv-datum' ist nur in Verbindung mit 'archiv-url' angebbar.|1}}
}}
}}{{#if:{{#invoke:URLutil|isHostPathResource|http://www.ee.nmt.edu/~teare/ee308l/datasheets/S_RECORD.TXT}}
|| {{#if: || }}
}}{{#if: Archivierte Kopie
| {{#if: {{#invoke:WLink|isBracketedLink|Archivierte Kopie}}
| {{#if: || }}
}}
| {{#if: || }}
}}{{#switch:
|addlarchives|addlpages= {{#if: || }}{{#if: 1 |}}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: enWP-Wert im Parameter 'format'.|1}}
}}{{#ifeq: {{#invoke:Str|find|http://www.ee.nmt.edu/~teare/ee308l/datasheets/S_RECORD.TXT%7Carchiv}} |-1
|| {{#ifeq: {{#invoke:Str|find|{{#invoke:Str|cropleft|http://www.ee.nmt.edu/~teare/ee308l/datasheets/S_RECORD.TXT%7C4}}%7Chttp}} |-1
|| {{#switch: {{#invoke:Webarchiv|getdomain|http://www.ee.nmt.edu/~teare/ee308l/datasheets/S_RECORD.TXT }}
| abendblatt.de | daserste.ndr.de | inarchive.com | webcitation.org =
| #default = {{#if: || }}{{#if: 1 |}}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Archiv-URL im Parameter 'url' anstatt URL der Originalquelle. Entferne den vor der Original-URL stehenden Mementobestandteil und setze den Archivierungszeitstempel in den Parameter 'wayback', 'webciteID', 'archive.today' oder 'archive-is' ein, sofern nicht bereits befüllt.|1}}
}}
}}
}}</ref>. Da von Motorola kein Limit definiert wurde, sollte ein Programm auch mit einem Byte count von 255, also mit 514 druckbaren – zuzüglich terminierender – Zeichen umgehen können<ref> http://www.macgui.com/usenet/?author=Ron+Widell&id=1600&group=45</ref>.
Es existieren die acht unten aufgeführten Datensatztypen:
| Record | Beschreibung | Adressbytes | Datenfeld |
|---|---|---|---|
| S0 | Block header (Block-Vorspann) | 2 | Ja |
| S1 | Datenreihe | 2 | Ja |
| S2 | Datenreihe | 3 | Ja |
| S3 | Datenreihe | 4 | Ja |
| S5 | Record count (Datensatzanzahl) | 2 | Nein |
| S6 | Record count (Datensatzanzahl) | 3 | Nein |
| S7 | End of block (Blockende) | 4 | Nein |
| S8 | End of block (Blockende) | 3 | Nein |
| S9 | End of block (Blockende) | 2 | Nein |
- Der S0-Vorspann enthält keine Programmdaten, sondern herstellerspezifische Daten. Das Datenfeld ist folgendermaßen aufgebaut:
- Modulname (20 Zeichen)
- Version (2 Zeichen) (optional)
- Revision (2 Zeichen) (optional)
- Beschreibung (0–36 Zeichen) (optional)
- Im S5-Datensatz ist die Anzahl der vorstehenden S1-, S2- und S3-Datensätze in dem zwei Byte großen Adressfeld gespeichert. Dieser Datensatz enthält kein Datenfeld. Der S6-Datensatz hat die gleiche Funktion wie der S5-Datensatz und hat auch - bis auf das drei Byte große Adressfeld - den gleichen Aufbau.
- Die Adressfelder von S7, S8, oder S9 können die Startadresse des Programms enthalten.<ref name= "Programmer's Reference Manual" />
Beispiel
Beispiel mit 16-bit Adressen
S00F000068656C6C6F212020202000003B S11F00007C0802A6900100049421FFF07C6C1B787C8C23783C6000003863000026 S11F001C4BFFFFE5398000007D83637880010014382100107C0803A64E800020E9 S111003848656C6C6F20776F726C642E0A0042 S5030003F9 S9030000FC
Die Prüfsumme für den ersten Beispiel-Datensatz berechnet sich wie folgt: <math>{0F+00+00+68+65+6C+6C+6F+21+20+20+20+20+00+00}\ =\ 2C4 \rightarrow C4 \rightarrow \neg C4\ =\ 3B</math>.
Beispiel mit 24-bit Adresse
S2140D0760FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87
Verwandte Dateiformate
Sehr ähnlich ist das Intel HEX-Format (auch kurz Intel HEX). Weitere Formate für diesen Anwendungsbereich sind z. B. der einfache Binärcode oder das Jedec-Format.
Quellen
<references />
Weblinks
- Aufbau des S-Record-Formats
- SRecord (englisch) Eine Sammlung von Programmwerkzeugen zur Bearbeitung von S-Record-Dateien
- hexformat – Python-Bibliothek für die HEX-Formate SRecord und IntelHex