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 == |