Расширение имени файла | .s19 , .s28 , .s37 , .s , .s1 , .s2 , .s3 , .sx , .srec , .exo , [1] .mot ,.mxt |
---|---|
Разработано | Моторола |
Motorola S-record — это формат файла, созданный Motorola в середине 1970-х годов, который передает двоичную информацию в виде шестнадцатеричных значений в текстовой форме ASCII . Этот формат файла также может быть известен как SRECORD , SREC , S19 , S28 , S37 . Он обычно используется для программирования флэш-памяти в микроконтроллерах, EPROM , EEPROM и других типах программируемых логических устройств. В типичном приложении компилятор или ассемблер преобразует исходный код программы (например, язык C или ассемблера) в машинный код и выводит его в файл HEX. Затем файл HEX импортируется программистом для записи машинного кода в энергонезависимую память или передается в целевую систему для загрузки и выполнения.
Формат S-record был создан в середине 1970-х годов для процессора Motorola 6800. Инструменты разработки программного обеспечения для этого и других встроенных процессоров создавали исполняемый код и данные в формате S-record. Затем программисты PROM считывали формат S-record и «записывали» данные в PROM или EPROM, используемые во встроенной системе.
Существуют и другие кодировки ASCII с аналогичной целью. BPNF , BHLF и B10F были ранними двоичными форматами, но они не являются ни компактными, ни гибкими. Шестнадцатеричные форматы более компактны, поскольку представляют 4 бита, а не 1 бит на символ. Многие, такие как S-record, более гибки, поскольку включают адресную информацию, поэтому они могут указывать только часть PROM. Формат Intel HEX часто использовался с процессорами Intel. TekHex — еще один шестнадцатеричный формат, который может включать таблицу символов для отладки.
С | Тип | Количество байтов | Адрес | Данные | Контрольная сумма |
Файл формата SREC состоит из серии текстовых записей ASCII . Записи имеют следующую структуру слева направо:
0xFF - (sum & 0xFF)
Записи SREC разделяются одним или несколькими символами завершения строки ASCII, так что каждая запись отображается отдельно на текстовой строке. Это повышает читаемость, визуально разграничивая записи, а также обеспечивает заполнение между записями, что может использоваться для повышения эффективности машинного анализа .
Программы, создающие записи HEX, обычно используют символы завершения строки, соответствующие соглашениям их операционных систем . Например, программы Linux используют один символ LF ( перевод строки , 0x0A как значение символа ASCII) для завершения строк, тогда как программы Windows используют символ CR ( возврат каретки , 0x0D как значение символа ASCII), за которым следует символ LF.
В следующей таблице описываются 10 возможных S-записей. S4 зарезервирована и в настоящее время не определена. S6 была изначально зарезервирована, но позже была переопределена.
Поле записи | Цель записи | Поле адреса | Поле данных | Описание записи |
---|---|---|---|---|
С0 | Заголовок | 16-битный "0000" | Эта запись содержит специфичный для поставщика текстовый комментарий ASCII, представленный в виде серии пар шестнадцатеричных цифр. Обычно данные для этой записи можно увидеть в формате строки с нулевым завершением . Текстовые данные могут быть любыми, включая смесь следующей информации: имя файла/модуля, номер версии/ревизии, дата/время, название продукта, название поставщика, обозначение памяти на печатной плате, уведомление об авторских правах, вход в систему. [3] Обычно можно увидеть: 48, 44, 52, что является ASCII-представлением букв «H», «D», «R». [4] | |
С1 | Данные | 16-битный адрес | Эта запись содержит данные, которые начинаются с 16-битного адреса. [4] [3] Количество байтов данных, содержащихся в этой записи, равно "Поле количества байтов" минус 3 (2 байта для "16-битного поля адреса" плюс 1 байт для "Поле контрольной суммы"). Эта запись обычно используется для 8-битных процессоров, таких как 6502 , 6800 , 8051 , Z80 , AVR , PIC . | |
С2 | Данные | 24-битный адрес | Эта запись содержит данные, которые начинаются с 24-битного адреса. [4] Количество байтов данных, содержащихся в этой записи, равно «Полю количества байтов» минус 4 (3 байта для «24-битного поля адреса» плюс 1 байт для «Поля контрольной суммы»). | |
С3 | Данные | 32-битный адрес | Эта запись содержит данные, которые начинаются с 32-битного адреса. [4] Количество байтов данных, содержащихся в этой записи, равно "Byte Count Field" минус 5 (4 байта для "32-битного поля адреса" плюс 1 байт для "Checksum Field"). Эта запись обычно используется для 32-битных процессоров, таких как 68000 , ARM , RISC-V . | |
С4 | Сдержанный | — | — | Эта запись зарезервирована. |
С5 | Считать | 16-битный счетчик | Эта необязательная запись содержит 16-битное количество записей S1/S2/S3. [4] Эта запись используется, если количество записей меньше или равно 65 535 (0xFFFF), в противном случае будет использоваться запись S6. | |
С6 | Считать | 24-битный счетчик | Эта необязательная запись содержит 24-битное количество записей S1/S2/S3. Эта запись используется, если количество записей меньше или равно 16 777 215 (0xFFFFFF). Если меньше 65 536 (0x10000), то будет использоваться запись S5. ПРИМЕЧАНИЕ: Эта более новая запись является самым последним изменением (она может быть неофициальной). [4] | |
С7 | Начальный адрес (Окончание) | 32-битный адрес | Эта запись содержит начальное место выполнения по 32-битному адресу. [4] [5] Это используется для завершения серии записей S3. Если файл SREC используется только для программирования запоминающего устройства, а место выполнения игнорируется, то можно использовать нулевой адрес. | |
С8 | Начальный адрес (Окончание) | 24-битный адрес | Эта запись содержит начальное место выполнения по 24-битному адресу. [4] [5] Это используется для завершения серии записей S2. Если файл SREC используется только для программирования запоминающего устройства, а место выполнения игнорируется, то можно использовать адрес ноль. | |
С9 | Начальный адрес (Окончание) | 16-битный адрес | Эта запись содержит начальное место выполнения по 16-битному адресу. [4] [5] Это используется для завершения серии записей S1. [3] Если файл SREC используется только для программирования устройства памяти, а место выполнения игнорируется, то можно использовать нулевой адрес. |
Хотя в некоторых документах Unix указано, что «порядок S-записей в файле не имеет значения, и не может предполагаться какой-либо определенный порядок», [4] на практике большинство программ упорядочивают записи SREC. Типичный порядок записи начинается с (иногда необязательной) записи заголовка S0, продолжается последовательностью из одной или нескольких записей данных S1/S2/S3, может иметь одну необязательную запись счетчика S5/S6 и заканчивается одной соответствующей записью завершения S7/S8/S9.
Страница руководства из исторической документации Unix O/S гласит: «Файл S-записи состоит из последовательности специально отформатированных строк символов ASCII . Длина S-записи будет меньше или равна 78 байтам». Страница руководства дополнительно ограничивает количество символов в поле данных до 64 (или 32 байта данных). [4] Запись с адресом из 8 шестнадцатеричных символов и 64 символами данных будет иметь длину 78 (2 + 2 + 8 + 64 + 2) символов (это количество игнорирует возможные символы конца строки или завершения строки) и помещается на телетайпе шириной 80 символов . Примечание в нижней части страницы руководства гласит: «Эта страница руководства — единственное место, где документировано ограничение общей длины записи в 78 байт или ограничение длины данных в 64 байта. Этим значениям не следует доверять в общем случае». [4]
Если исторический предел в 78 байт игнорируется, максимальная длина S-записи составит 514 символов. Если предположить, что количество байт равно 0xFF (255), то это будет 2 для поля типа записи + 2 для поля количества байт + (2 * 255) для полей адреса / данных / контрольной суммы. Может потребоваться дополнительное буферное пространство для хранения до двух управляющих символов ( возврат каретки и/или перевод строки ) и/или символа конца строки NUL (0x00) для языков программирования C/C++. Использование длинных строк имеет проблемы: «Определение формата S-записи Motorola допускает до 255 байт полезной нагрузки или строк по 514 символов плюс завершение строки. Все программисты EPROM должны иметь достаточно большие буферы строк, чтобы справляться с записями такого размера. Немногие это делают». [6]
Минимальный объем данных для записей S0/S1/S2/S3 равен нулю.
В некоторых исторических документах рекомендуется использовать в этом поле максимум 32 байта данных (64 шестнадцатеричных символа) [4] (возможно, потому что 32 — это наибольшая степень числа 2 для данных, которые могут поместиться на телетайпе / компьютерном терминале / перфокарте шириной 80 столбцов ).
Если исторический предел в 32 байта игнорируется, то максимальный объем данных варьируется в зависимости от размера поля адреса (4 / 6 / 8). Максимальное количество байт данных рассчитывается как 255 (максимум для поля количества байт) минус (1 байт для поля контрольной суммы) минус (количество байт в поле адреса), таким образом, максимальный объем данных для каждого типа записи составляет: 252 байта данных (504 шестнадцатеричных символа) для записей S0 и S1, 251 байт данных (502 шестнадцатеричных символа) для записей S2, 250 байт данных (500 шестнадцатеричных символов) для записей S3.
За исключением преобразованных из ASCII в hex комментариев в заголовочных записях S0, формат файла SREC официально не поддерживает читаемые человеком комментарии ASCII , хотя некоторое программное обеспечение игнорирует все строки, которые не начинаются с "S" и/или игнорирует весь текст после поля контрольной суммы (таким образом, конечный текст иногда используется (несовместимо) для комментариев). Например, компилятор CCS PIC поддерживает размещение строки комментария ";" в верхней или нижней части файла Intel HEX , и в его руководствах говорится, что "некоторые программисты (в частности, MPLAB) не любят комментарии в верхней части файла hex", поэтому компилятор имеет возможность размещать комментарий в нижней части файла hex. [7]
Тип записи Количество байтов Адрес Данные Контрольная сумма
Следующий пример записи:
S1 13 7AF0 0A0A0D0000000000000000000000000000 61
декодируется, чтобы показать, как вычисляется значение контрольной суммы. В следующем примере используется знак доллара ( $ ) для указания шестнадцатеричного значения (конвенция Motorola):
$13 + $7A + $F0 + $0A + $0A + $0D + $00 + ... + $00 = $019E
Добавить: сложить сумму каждого байта .$01
) суммы и сохранить младший байт (LSB), то есть $9E
.$61
.В языке программирования C сумма преобразуется в контрольную сумму следующим образом:0xFF - (sum & 0xFF)
S0 0F 0000 68656C6C6F20202020200000 3C S1 1F 0000 7C0802A6900100049421FFF07C6C1B787C8C23783C60000038630000 26 S1 1F 001C 4BFFFFE5398000007D83637880010014382100107C0803A64E800020 E9 S1 11 0038 48656C6C6F20776F726C642E0A00 42 S5 03 0003Ф9 С9 03 0000ФК
[…] Для совместимости с телетайпами некоторые программы могут ограничивать количество байтов [данных] до 28 (56 печатных символов в записи S). […]