Trouvé sur ce silo social :

Et aussi ici

Pour apprendre un nouveau langage de programmation, j’utilise toujours la même méthode : Lire un livre (papier) de référence et commencer un projet en parallèle.
Cette méthode à fait ses preuves et fonctionne, à condition de choisir le bon livre.
Pour Scala, j’avais acquis le livre «Programming Scala» aux édition O’Reilly qui s’est avéré assez décevant. Le Scala est un langage qui mélange le paradigme fonctionnel avec le paradigme objet, il est nécessaire de «recommencer au début» pour se l’approprier. Ce livre suppose que l’on maîtrise déjà assez bien les deux paradigmes, ce qui est somme toute assez rare.
Plutôt que de s’adresser à ses adeptes il vaut mieux s’adresser au créateur directement : le suisse Martin Odersky avec le livre «Programming in Scala, Fourth edition» des éditions Artima. En partant de la base, ce livre donne de bien meilleurs base pour bien saisir le Scala et comprendre les différents codes que l’on peu avoir à lire.
Le livre est plus cher que celui de chez O’REILLY, mais il s’avérera un bien meilleurs investissement pour comprendre toutes les bases du langage.
Par contre je me rend compte que cette édition va bientôt être obsolète puisque la cinquième parait dans 6 jours. Édition qui portera sur la version 3.0 de Scala.
La version quatre reste cependant un bon investissement à mon avis.
Zephyr est un système d’exploitation temps réel conçu pour les microcontrôleurs. L’OS a déjà été introduit dans une précédente note de ce blog.
La carte de développement Hifive1 contient le premier microcontrôleur à base de RISC-V sortie en «silicium» : le E310. La Hifive1 officiellement supportée par Zephyr depuis un petit bout de temps, son utilisation devrait donc passer comme une lettre à la poste contrairement au GD32VF103 de la Longan Nano.
Tout d’abord initialisons un projet zephyr :
$ west init ~/zephyrhifive
$ cd ~/zephyrhifive
$ west update
Compilation du projet hello world:
$ cd ~/zephyrhifive/zephyr
$ west build -b hifive1 samples/hello_world
Langage du code : JavaScript (javascript)
Pour flasher il suffit ensuite de lancer la commande west flash:
$ west flash
-- west flash: rebuilding
ninja: no work to do.
-- west flash: using runner hifive1
Open On-Chip Debugger 0.10.0+dev-01508-gf79c90268-dirty (2021-03-26-16:13)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html
Info : auto-selecting first available session transport "jtag". To override use 'transport select '.
Info : ftdi: if you experience problems at higher adapter clocks, try the command "ftdi_tdo_sample_edge falling"
Info : clock speed 10000 kHz
Info : JTAG tap: riscv.cpu tap/device found: 0x10e31913 (mfg: 0x489 (SiFive, Inc.), part: 0x0e31, ver: 0x1)
Info : Examined RISCV core; XLEN=32, misa=0x40001105
Info : starting gdb server for riscv.cpu on 3333
Info : Listening on port 3333 for gdb connections
Info : [0] Found 2 triggers
halted at 0x2040019c due to debug interrupt
Info : Found flash device 'issi is25lp128d' (ID 0x0018609d)
Info : Listening on port 6666 for tcl connections
Info : Listening on port 4444 for telnet connections
Info : accepting 'gdb' connection on tcp/3333
Info : JTAG tap: riscv.cpu tap/device found: 0x10e31913 (mfg: 0x489 (SiFive, Inc.), part: 0x0e31, ver: 0x1)
halted at 0x2040019c due to debug interrupt
force hard breakpoints
0x2040019c in skip_callee_saved_reg () at /home/fabien/zephyrhifive/zephyr/arch/riscv/core/isr.S:886
886 LOAD_CALLER_SAVED(t1)
Info : JTAG tap: riscv.cpu tap/device found: 0x10e31913 (mfg: 0x489 (SiFive, Inc.), part: 0x0e31, ver: 0x1)
halted at 0x2040019c due to debug interrupt
Loading section vector, size 0x10 lma 0x20400000
Loading section exceptions, size 0x2b8 lma 0x20400010
Loading section text, size 0x3fdc lma 0x204002c8
Loading section initlevel, size 0x50 lma 0x204042a4
Loading section sw_isr_table, size 0x200 lma 0x204042f4
Loading section device_handles, size 0x36 lma 0x204044f4
Loading section rodata, size 0x338 lma 0x2040452c
Loading section datas, size 0xc0 lma 0x20404864
Loading section devices, size 0x90 lma 0x20404924
Info : Padding image section 0 at 0x2040452a with 2 bytes
Info : Retrying memory read starting from 0x80000000 with more delays
Info : Retrying memory read starting from 0x800010d8 with more delays
halted at 0x80000004 due to software breakpoint
halted at 0x80000004 due to software breakpoint
halted at 0x80000004 due to software breakpoint
Info : JTAG tap: riscv.cpu tap/device found: 0x10e31913 (mfg: 0x489 (SiFive, Inc.), part: 0x0e31, ver: 0x1)
halted at 0x80000004 due to software breakpoint
Start address 0x20400000, load size 18866
Transfer rate: 42 KB/sec, 1886 bytes/write.
A debugging session is active.
<code>Inferior 1 [Remote target] will be detached.</code>
Quit anyway? (y or n) [answered Y; input not from terminal]
[Inferior 1 (Remote target) detached]
shutdown command invoked
Info : dropped 'gdb' connection
Langage du code : PHP (php)
On peut vérifier le bon fonctionnement en se connectant à l’uart ttyUSB1:
$ screen /dev/ttyUSB1 115200
Hello World! hifive1
Attention
Une fois flashé, c’est une application Zephyr qui tourne sur la carte. Or zephyr part en veille s’il n’a plus rien à faire. Ce qui est le cas ici.
Et quand la hifive1 est en veille on ne peut plus la flasher, l’erreur du type suivant survient :
<code>Error: Timed out waiting for debug int to clear.Increase timeout with riscv set_command_timeout_sec. Error: Debug interrupt didn't clear.</code>
Langage du code : HTML, XML (xml)
Pour résoudre ce problème on peut appuyer sur le bouton reset puis le bouton wake et enfin lancer la commande de flashage.
[Article sponsorisé]
Armadeus Systems utilise un logiciel de routage relativement onéreux et complètement fermé pour concevoir ses modules SoM. Ce logiciel est indispensable en interne pour concevoir des cartes électroniques aussi complexe que des modules processeurs.
Logiciel que tout le monde ne peut pas forcément se permettre d’acheter, surtout si c’est pour faire une petite carte d’accueil.
Conscient de ce problème, la société a entamé une migration de la conception de ses cartes d’accueil avec le logiciel Kicad. La technologie des cartes d’accueil de ses SoM étant beaucoup plus simple, il était possible de les migrer sur un logiciel libre.
Kicad est un logiciel libre de conception électronique qui permet de faire le schéma électronique ainsi que le routage. Kicad génère les fichiers de fabrication au format ouvert GERBER. Format qui est parfaitement reconnu par la plupart des sous-traitants électronique (EMS).
Pour qu’un utilisateur de Kicad puisse faire un design avec nos SOM, il est donc indispensable qu’il puisse disposer des symboles et footprint. C’est donc ce qui a été ajouté officiellement dans kicad pour les cartes OPOS6UL et OPOS6UL_NANO.
Ces deux cartes ont déjà été évoquées sur ce blog, elles ont l’avantage d’être de taille extrêmement réduite pour un système Linux embarqué complet.
L’OPOS6UL est un SOM à base de processeur i.MX6UL. Le connecteur utilise le form-factor d’un connecteur de barrette de RAM SODIMM 204 pins. Comme le connecteur est standard, il suffit de l’associer au footprint déjà présent dans la librairie Kicad.
Le symbole de l’OPOS6UL vient donc d’être intégré à la librairie officiel de Kicad via le commit de K.Joly.
l’OPOS6UL_NANO est la petite sœur de l’OPOS6UL. Petite par la taille, mais grande par la performance. Le connecteur utilisé est également un standard: le connecteur NGFF (M.2) 67pts. plus souvent appelé par son diminutif «M2».
Le symbole vient également d’être accepté dans la librairie officiel de Kicad avec le commit suivant.
Zephyr est un système d’exploitation temps réel pour microcontrôleur. Parler d’OS peut parfois faire réagir puisqu’il n’y a pas vraiment de noyau (kernel) et que tout est compilé en un seul firmware que l’on télécharge dans la mémoire du micro.
Ce n’est pas le seul RTOS existant pour microcontrôleur. Il a le gros avantage cependant d’être soutenu par la fondation Linux. Les deux grandes forces de ce système sont sa documentation et le support de nombreux protocoles réseaux (avec ou sans fils).
C’est le parfait OS à tester sur le GD32VF de gigadevice. Cependant, le portage n’est pas terminé. Le processeur n’apparaît donc pas dans la documentation officielle. Le seul tutoriel (en japonais) que j’ai trouvé se trouve là. J’en ai fait une traduction semi-automatique ici.
La version de Zephyr patché correspondante se trouve ici.
On vérifiera sur le site officiel que nous avons bien installé toutes les dépendances sur notre machine.
Zephyr a besoin d’un outils python nommé west, c’est un projet à part mais qui reste dans le giron de Zephyr.
$ python -m pip install west
$ west init ~/zephyrproject
$ cd ~/zephyrproject west update
$ python -m pip install -r ~/zephyrproject/zephyr/scripts/requirements.txt
On supprime le git officiel de zephyr téléchargé avec west Puis puis on clone le fork Zephyr de Soburi:
$ rm -rf zephyr
$ git clone https://github.com/soburi/zephyr.git
$ cd zephyr
$ git checkout longan_nano_2_5_0
Langage du code : PHP (php)
Notez la branche remotes/origin/longan_nano
_2_5_0 qui contient le travail de portage sur la longan_nano.
On installe le SDK (attention ~1Go)
$ cd ~/zephyrproject
$ wget https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v0.12.4/zephyr-sdk-0.12.4-x86_64-linux-setup.run
$ chmod +x zephyr-sdk-0.12.4-x86_64-linux-setup.run
$ ./zephyr-sdk-0.12.4-x86_64-linux-setup.run -- -d ~/zephyr-sdk-0.12.4
$ export ZEPHYR_SDK_INSTALL_DIR=~/zephyr-sdk-0.12.4/
Langage du code : PHP (php)
Manque plus qu’à mettre à jour avec le nouveau zephyr (de soburi) patché :
$ cd ~/zephyrproject
$ west update
Puis nous pouvons compiler le hello world :
$ cd ~/zephyrproject/zephyr/
$ west build -p auto -b sipeed_longan_nano samples/basic/blinky
Langage du code : JavaScript (javascript)
Si tout s’est bien passé on doit pouvoir maintenant flasher le binaire sur la carte. J’utilise pour cela l’adaptateur jtag de sipeed.
$ pip3 install pyelftools
Pour le moment j’ai pas encore réussi. Mais ça doit pouvoir se faire puisque ça marche avec openocd.
Pour avoir un fonctionnement correct il faut utiliser une version à jour du git du projet :
$ cd ~/zephyrproject
$ git clone git://git.code.sf.net/p/dfu-util/dfu-util
$ cd dfu-util
$ ./autogen.sh
$ ./configure
$ make
$ sudo make install
Langage du code : PHP (php)
J’ai suivi les conseils d’un lecteur.
$ git clone https://github.com/riscv-mcu/gd32-dfu-utils.git
$ ./autogen.sh
$ ./configure
$ make
$ sudo make install
$ dfu-util -V
dfu-util 0.10-dev
Copyright 2005-2009 Weston Schmidt, Harald Welte and OpenMoko Inc.
Copyright 2010-2021 Tormod Volden and Stefan Schmidt
This program is Free Software and has ABSOLUTELY NO WARRANTY
Please report bugs to http://sourceforge.net/p/dfu-util/tickets/
Langage du code : PHP (php)
Puis, pour télécharger le binaire, taper la commande :
$ dfu-util -d,28e9:0189 -s 0x8000000:leave -a 0 -D build/zephyr/zephyr.bin
dfu-util 0.10-dev
Copyright 2005-2009 Weston Schmidt, Harald Welte and OpenMoko Inc.
Copyright 2010-2021 Tormod Volden and Stefan Schmidt
This program is Free Software and has ABSOLUTELY NO WARRANTY
Please report bugs to http://sourceforge.net/p/dfu-util/tickets/
dfu-util: Warning: Invalid DFU suffix signature
dfu-util: A valid DFU suffix will be required in a future dfu-util release
Opening DFU capable USB device…
Device ID 28e9:0189
Device DFU version 011a
Claiming USB DFU Interface…
Setting Alternate Interface #0 …
Determining device status…
DFU state(2) = dfuIDLE, status(0) = No error condition is present
DFU mode device DFU version 011a
Device returned transfer size 2048
DfuSe interface name: "Internal Flash "
Found GD32VF103, which reports a bad page size and count for its internal memory.
Fixed layout based on part number: page size 1024, count 128.
Downloading element to address = 0x08000000, size = 19308
Erase [=========================] 100% 19308 bytes
Erase done.
Download [=========================] 100% 19308 bytes
Download done.
File downloaded successfully
Qui télécharge bien le binaire visiblement, et fait clignoter la led.
Pour s’assurer que c’est bien notre programme qui clignote, on peut changer la couleur de clignotement en modifiant la ligne suivante dans le fichier samples/basic/blinky/src/main.c
:
# Ligne 16:
- define LED0_NODE DT_ALIAS(led0)
+ define LED0_NODE DT_ALIAS(led1)
Langage du code : PHP (php)
Et relancer la compilation avec west:
$ west build -p auto -b longan_nano samples/basic/blinky
[3/9] Linking C executable zephyr/zephyr_prebuilt.elf
[9/9] Linking C executable zephyr/zephyr.elf
Memory region Used Size Region Size %age Used
ROM: 19308 B 128 KB 14.73%
RAM: 4740 B 32 KB 14.47%
IDT_LIST: 0 GB 2 KB 0.00%
Puis retélécharger pour voir la led verte clignoter.
La toolchain se trouve ici.
Le sdk nuclei se trouve ici et peut être téléchargé là.
export ZEPHYR_TOOLCHAIN_VARIANT=cross-compile
export CROSS_COMPILE=/home/fabien/zephyrproject/nuclei/gcc/bin/riscv-nuclei-elf-
Langage du code : JavaScript (javascript)
J’imagine que vous connaissez déjà le microcontrôleur à 4$ de la fondation RaspberryPi. En effet, un microcontrôleur dual cores cadencé à 133Mhz ça ne passe pas inaperçu.
Dual cores ? Vous êtes sûr ? Regardez bien la datasheet. Le processeur principal est bien constitué de 2 cœurs ARM Cortex-M0 ça c’est certain. Mais en lisant dans le détail on découvre un curieux périphérique nommé PIO state machine (chapitre 3) :
Qui permet d’exécuter des instructions assembleurs stockée dans une mémoire d’instructions spécifique.
2×4 véritables petits cœurs de processeurs qui accèdent directement aux GPIO du micro.
Voila des petits cœurs très intéressant dans le domaine de l’embarqué, surtout pour des application temps réel «dur».
La pico Pi n’est donc pas Dual-core mais 10-cores !
Après avoir reçu la MaixGo et l’avoir montée, il faudrait commencer à faire quelque chose avec.
Tout d’abord, comme ça fait un an et demi qu’elle traine sur mon étagère, une bonne idée serait de la mettre à jour.
Les commandes brutes :
$ git clone https://github.com/sipeed/MaixPy
$ cd MaixPy
$ wget http://dl.cdn.sipeed.com/kendryte-toolchain-ubuntu-amd64-8.2.0-20190409.tar.xz
$ sudo tar -Jxvf kendryte-toolchain-ubuntu-amd64-8.2.0-20190409.tar.xz -C /opt
$ cd projects/hello_world
$ python3 project.py menuconfig
$ python3 project.py build
$ python3 project.py flash -B dan -b 1500000 -p /dev/ttyACM0 -t
Langage du code : PHP (php)
Mais à quoi peuvent bien servir autant de micros sur une même carte électronique ?
À faire de la localisation de source sonore pardi. Pour faire cela, je n’invente rien. Il suffit de reprendre le script proposé par chegewara sur son github (avec quelques suppressions de lignes inutiles dans le cas du MaixGo):
from Maix import MIC_ARRAY as mic
import lcd
lcd.init()
mic.init()
while True:
imga = mic.get_map()
b = mic.get_dir(imga)
a = mic.set_led(b,(0,0,255))
imgb = imga.resize(240,160)
imgc = imgb.to_rainbow(1)
a = lcd.display(imgc)
mic.deinit()
Langage du code : JavaScript (javascript)
Pour reproduire la manipulation, on se connecte à la carte via le script proposé dans mon intro:
$ python sipeedcom.py
--- forcing DTR inactive
--- forcing RTS inactive
--- Miniterm on /dev/ttyACM0 115200,8,N,1 ---
--- Quit: Ctrl+] | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---
[MAIXPY]Pll0:freq:832000000
[MAIXPY]Pll1:freq:398666666
[MAIXPY]Pll2:freq:45066666
[MAIXPY]cpu:freq:416000000
[MAIXPY]kpu:freq:398666666
[MAIXPY]Flash:0xc8:0x17
open second core...
gc heap=0x802ee440-0x8036e440(524288)
[MaixPy] init end
__ __ _____ __ __ _____ __ __
| \/ | /\ |_ _| \ \ / / | __ \ \ \ / /
| \ / | / \ | | \ V / | |__) | \ \_/ /
| |\/| | / /\ \ | | > < | ___/ \ /
| | | | / ____ \ _| |_ / . \ | | | |
|_| |_| /_/ \_\ |_____| /_/ \_\ |_| |_|
Official Site : https://www.sipeed.com
Wiki : https://maixpy.sipeed.com
MicroPython v0.5.0-104-gbbd4c9880 on 2020-07-26; Sipeed_M1 with kendryte-k210
Type "help()" for more information.
>>>
Langage du code : PHP (php)
On peut bien sur copier/coller les lignes du script une par une. Mais c’est très pénible, surtout que la moindre erreur de frappe ne peut pas être corrigée.
Non pour se simplifier la vie on peut passer en mode «paste» avec Ctrl+e. un peu comme dans vim, il ne prendra le texte que de manière «brute» sans mise en forme. On termine sa session de collage avec la touche Ctrl+d.
>>>
paste mode; Ctrl-C to cancel, Ctrl-D to finish
=== from Maix import MIC_ARRAY as mic
===
import lcd
===
===
lcd.init()
===
mic.init()
===
===
while True:
===
imga = mic.get_map()
===
b = mic.get_dir(imga)
===
a = mic.set_led(b,(0,0,255))
===
imgb = imga.resize(240,160)
===
imgc = imgb.to_rainbow(1)
===
a = lcd.display(imgc)
===
mic.deinit()
===
Microphone Array Arithmetic, Developed by Canaan, Port by Sipeed
True
Langage du code : JavaScript (javascript)
Ce qui donne ça :
Le programme s’arrête avec un simple Ctrl+C
Microphone Array Arithmetic, Developed by Canaan, Port by Sipeed
True
Traceback (most recent call last):
File "", line 13, in
KeyboardInterrupt:
Langage du code : PHP (php)