EmbeddedHaskell
"Life is too short to C" -- Adluc
There are now serveral ways to generate C code for embedded applications with domain specific languages embedded in Haskell. This allows us to use type system and powerful compiler to catch errors sooner and get close to 'if it compiles it works' experience for embedded world.
Links
- Haskell embedded blog https://haskellembedded.github.io/
Frameworks
Ivory Tower
The Ivory Language is an eDSL for safe systems programming. You can think of Ivory as a safer C, embedded in Haskell.
The Tower Language is an eDSL for composing Ivory programs into real-time systems. Tower programs specify communication channels, tasks, and signal handlers, and generate Ivory code which implements scheduling and communication for real-time operating systems.
Repositories
- https://github.com/GaloisInc/ivory/
- https://github.com/GaloisInc/tower/
- https://github.com/GaloisInc/ivory-tower-stm32/
- https://github.com/GaloisInc/smaccmpilot-stm32f4/
- https://github.com/GaloisInc/smaccmpilot-build
- https://github.com/GaloisInc/gidl
Papers
- Guilt Free Ivory https://github.com/GaloisInc/ivory/blob/master/ivory-paper/ivory.pdf
- Building Embedded Systems with Embedded DSLs https://github.com/GaloisInc/smaccmpilot-experiencereport/raw/master/embedded-experience.pdf
Projects
Local projects
CAN4DISCO
ODrive experimental firmware
Working with Ivory Tower
Prepare environment
Install stack first - http://docs.haskellstack.org/en/stable/install_and_upgrade/
<syntaxhighlight lang="bash">mkdir embedded cd embedded git clone https://github.com/GaloisInc/ivory/ git clone https://github.com/GaloisInc/tower/ git clone https://github.com/GaloisInc/ivory-tower-stm32/</syntaxhighlight>
Running UART test
Test application located in
<syntaxhighlight lang="bash">cd ivory-tower-stm32/ivory-bsp-tests</syntaxhighlight>
<syntaxhighlight lang="bash"># set platform to f4 discovery cat > default.conf [args] platform="f4discovery"
make bsp-uart-test cd bsp-uart-test
- now look around carefuly
- oO
- Oo
- ...
- then flash it
arm-none-eabi-gdb --ex 'target extended-remote /dev/f4gdb' \
--ex 'monitor swdp_scan' \ --ex 'attach 1' \ --ex 'load' image'
- try talking to /dev/f4uart
- bsp-uart-test app accepts '0' '1' chars which should toggle led
screen /dev/f4uart 115200</syntaxhighlight>