functional mcu programming

21
Functional MCU programming Functional MCU programming Functional MCU programming Functional MCU programming Functional MCU programming Metasepi Project / Kiwamu Okabe Metasepi Project / Kiwamu Okabe Metasepi Project / Kiwamu Okabe Metasepi Project / Kiwamu Okabe Metasepi Project / Kiwamu Okabe

Upload: kiwamu-okabe

Post on 11-May-2015

3.736 views

Category:

Technology


1 download

DESCRIPTION

Functional MCU programming

TRANSCRIPT

Page 1: Functional MCU programming

Functional MCU programmingFunctional MCU programmingFunctional MCU programmingFunctional MCU programmingFunctional MCU programming

Metasepi Project / Kiwamu OkabeMetasepi Project / Kiwamu OkabeMetasepi Project / Kiwamu OkabeMetasepi Project / Kiwamu OkabeMetasepi Project / Kiwamu Okabe

Page 2: Functional MCU programming

Who am I ?Who am I ?Who am I ?Who am I ?Who am I ?

☆ http://www.masterq.net/☆ http://www.masterq.net/☆ http://www.masterq.net/☆ http://www.masterq.net/☆ http://www.masterq.net/

☆ Twitter: @master_q☆ Twitter: @master_q☆ Twitter: @master_q☆ Twitter: @master_q☆ Twitter: @master_q

☆ Organizer of Metasepi Project☆ Organizer of Metasepi Project☆ Organizer of Metasepi Project☆ Organizer of Metasepi Project☆ Organizer of Metasepi Project

☆ A developer of Ajhc Haskell compiler☆ A developer of Ajhc Haskell compiler☆ A developer of Ajhc Haskell compiler☆ A developer of Ajhc Haskell compiler☆ A developer of Ajhc Haskell compiler

☆ A Debian Maintainer☆ A Debian Maintainer☆ A Debian Maintainer☆ A Debian Maintainer☆ A Debian Maintainer

☆ 10 years' experience in developing OS using NetBSD☆ 10 years' experience in developing OS using NetBSD☆ 10 years' experience in developing OS using NetBSD☆ 10 years' experience in developing OS using NetBSD☆ 10 years' experience in developing OS using NetBSD

Page 3: Functional MCU programming

Kick off workshop at Nagoya !Kick off workshop at Nagoya !Kick off workshop at Nagoya !Kick off workshop at Nagoya !Kick off workshop at Nagoya !

Functional MCU programing workshopFunctional MCU programing workshopFunctional MCU programing workshopFunctional MCU programing workshopFunctional MCU programing workshop

☆ At Nagoya☆ At Nagoya☆ At Nagoya☆ At Nagoya☆ At Nagoya

☆ Meeting minutes☆ Meeting minutes☆ Meeting minutes☆ Meeting minutes☆ Meeting minuteshttp://metasepi.org/posts/2014-01-05-mbed_fp_0.htmlhttp://metasepi.org/posts/2014-01-05-mbed_fp_0.htmlhttp://metasepi.org/posts/2014-01-05-mbed_fp_0.htmlhttp://metasepi.org/posts/2014-01-05-mbed_fp_0.htmlhttp://metasepi.org/posts/2014-01-05-mbed_fp_0.html

☆ Now planning the next workshop...☆ Now planning the next workshop...☆ Now planning the next workshop...☆ Now planning the next workshop...☆ Now planning the next workshop...

Page 4: Functional MCU programming

Why functional lang for MCU?Why functional lang for MCU?Why functional lang for MCU?Why functional lang for MCU?Why functional lang for MCU?

☆ Internet of Things (IoT)☆ Internet of Things (IoT)☆ Internet of Things (IoT)☆ Internet of Things (IoT)☆ Internet of Things (IoT)

☆ We will live in IoT world☆ We will live in IoT world☆ We will live in IoT world☆ We will live in IoT world☆ We will live in IoT world

