mkcrc un outil pour insérer un crc dans un binaire

Introduction

Lorsqu'on utilise des microprocesseurs 24 h sur 24, il arrive, après des coupures de courant intempestives ou des orages, qu'ils aient du mal à redémarrer et si ils démarrent il peuvent ne pas faire exactement ce qui est démandé. Une simple reprogrammation résoud le problème ce qui laisse à supposer que la mémoire flash est corrompue.

En insérant un crc dans le code et en ajoutant une fonction de calcul de crc, on peut vérifier l'intégrité de la mémoire soit en une seule commande soit octet par octet lorsque la boucle principale n'a rien d'autre à faire. En cas d'erreur on peut prendre une action, comme par exemple augmenter la cadence de la led d'activité.

La commande mkcrc permet d'injecter un crc dans le code qui va être flashé dans le processeur et de tester en local le code qui va être embarqué dans le processeur. En fait le crc injecté est calculé de manière à avoir un crc global à 0. Ainsi, le changement d'un bit sera détecté en produisant un crc non nul.

Compilation de mkcrc

Mkcrc n'a aucune dépendance sur aucune distribution. Il utilise la libc de votre distribution..

tar Jxvf mkcrc-yyyymmdd.tar.xz
cd mkcrc-yyyymmdd
make
make install # to copy the binary in /usr/local/bin

Utilisation

En utilisation normale, mkcrc lit le binaire d'une application extrait par objcopy et la liste de symboles extraite par nm après une compilation par la chaine gcc. Il recherche les informations _edata et _data que le programme aura sur la cible lorsqu'il s'exécutera pour calculer la taille réelle du binaire. Il rajoute, après le binaire déterminé par sa taille, 4 octets complémentaires calculés pour avoir un CRC nul.

$ objcopy -Obinary binary.elf binary.bin # $(PREFIX)-objcopy -> arm-none-eabi-objcopy for stm32
$ nm -n -S binary > binary.nm            # $(PREFIX)-nm -> arm-none-eabi-nm for stm32
$ mkcrc -s binary.nm binary.bin

$ mkcrc -c stmtelei.bin
mkcrc: INFO: mkcrc_do_crc32: mkcrc.c:237: Crc for 'stmtelei.bin'= 0x0

Si on n'a pas d'informations sur les symboles, mkcrc utilise le fichier binaire, calcule les octets complémentaires pour que le CRC soit nul et les rajoute à la fin du fichier.

$ mkcrc binary.bin

$ mkcrc -c binary.bin
mkcrc: INFO: mkcrc_do_crc32: mkcrc.c:237: Crc for 'stmtelei.bin'= 0x0

L'endroit idéal pour loger ces commandes, c'est le Makefile.

Comme les CRC peuvent se calculer dans tous les sens, ici on se limite au crc32 utilisé dans internet donc avec un polynone 0xEDB88320 et le calcul est fait lsb en premier.

Pour les AVR , le programme pgrm insére le CRC complémentaire avant le bootloader.

License

The mkcrc software is licensed under the terms of the GNU General Public License as published by the Free Software Foundation. See the file COPYING in the archive.

Download