S19
S19[1], ou SREC[2], é o formato lógico de arquivos executáveis da Motorola.
Um arquivo no formato S19 possui informações de como gerar um arquivo executável completo, contendo todos os bytes que serão armazenados na memória para qual ele foi gerado. Por exemplo, um arquivo S19 gerado para um microcontrolador de 128KB de memória flash contém somente as informações das regiões de memória utilizadas pelo código objeto gerado, sendo possível montar um arquivo executável de 128KB a partir dessas informações.
Constituição
[editar | editar código-fonte]- Todas as linhas começam com a letra
S
(primeiro caractere). - O segundo caractere indica:
- 0 = cabeçalho (nome do arquivo em ASCII);
- 1 = dados; e,
- 9 = final do bloco de dados.
- O terceiro e o quarto caracteres representam, em hexadecimal, a quantidade de bytes que vem após o quarto caractere.
- Em todas as linhas, o último byte (dois últimos caracteres) representam a soma de verificação daquela linha.
- Na linha de dados do programa (S1), após os quatro primeiros caracteres (dois bytes) vêm:
- o endereço (dois bytes) - referente aos dados do programa, os quais vêm em seguida;
- os dados do programa; e,
- a soma de verificação (último byte) da linha.
Ou seja, a quantidade de bytes informada pelo terceiro e quarto caractere é "Endereço + Dados do Programa + Checksum".
Sendo assim, a representação de uma linha do arquivo S19 fica da seguinte forma:
St nn aaaa ddddddd ... cc
Em que:
- S = início da linha;
- t = tipo da linha;
- nn = número de bytes do endereço à soma de verificação;
- aaaa = endereço dos dados;
- dd = dados da linha; e,
- cc = soma de verificação do número de bytes (nn) + endereço (aaaa) + dados (dd) da linha.
Soma de verificação
[editar | editar código-fonte]A soma de verificação armazenada é o valor 0xFF menos o valor somado dos bytes - considerando somente byte para o armazenamento do somatória.
Exemplos:
- S1 04 FF BD FF 40 = 0xFF - (0x04 + 0xFF + 0xBD + 0xFF) = 0xFF - 0xBF (somente byte menos significativo) = 0x40.
- S9 03 00 00 FC = 0xFF - (0x03 + 0x00 + 0x00) = 0xFF - 0x03 = 0xFC.
Memórias maiores que 64KB
[editar | editar código-fonte]Como, com um endereço de somente dois bytes (quatro dígitos em hexa - aaaa) pode-se especificar endereçamentos de 0x0000 a 0xFFFF, ou seja, de 0 a 65535 (64K), foram criadas outras codificações para linhas que utilizam mais bytes para endereçamento:
- S2 = linha de dados que contém três bytes de endereço (aaaaaa);
- S3 = linha de dados que contém quatro bytes de endereço (aaaaaaaa);
- S7 = fim do bloco de dados de quatro bytes de endereço; e,
- S8 = fim do bloco de dados de três bytes de endereço.