☆ Can't debug IoT device on the field☆ Can't debug IoT device on the field☆ Can't debug IoT device on the field☆ Can't debug IoT device on the field☆ Can't debug IoT device on the field

☆ Should avoid runtime error☆ Should avoid runtime error☆ Should avoid runtime error☆ Should avoid runtime error☆ Should avoid runtime error

☆ We need strong type !☆ We need strong type !☆ We need strong type !☆ We need strong type !☆ We need strong type !

Page 5: Functional MCU programming

What is functional app?What is functional app?What is functional app?What is functional app?What is functional app?

Page 6: Functional MCU programming

Choice of cross compilerChoice of cross compilerChoice of cross compilerChoice of cross compilerChoice of cross compiler

Page 7: Functional MCU programming

Cross compiler: (A)jhcCross compiler: (A)jhcCross compiler: (A)jhcCross compiler: (A)jhcCross compiler: (A)jhc

http://ajhc.metasepi.org/http://ajhc.metasepi.org/http://ajhc.metasepi.org/http://ajhc.metasepi.org/http://ajhc.metasepi.org/

☆ Language: Haskell☆ Language: Haskell☆ Language: Haskell☆ Language: Haskell☆ Language: Haskell

☆ Haskell language is major !☆ Haskell language is major !☆ Haskell language is major !☆ Haskell language is major !☆ Haskell language is major !

☆ Need GC heap = Need more memory☆ Need GC heap = Need more memory☆ Need GC heap = Need more memory☆ Need GC heap = Need more memory☆ Need GC heap = Need more memory

☆ Experience running on MCU☆ Experience running on MCU☆ Experience running on MCU☆ Experience running on MCU☆ Experience running on MCUARM Cortex-Mhttps://github.com/ajhc/demo-cortex-m3ARM Cortex-Mhttps://github.com/ajhc/demo-cortex-m3ARM Cortex-Mhttps://github.com/ajhc/demo-cortex-m3ARM Cortex-Mhttps://github.com/ajhc/demo-cortex-m3ARM Cortex-Mhttps://github.com/ajhc/demo-cortex-m3

Page 8: Functional MCU programming

Cross compiler: ATSCross compiler: ATSCross compiler: ATSCross compiler: ATSCross compiler: ATS

http://www.ats-lang.org/http://www.ats-lang.org/http://www.ats-lang.org/http://www.ats-lang.org/http://www.ats-lang.org/

☆ Language: ML☆ Language: ML☆ Language: ML☆ Language: ML☆ Language: ML

☆ Optional GC = Need low memory☆ Optional GC = Need low memory☆ Optional GC = Need low memory☆ Optional GC = Need low memory☆ Optional GC = Need low memory

☆ No experience running on MCU☆ No experience running on MCU☆ No experience running on MCU☆ No experience running on MCU☆ No experience running on MCU

☆ Document translated into Japanese☆ Document translated into Japanese☆ Document translated into Japanese☆ Document translated into Japanese☆ Document translated into Japanese

http://jats-ug.metasepi.org/http://jats-ug.metasepi.org/http://jats-ug.metasepi.org/http://jats-ug.metasepi.org/http://jats-ug.metasepi.org/

Page 9: Functional MCU programming

Cross compiler: RustCross compiler: RustCross compiler: RustCross compiler: RustCross compiler: Rust

http://www.rust-lang.org/http://www.rust-lang.org/http://www.rust-lang.org/http://www.rust-lang.org/http://www.rust-lang.org/

☆ Language: Own syntax like C or JS☆ Language: Own syntax like C or JS☆ Language: Own syntax like C or JS☆ Language: Own syntax like C or JS☆ Language: Own syntax like C or JS

☆ Optional GC = Need low memory☆ Optional GC = Need low memory☆ Optional GC = Need low memory☆ Optional GC = Need low memory☆ Optional GC = Need low memory

