Modifications

Sauter à la navigation Sauter à la recherche
Ligne 121 : Ligne 121 :  
Sur le M0, vous aurez besoin de <font color="red">'''double cliquer'''</font> le bouton '''reset'''. Vous verrez la LED rouge pulser, ce qui indique que le bootloader est actif. Une fois dans ce mode, il n'y a pas de "time out", le M0 reste en mode bootloader indéfiniment. Cliquez une nouvelle fois sur le bouton "reset" pour redémarrer le microcontrôleur.
 
Sur le M0, vous aurez besoin de <font color="red">'''double cliquer'''</font> le bouton '''reset'''. Vous verrez la LED rouge pulser, ce qui indique que le bootloader est actif. Une fois dans ce mode, il n'y a pas de "time out", le M0 reste en mode bootloader indéfiniment. Cliquez une nouvelle fois sur le bouton "reset" pour redémarrer le microcontrôleur.
   −
== Aligned Memory Access ==
+
== Alignement en mémoire ==
This is a little less likely to happen to you but it happened to me! If you're used to 8-bit platforms, you can do this nice thing where you can typecast variables around. e.g.
+
Cela à moi de chance de vous arriver... mais autant être tenu informé.
   −
<code>uint8_t mybuffer[4];</code><br><code>float f = (float)mybuffer;</code>
+
Si vous avez utilisé des plateformes 8 bits alors vous savez probablement qu'il est possible de réaliser des typecast de variables. Par exemple:
   −
You can't be guaranteed that this will work on a 32-bit platform because '''mybuffer''' might not be aligned to a 2 or 4-byte boundary. The ARM Cortex-M0 can only directly access data on 16-bit boundaries (every 2 or 4 bytes). Trying to access an odd-boundary byte (on a 1 or 3 byte location) will cause a Hard Fault and stop the MCU. Thankfully, there's an easy work around ... just use memcpy!
+
<syntaxhighlight lang="c">
 +
uint8_t mybuffer[4];
 +
float f = (float)mybuffer;
   −
<code>uint8_t mybuffer[4];<br>float f;<br>memcpy(f, mybuffer, 4)</code>
+
Mais vous ne pouvez pas garantir que cela fonctionnera sur une plateforme 32 bits parce que '''mybuffer''' pourrait ne pas être aligné sur 2 ou 4 octets (voir [https://fr.wikipedia.org/wiki/Alignement_en_m%C3%A9moire alignement en mémoire] sur Wikipedia).
 +
 
 +
Un ARM Cortex-M0 peut uniquement accéder directement aux données par bloc de 16-bit (tous les deux ou 4 octets). Essayer d'accéder à un octet impaire (octets en position 1 ou 3) provoquera une erreur matérielle et un arrêt du MCU.
 +
 
 +
Heureusement, il existe une solution simple... utiliser la fonction {{fname|memcpy}} !
 +
 
 +
<syntaxhighlight lang="c">
 +
uint8_t mybuffer[4];
 +
float f;
 +
memcpy(f, mybuffer, 4)
 +
</syntaxhighlight>
    
== Floating Point Conversion ==
 
== Floating Point Conversion ==
29 917

modifications

Menu de navigation