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.