☆ Experience running on MCU☆ Experience running on MCU☆ Experience running on MCU☆ Experience running on MCU☆ Experience running on MCUARM Cortex-Mhttps://github.com/neykov/armbootARM Cortex-Mhttps://github.com/neykov/armbootARM Cortex-Mhttps://github.com/neykov/armbootARM Cortex-Mhttps://github.com/neykov/armbootARM Cortex-Mhttps://github.com/neykov/armboot

☆ Developing by Mozilla☆ Developing by Mozilla☆ Developing by Mozilla☆ Developing by Mozilla☆ Developing by Mozilla

☆ @pirapira knows the detail of it☆ @pirapira knows the detail of it☆ @pirapira knows the detail of it☆ @pirapira knows the detail of it☆ @pirapira knows the detail of it

Page 10: Functional MCU programming

Choice of MCU boardChoice of MCU boardChoice of MCU boardChoice of MCU boardChoice of MCU board

Page 11: Functional MCU programming

Which MCU? Of course mbed!?Which MCU? Of course mbed!?Which MCU? Of course mbed!?Which MCU? Of course mbed!?Which MCU? Of course mbed!?

Why?Why?Why?Why?Why?

☆ Major☆ Major☆ Major☆ Major☆ Major

☆ 32bit☆ 32bit☆ 32bit☆ 32bit☆ 32bit

☆ Large memory size (> 20kB)☆ Large memory size (> 20kB)☆ Large memory size (> 20kB)☆ Large memory size (> 20kB)☆ Large memory size (> 20kB)

☆ Debugger☆ Debugger☆ Debugger☆ Debugger☆ Debugger

☆ Ethernet☆ Ethernet☆ Ethernet☆ Ethernet☆ Ethernet

Page 12: Functional MCU programming

Which board is good for us...Which board is good for us...Which board is good for us...Which board is good for us...Which board is good for us...

☆ mbed LPC1768 (¥5,200)☆ mbed LPC1768 (¥5,200)☆ mbed LPC1768 (¥5,200)☆ mbed LPC1768 (¥5,200)☆ mbed LPC1768 (¥5,200)RAM 32kB+32kBEthernethttps://mbed.org/platforms/mbed-LPC1768/

RAM 32kB+32kBEthernethttps://mbed.org/platforms/mbed-LPC1768/

RAM 32kB+32kBEthernethttps://mbed.org/platforms/mbed-LPC1768/

RAM 32kB+32kBEthernethttps://mbed.org/platforms/mbed-LPC1768/

RAM 32kB+32kBEthernethttps://mbed.org/platforms/mbed-LPC1768/

☆ Seeeduino Arch Pro ($43.41)☆ Seeeduino Arch Pro ($43.41)☆ Seeeduino Arch Pro ($43.41)☆ Seeeduino Arch Pro ($43.41)☆ Seeeduino Arch Pro ($43.41)RAM 32kB+32kBEthernethttp://www.seeedstudio.com/depot/arch-pro-p-1677.html

RAM 32kB+32kBEthernethttp://www.seeedstudio.com/depot/arch-pro-p-1677.html

RAM 32kB+32kBEthernethttp://www.seeedstudio.com/depot/arch-pro-p-1677.html

RAM 32kB+32kBEthernethttp://www.seeedstudio.com/depot/arch-pro-p-1677.html

RAM 32kB+32kBEthernethttp://www.seeedstudio.com/depot/arch-pro-p-1677.html

☆ FRDM-KL46Z (¥1,634)☆ FRDM-KL46Z (¥1,634)☆ FRDM-KL46Z (¥1,634)☆ FRDM-KL46Z (¥1,634)☆ FRDM-KL46Z (¥1,634)RAM 32kBNo Ethernethttp://www.freescale.com/webapp/sps/site/prod_summary.jsp?code=FRDM-KL46Z

RAM 32kBNo Ethernethttp://www.freescale.com/webapp/sps/site/prod_summary.jsp?code=FRDM-KL46Z

RAM 32kBNo Ethernethttp://www.freescale.com/webapp/sps/site/prod_summary.jsp?code=FRDM-KL46Z

RAM 32kBNo Ethernethttp://www.freescale.com/webapp/sps/site/prod_summary.jsp?code=FRDM-KL46Z

RAM 32kBNo Ethernethttp://www.freescale.com/webapp/sps/site/prod_summary.jsp?code=FRDM-KL46Z

Page 13: Functional MCU programming

Choice of debuggerChoice of debuggerChoice of debuggerChoice of debuggerChoice of debugger

Page 14: Functional MCU programming

gdbserver: pyOCDgdbserver: pyOCDgdbserver: pyOCDgdbserver: pyOCDgdbserver: pyOCD

https://github.com/mbedmicro/pyOCDhttps://github.com/mbedmicro/pyOCDhttps://github.com/mbedmicro/pyOCDhttps://github.com/mbedmicro/pyOCDhttps://github.com/mbedmicro/pyOCD

☆ Only for MCU using CMSIS-DAP☆ Only for MCU using CMSIS-DAP☆ Only for MCU using CMSIS-DAP☆ Only for MCU using CMSIS-DAP☆ Only for MCU using CMSIS-DAP

☆ But now support only mbed LPC1768☆ But now support only mbed LPC1768☆ But now support only mbed LPC1768☆ But now support only mbed LPC1768☆ But now support only mbed LPC1768

☆ In future, support more board ?☆ In future, support more board ?☆ In future, support more board ?☆ In future, support more board ?☆ In future, support more board ?

Page 15: Functional MCU programming

gdbserver: OpenOCDgdbserver: OpenOCDgdbserver: OpenOCDgdbserver: OpenOCDgdbserver: OpenOCD

http://openocd.sourceforge.net/http://openocd.sourceforge.net/http://openocd.sourceforge.net/http://openocd.sourceforge.net/http://openocd.sourceforge.net/

☆ Comming CMSIS-DAP support!☆ Comming CMSIS-DAP support!☆ Comming CMSIS-DAP support!☆ Comming CMSIS-DAP support!☆ Comming CMSIS-DAP support!

☆ Need HIDAPI library☆ Need HIDAPI library☆ Need HIDAPI library☆ Need HIDAPI library☆ Need HIDAPI library

http://www.signal11.us/oss/hidapi/http://www.signal11.us/oss/hidapi/http://www.signal11.us/oss/hidapi/http://www.signal11.us/oss/hidapi/http://www.signal11.us/oss/hidapi/

Page 16: Functional MCU programming

OpenOCD enabling CMSIS-DAPOpenOCD enabling CMSIS-DAPOpenOCD enabling CMSIS-DAPOpenOCD enabling CMSIS-DAPOpenOCD enabling CMSIS-DAP$ git clone git://github.com/signal11/hidapi.git$ cd hidapi$ ./bootstrap$ ./configure$ make$ sudo make install

$ git clone git://github.com/signal11/hidapi.git$ cd hidapi$ ./bootstrap$ ./configure$ make$ sudo make install

$ git clone git://github.com/signal11/hidapi.git$ cd hidapi$ ./bootstrap$ ./configure$ make$ sudo make install

$ git clone git://github.com/signal11/hidapi.git$ cd hidapi$ ./bootstrap$ ./configure$ make$ sudo make install

$ git clone git://github.com/signal11/hidapi.git$ cd hidapi$ ./bootstrap$ ./configure$ make$ sudo make install

$ git clone https://github.com/master-q/openocd.git$ cd openocd$ git checkout masterq-mbedfest-201401$ ./bootstrap$ ./configure --enable-cmsis-dap--ship--Olimex ARM-JTAG-EW Programmer yes (auto)CMSIS-DAP Compliant Debugger yes$ make

$ git clone https://github.com/master-q/openocd.git$ cd openocd$ git checkout masterq-mbedfest-201401$ ./bootstrap$ ./configure --enable-cmsis-dap--ship--Olimex ARM-JTAG-EW Programmer yes (auto)CMSIS-DAP Compliant Debugger yes$ make

$ git clone https://github.com/master-q/openocd.git$ cd openocd$ git checkout masterq-mbedfest-201401$ ./bootstrap$ ./configure --enable-cmsis-dap--ship--Olimex ARM-JTAG-EW Programmer yes (auto)CMSIS-DAP Compliant Debugger yes$ make

$ git clone https://github.com/master-q/openocd.git$ cd openocd$ git checkout masterq-mbedfest-201401$ ./bootstrap$ ./configure --enable-cmsis-dap--ship--Olimex ARM-JTAG-EW Programmer yes (auto)CMSIS-DAP Compliant Debugger yes$ make

$ git clone https://github.com/master-q/openocd.git$ cd openocd$ git checkout masterq-mbedfest-201401$ ./bootstrap$ ./configure --enable-cmsis-dap--ship--Olimex ARM-JTAG-EW Programmer yes (auto)CMSIS-DAP Compliant Debugger yes$ make

Some time the following FRDM-KL46Z patch is useful.http://permalink.gmane.org/gmane.comp.debugging.openocd.devel/24258Some time the following FRDM-KL46Z patch is useful.http://permalink.gmane.org/gmane.comp.debugging.openocd.devel/24258Some time the following FRDM-KL46Z patch is useful.http://permalink.gmane.org/gmane.comp.debugging.openocd.devel/24258Some time the following FRDM-KL46Z patch is useful.http://permalink.gmane.org/gmane.comp.debugging.openocd.devel/24258Some time the following FRDM-KL46Z patch is useful.http://permalink.gmane.org/gmane.comp.debugging.openocd.devel/24258

Page 17: Functional MCU programming

On mbed LPC1768On mbed LPC1768On mbed LPC1768On mbed LPC1768On mbed LPC1768$ sudo ./src/openocd -f tcl/board/mbed-lpc1768.cfg$ sudo ./src/openocd -f tcl/board/mbed-lpc1768.cfg$ sudo ./src/openocd -f tcl/board/mbed-lpc1768.cfg$ sudo ./src/openocd -f tcl/board/mbed-lpc1768.cfg$ sudo ./src/openocd -f tcl/board/mbed-lpc1768.cfg

$ arm-none-eabi-gdb Blink.elf(gdb) target remote localhost:3333(gdb) monitor reset halt(gdb) load

$ arm-none-eabi-gdb Blink.elf(gdb) target remote localhost:3333(gdb) monitor reset halt(gdb) load

$ arm-none-eabi-gdb Blink.elf(gdb) target remote localhost:3333(gdb) monitor reset halt(gdb) load

$ arm-none-eabi-gdb Blink.elf(gdb) target remote localhost:3333(gdb) monitor reset halt(gdb) load

$ arm-none-eabi-gdb Blink.elf(gdb) target remote localhost:3333(gdb) monitor reset halt(gdb) load

Push hard rest button.Push hard rest button.Push hard rest button.Push hard rest button.Push hard rest button.(gdb) c(gdb) c(gdb) c(gdb) c(gdb) c

But too slow...But too slow...But too slow...But too slow...But too slow...Transfer rate: 50 bytes/sec, 3818 bytes/write.Transfer rate: 50 bytes/sec, 3818 bytes/write.Transfer rate: 50 bytes/sec, 3818 bytes/write.Transfer rate: 50 bytes/sec, 3818 bytes/write.Transfer rate: 50 bytes/sec, 3818 bytes/write.

:(:(:(:(:(

Page 18: Functional MCU programming

On Seeeduino Arch ProOn Seeeduino Arch ProOn Seeeduino Arch ProOn Seeeduino Arch ProOn Seeeduino Arch Pro

Same as mbed LPC1768.Same as mbed LPC1768.Same as mbed LPC1768.Same as mbed LPC1768.Same as mbed LPC1768.

Page 19: Functional MCU programming

On FRDM-KL46ZOn FRDM-KL46ZOn FRDM-KL46ZOn FRDM-KL46ZOn FRDM-KL46ZUse project at https://github.com/0xc0170/kinetis_klxx_gcc.Use project at https://github.com/0xc0170/kinetis_klxx_gcc.Use project at https://github.com/0xc0170/kinetis_klxx_gcc.Use project at https://github.com/0xc0170/kinetis_klxx_gcc.Use project at https://github.com/0xc0170/kinetis_klxx_gcc.

$ sudo ./src/openocd -f tcl/board/frdm-kl46z.cfg--snip--cortex_m reset_config sysresetreqInfo : CMSIS-DAP: FW Version = 1.0Info : SWCLK/TCK = 0 SWDIO/TMS = 1 TDI = 0 TDO = 0 nTRST = 0 nRESET = 1Info : DAP_SWJ Sequence (reset: 50+ '1' followed by 0)Info : CMSIS-DAP: Interface readyInfo : clock speed 100 kHzInfo : IDCODE 0x0bc11477Info : MKL46Z256VLL4.cpu: hardware has 2 breakpoints, 2 watchpointsInfo : accepting 'gdb' connection from 3333Warn : Cannot communicate... target not halted.Error: auto_probe failedError: Connect failed. Consider setting up a gdb-attach event for the target to prepare.Error: attempted 'gdb' connection rejected

$ sudo ./src/openocd -f tcl/board/frdm-kl46z.cfg--snip--cortex_m reset_config sysresetreqInfo : CMSIS-DAP: FW Version = 1.0Info : SWCLK/TCK = 0 SWDIO/TMS = 1 TDI = 0 TDO = 0 nTRST = 0 nRESET = 1Info : DAP_SWJ Sequence (reset: 50+ '1' followed by 0)Info : CMSIS-DAP: Interface readyInfo : clock speed 100 kHzInfo : IDCODE 0x0bc11477Info : MKL46Z256VLL4.cpu: hardware has 2 breakpoints, 2 watchpointsInfo : accepting 'gdb' connection from 3333Warn : Cannot communicate... target not halted.Error: auto_probe failedError: Connect failed. Consider setting up a gdb-attach event for the target to prepare.Error: attempted 'gdb' connection rejected

$ sudo ./src/openocd -f tcl/board/frdm-kl46z.cfg--snip--cortex_m reset_config sysresetreqInfo : CMSIS-DAP: FW Version = 1.0Info : SWCLK/TCK = 0 SWDIO/TMS = 1 TDI = 0 TDO = 0 nTRST = 0 nRESET = 1Info : DAP_SWJ Sequence (reset: 50+ '1' followed by 0)Info : CMSIS-DAP: Interface readyInfo : clock speed 100 kHzInfo : IDCODE 0x0bc11477Info : MKL46Z256VLL4.cpu: hardware has 2 breakpoints, 2 watchpointsInfo : accepting 'gdb' connection from 3333Warn : Cannot communicate... target not halted.Error: auto_probe failedError: Connect failed. Consider setting up a gdb-attach event for the target to prepare.Error: attempted 'gdb' connection rejected

$ sudo ./src/openocd -f tcl/board/frdm-kl46z.cfg--snip--cortex_m reset_config sysresetreqInfo : CMSIS-DAP: FW Version = 1.0Info : SWCLK/TCK = 0 SWDIO/TMS = 1 TDI = 0 TDO = 0 nTRST = 0 nRESET = 1Info : DAP_SWJ Sequence (reset: 50+ '1' followed by 0)Info : CMSIS-DAP: Interface readyInfo : clock speed 100 kHzInfo : IDCODE 0x0bc11477Info : MKL46Z256VLL4.cpu: hardware has 2 breakpoints, 2 watchpointsInfo : accepting 'gdb' connection from 3333Warn : Cannot communicate... target not halted.Error: auto_probe failedError: Connect failed. Consider setting up a gdb-attach event for the target to prepare.Error: attempted 'gdb' connection rejected

$ sudo ./src/openocd -f tcl/board/frdm-kl46z.cfg--snip--cortex_m reset_config sysresetreqInfo : CMSIS-DAP: FW Version = 1.0Info : SWCLK/TCK = 0 SWDIO/TMS = 1 TDI = 0 TDO = 0 nTRST = 0 nRESET = 1Info : DAP_SWJ Sequence (reset: 50+ '1' followed by 0)Info : CMSIS-DAP: Interface readyInfo : clock speed 100 kHzInfo : IDCODE 0x0bc11477Info : MKL46Z256VLL4.cpu: hardware has 2 breakpoints, 2 watchpointsInfo : accepting 'gdb' connection from 3333Warn : Cannot communicate... target not halted.Error: auto_probe failedError: Connect failed. Consider setting up a gdb-attach event for the target to prepare.Error: attempted 'gdb' connection rejected

X(X(X(X(X(

Page 20: Functional MCU programming

Be a hacker such as ねむいさんBe a hacker such as ねむいさんBe a hacker such as ねむいさんBe a hacker such as ねむいさんBe a hacker such as ねむいさん

http://nemuisan.blog.bai.ne.jp/http://nemuisan.blog.bai.ne.jp/http://nemuisan.blog.bai.ne.jp/http://nemuisan.blog.bai.ne.jp/http://nemuisan.blog.bai.ne.jp/

☆ OpenOCD hacker☆ OpenOCD hacker☆ OpenOCD hacker☆ OpenOCD hacker☆ OpenOCD hacker

☆ There is his patch at following URL☆ There is his patch at following URL☆ There is his patch at following URL☆ There is his patch at following URL☆ There is his patch at following URLhttp://nemuisan.blog.bai.ne.jp/?eid=192848#OPENOCDhttp://nemuisan.blog.bai.ne.jp/?eid=192848#OPENOCDhttp://nemuisan.blog.bai.ne.jp/?eid=192848#OPENOCDhttp://nemuisan.blog.bai.ne.jp/?eid=192848#OPENOCDhttp://nemuisan.blog.bai.ne.jp/?eid=192848#OPENOCD

Page 21: Functional MCU programming

Functional programming fanzineFunctional programming fanzineFunctional programming fanzineFunctional programming fanzineFunctional programming fanzine

☆ http://www.paraiso-lang.org/ikmsm/☆ http://www.paraiso-lang.org/ikmsm/☆ http://www.paraiso-lang.org/ikmsm/☆ http://www.paraiso-lang.org/ikmsm/☆ http://www.paraiso-lang.org/ikmsm/

☆ About Haskell or OCaml or . . .☆ About Haskell or OCaml or . . .☆ About Haskell or OCaml or . . .☆ About Haskell or OCaml or . . .☆ About Haskell or OCaml or . . .

☆ About Ajhc in C84 book☆ About Ajhc in C84 book☆ About Ajhc in C84 book☆ About Ajhc in C84 book☆ About Ajhc in C84 book

☆ About Android app with Haskell in C85 book☆ About Android app with Haskell in C85 book☆ About Android app with Haskell in C85 book☆ About Android app with Haskell in C85 book☆ About Android app with Haskell in C85 book

☆ Call me if you read it!☆ Call me if you read it!☆ Call me if you read it!☆ Call me if you read it!☆ Call me if you read it!http://www.paraiso-lang.org/ikmsm/books/c85.htmlhttp://www.paraiso-lang.org/ikmsm/books/c85.htmlhttp://www.paraiso-lang.org/ikmsm/books/c85.htmlhttp://www.paraiso-lang.org/ikmsm/books/c85.htmlhttp://www.paraiso-lang.org/ikmsm/books/c85.html