More Related Content Similar to 組込向けHaskellコンパイラAjhc / mbedマイコンどうでしょう編 (20) 組込向けHaskellコンパイラAjhc / mbedマイコンどうでしょう編2. 私は誰?私は誰?私は誰?私は誰?私は誰?
☆ Twitter: @master_q☆ Twitter: @master_q☆ Twitter: @master_q☆ Twitter: @master_q☆ Twitter: @master_q
☆ Metasepiプロジェクト主催☆ Metasepiプロジェクト主催☆ Metasepiプロジェクト主催☆ Metasepiプロジェクト主催☆ Metasepiプロジェクト主催
☆ Ajhc Haskellコンパイラ開発者☆ Ajhc Haskellコンパイラ開発者☆ Ajhc Haskellコンパイラ開発者☆ Ajhc Haskellコンパイラ開発者☆ Ajhc Haskellコンパイラ開発者
☆ Debian Maintainer☆ Debian Maintainer☆ Debian Maintainer☆ Debian Maintainer☆ Debian Maintainer
☆ 前はデジタルサイネージの開発してました☆ 前はデジタルサイネージの開発してました☆ 前はデジタルサイネージの開発してました☆ 前はデジタルサイネージの開発してました☆ 前はデジタルサイネージの開発してました
☆ その昔はコピー機のOSをNetBSDで☆ その昔はコピー機のOSをNetBSDで☆ その昔はコピー機のOSをNetBSDで☆ その昔はコピー機のOSをNetBSDで☆ その昔はコピー機のOSをNetBSDで
3. ようこそ、ピストルMetasepiへようこそ、ピストルMetasepiへようこそ、ピストルMetasepiへようこそ、ピストルMetasepiへようこそ、ピストルMetasepiへ
☆ [1] 前菜としてデモでも☆ [1] 前菜としてデモでも☆ [1] 前菜としてデモでも☆ [1] 前菜としてデモでも☆ [1] 前菜としてデモでも
☆ [2] Ajhcコンパイラとは☆ [2] Ajhcコンパイラとは☆ [2] Ajhcコンパイラとは☆ [2] Ajhcコンパイラとは☆ [2] Ajhcコンパイラとは
☆ [3] Metasepi kernelとは☆ [3] Metasepi kernelとは☆ [3] Metasepi kernelとは☆ [3] Metasepi kernelとは☆ [3] Metasepi kernelとは
☆ [4] OS開発向けコンパイラとは☆ [4] OS開発向けコンパイラとは☆ [4] OS開発向けコンパイラとは☆ [4] OS開発向けコンパイラとは☆ [4] OS開発向けコンパイラとは
☆ [5] Ajhcのインストールと使い方☆ [5] Ajhcのインストールと使い方☆ [5] Ajhcのインストールと使い方☆ [5] Ajhcのインストールと使い方☆ [5] Ajhcのインストールと使い方
☆ [6] mbedマイコン上でのHaskell☆ [6] mbedマイコン上でのHaskell☆ [6] mbedマイコン上でのHaskell☆ [6] mbedマイコン上でのHaskell☆ [6] mbedマイコン上でのHaskell
☆ [7] Ajhcコンパイラの過去と未来☆ [7] Ajhcコンパイラの過去と未来☆ [7] Ajhcコンパイラの過去と未来☆ [7] Ajhcコンパイラの過去と未来☆ [7] Ajhcコンパイラの過去と未来
4. [1] 前菜としてデモでも[1] 前菜としてデモでも[1] 前菜としてデモでも[1] 前菜としてデモでも[1] 前菜としてデモでも
☆ mbedでRSSリーダーを作ってみました☆ mbedでRSSリーダーを作ってみました☆ mbedでRSSリーダーを作ってみました☆ mbedでRSSリーダーを作ってみました☆ mbedでRSSリーダーを作ってみました
☆ redditのRSSをLCDにヘッドライン表示☆ redditのRSSをLCDにヘッドライン表示☆ redditのRSSをLCDにヘッドライン表示☆ redditのRSSをLCDにヘッドライン表示☆ redditのRSSをLCDにヘッドライン表示
☆ 動画は以下のURLから観れます☆ 動画は以下のURLから観れます☆ 動画は以下のURLから観れます☆ 動画は以下のURLから観れます☆ 動画は以下のURLから観れます
http://bit.ly/mbedmovhttp://bit.ly/mbedmovhttp://bit.ly/mbedmovhttp://bit.ly/mbedmovhttp://bit.ly/mbedmov
☆ このスライドは下のURLに置かれています☆ このスライドは下のURLに置かれています☆ このスライドは下のURLに置かれています☆ このスライドは下のURLに置かれています☆ このスライドは下のURLに置かれています
http://bit.ly/mbedhaskhttp://bit.ly/mbedhaskhttp://bit.ly/mbedhaskhttp://bit.ly/mbedhaskhttp://bit.ly/mbedhask
5. デモのハードウェア構成デモのハードウェア構成デモのハードウェア構成デモのハードウェア構成デモのハードウェア構成
アーキティクチャ: ARM Cortex-M3アーキティクチャ: ARM Cortex-M3アーキティクチャ: ARM Cortex-M3アーキティクチャ: ARM Cortex-M3アーキティクチャ: ARM Cortex-M3
メモリサイズ: 64kBメモリサイズ: 64kBメモリサイズ: 64kBメモリサイズ: 64kBメモリサイズ: 64kB
デバイス: Ethernet, LED, LCD, SDカード,
USBホスト/デバイス, シリアル
デバイス: Ethernet, LED, LCD, SDカード,
USBホスト/デバイス, シリアル
デバイス: Ethernet, LED, LCD, SDカード,
USBホスト/デバイス, シリアル
デバイス: Ethernet, LED, LCD, SDカード,
USBホスト/デバイス, シリアル
デバイス: Ethernet, LED, LCD, SDカード,
USBホスト/デバイス, シリアル
7. デモのソースコードツリーデモのソースコードツリーデモのソースコードツリーデモのソースコードツリーデモのソースコードツリー
demo-cortex-m3
`-- mbed-nxp-lpc1768
|-- BuildShell <= コンパイル環境設定
|-- build
| `-- mbed.ld <= リンカスクリプト
|-- external
| `-- mbed
| `-- LPC1768
| `-- GCC_ARM
| `-- libmbed.a <= コンパイル済みmbedライブラリ
|-- linux_install <= コンパイル環境構築スクリプト
|-- samples
| `-- Haskell_Http
| |-- EthernetInterface <= TCP/IPプロトコルスタック
| |-- c_extern.h
| |-- dummy4jhc.c <= Haskell用C言語スタブ
| |-- hs_src
| | `-- *.hs <= Haskellソースコード
| |-- main.c <= C言語main関数
| `-- mbed-rtos <= mbed-rtos OS
`-- src
`-- gcc4mbed.c
demo-cortex-m3
`-- mbed-nxp-lpc1768
|-- BuildShell <= コンパイル環境設定
|-- build
| `-- mbed.ld <= リンカスクリプト
|-- external
| `-- mbed
| `-- LPC1768
| `-- GCC_ARM
| `-- libmbed.a <= コンパイル済みmbedライブラリ
|-- linux_install <= コンパイル環境構築スクリプト
|-- samples
| `-- Haskell_Http
| |-- EthernetInterface <= TCP/IPプロトコルスタック
| |-- c_extern.h
| |-- dummy4jhc.c <= Haskell用C言語スタブ
| |-- hs_src
| | `-- *.hs <= Haskellソースコード
| |-- main.c <= C言語main関数
| `-- mbed-rtos <= mbed-rtos OS
`-- src
`-- gcc4mbed.c
demo-cortex-m3
`-- mbed-nxp-lpc1768
|-- BuildShell <= コンパイル環境設定
|-- build
| `-- mbed.ld <= リンカスクリプト
|-- external
| `-- mbed
| `-- LPC1768
| `-- GCC_ARM
| `-- libmbed.a <= コンパイル済みmbedライブラリ
|-- linux_install <= コンパイル環境構築スクリプト
|-- samples
| `-- Haskell_Http
| |-- EthernetInterface <= TCP/IPプロトコルスタック
| |-- c_extern.h
| |-- dummy4jhc.c <= Haskell用C言語スタブ
| |-- hs_src
| | `-- *.hs <= Haskellソースコード
| |-- main.c <= C言語main関数
| `-- mbed-rtos <= mbed-rtos OS
`-- src
`-- gcc4mbed.c
demo-cortex-m3
`-- mbed-nxp-lpc1768
|-- BuildShell <= コンパイル環境設定
|-- build
| `-- mbed.ld <= リンカスクリプト
|-- external
| `-- mbed
| `-- LPC1768
| `-- GCC_ARM
| `-- libmbed.a <= コンパイル済みmbedライブラリ
|-- linux_install <= コンパイル環境構築スクリプト
|-- samples
| `-- Haskell_Http
| |-- EthernetInterface <= TCP/IPプロトコルスタック
| |-- c_extern.h
| |-- dummy4jhc.c <= Haskell用C言語スタブ
| |-- hs_src
| | `-- *.hs <= Haskellソースコード
| |-- main.c <= C言語main関数
| `-- mbed-rtos <= mbed-rtos OS
`-- src
`-- gcc4mbed.c
demo-cortex-m3
`-- mbed-nxp-lpc1768
|-- BuildShell <= コンパイル環境設定
|-- build
| `-- mbed.ld <= リンカスクリプト
|-- external
| `-- mbed
| `-- LPC1768
| `-- GCC_ARM
| `-- libmbed.a <= コンパイル済みmbedライブラリ
|-- linux_install <= コンパイル環境構築スクリプト
|-- samples
| `-- Haskell_Http
| |-- EthernetInterface <= TCP/IPプロトコルスタック
| |-- c_extern.h
| |-- dummy4jhc.c <= Haskell用C言語スタブ
| |-- hs_src
| | `-- *.hs <= Haskellソースコード
| |-- main.c <= C言語main関数
| `-- mbed-rtos <= mbed-rtos OS
`-- src
`-- gcc4mbed.c
8. [2] Ajhcコンパイラとは[2] Ajhcコンパイラとは[2] Ajhcコンパイラとは[2] Ajhcコンパイラとは[2] Ajhcコンパイラとは
http://ajhc.metasepi.org/http://ajhc.metasepi.org/http://ajhc.metasepi.org/http://ajhc.metasepi.org/http://ajhc.metasepi.org/
☆ Ajhc := A fork of jhc☆ Ajhc := A fork of jhc☆ Ajhc := A fork of jhc☆ Ajhc := A fork of jhc☆ Ajhc := A fork of jhc
☆ jhc := John's Haskell Compiler☆ jhc := John's Haskell Compiler☆ jhc := John's Haskell Compiler☆ jhc := John's Haskell Compiler☆ jhc := John's Haskell Compiler
☆ http://repetae.net/computer/jhc/☆ http://repetae.net/computer/jhc/☆ http://repetae.net/computer/jhc/☆ http://repetae.net/computer/jhc/☆ http://repetae.net/computer/jhc/
☆ jhcはフットプリントが小さく、☆ jhcはフットプリントが小さく、☆ jhcはフットプリントが小さく、☆ jhcはフットプリントが小さく、☆ jhcはフットプリントが小さく、
☆ 高速な実行バイナリを吐くらしい☆ 高速な実行バイナリを吐くらしい☆ 高速な実行バイナリを吐くらしい☆ 高速な実行バイナリを吐くらしい☆ 高速な実行バイナリを吐くらしい
☆ 組み込みに向いてるかも☆ 組み込みに向いてるかも☆ 組み込みに向いてるかも☆ 組み込みに向いてるかも☆ 組み込みに向いてるかも
9. どうしてAjhcコンパイラ作るの?どうしてAjhcコンパイラ作るの?どうしてAjhcコンパイラ作るの?どうしてAjhcコンパイラ作るの?どうしてAjhcコンパイラ作るの?
☆ HaskellコミュニティではGHCがデファクト☆ HaskellコミュニティではGHCがデファクト☆ HaskellコミュニティではGHCがデファクト☆ HaskellコミュニティではGHCがデファクト☆ HaskellコミュニティではGHCがデファクト
☆ GHC := Glasgow Haskell Compiler☆ GHC := Glasgow Haskell Compiler☆ GHC := Glasgow Haskell Compiler☆ GHC := Glasgow Haskell Compiler☆ GHC := Glasgow Haskell Compiler
☆ http://www.haskell.org/ghc/☆ http://www.haskell.org/ghc/☆ http://www.haskell.org/ghc/☆ http://www.haskell.org/ghc/☆ http://www.haskell.org/ghc/
☆ なぜ別のHaskellコンパイラが必要?☆ なぜ別のHaskellコンパイラが必要?☆ なぜ別のHaskellコンパイラが必要?☆ なぜ別のHaskellコンパイラが必要?☆ なぜ別のHaskellコンパイラが必要?
☆ Metasepiというkernelを作るため☆ Metasepiというkernelを作るため☆ Metasepiというkernelを作るため☆ Metasepiというkernelを作るため☆ Metasepiというkernelを作るため
10. [3] Metasepi kernelとは[3] Metasepi kernelとは[3] Metasepi kernelとは[3] Metasepi kernelとは[3] Metasepi kernelとは
http://metasepi.org/http://metasepi.org/http://metasepi.org/http://metasepi.org/http://metasepi.org/
☆ UNIXモドキkernelを強い型によって設計☆ UNIXモドキkernelを強い型によって設計☆ UNIXモドキkernelを強い型によって設計☆ UNIXモドキkernelを強い型によって設計☆ UNIXモドキkernelを強い型によって設計
☆ ML同等以上に強い型を持つ言語を使う☆ ML同等以上に強い型を持つ言語を使う☆ ML同等以上に強い型を持つ言語を使う☆ ML同等以上に強い型を持つ言語を使う☆ ML同等以上に強い型を持つ言語を使う
Haskell http://www.haskell.org/Haskell http://www.haskell.org/Haskell http://www.haskell.org/Haskell http://www.haskell.org/Haskell http://www.haskell.org/
OCaml http://caml.inria.fr/OCaml http://caml.inria.fr/OCaml http://caml.inria.fr/OCaml http://caml.inria.fr/OCaml http://caml.inria.fr/
MLton http://mlton.org/MLton http://mlton.org/MLton http://mlton.org/MLton http://mlton.org/MLton http://mlton.org/
などなどなどなどなどなどなどなどなどなど
12. 既存OSSの品質は高いのでは?既存OSSの品質は高いのでは?既存OSSの品質は高いのでは?既存OSSの品質は高いのでは?既存OSSの品質は高いのでは?
☆ OSSは品質が高いと言われている☆ OSSは品質が高いと言われている☆ OSSは品質が高いと言われている☆ OSSは品質が高いと言われている☆ OSSは品質が高いと言われている
☆ 伽藍とバザール☆ 伽藍とバザール☆ 伽藍とバザール☆ 伽藍とバザール☆ 伽藍とバザール
☆ 「目玉の数さえ十分あれば、どんなバグも深
刻ではない」
☆ 「目玉の数さえ十分あれば、どんなバグも深
刻ではない」
☆ 「目玉の数さえ十分あれば、どんなバグも深
刻ではない」
☆ 「目玉の数さえ十分あれば、どんなバグも深
刻ではない」
☆ 「目玉の数さえ十分あれば、どんなバグも深
刻ではない」
http://cruel.org/freeware/cathedral.htmlhttp://cruel.org/freeware/cathedral.htmlhttp://cruel.org/freeware/cathedral.htmlhttp://cruel.org/freeware/cathedral.htmlhttp://cruel.org/freeware/cathedral.html
☆ ところが社内開発は...☆ ところが社内開発は...☆ ところが社内開発は...☆ ところが社内開発は...☆ ところが社内開発は...
14. 型安全とは型安全とは型安全とは型安全とは型安全とは
☆ ランタイムエラーを少なくできる☆ ランタイムエラーを少なくできる☆ ランタイムエラーを少なくできる☆ ランタイムエラーを少なくできる☆ ランタイムエラーを少なくできる
☆ 参考:数理科学的バグ撲滅方法論のすすめ☆ 参考:数理科学的バグ撲滅方法論のすすめ☆ 参考:数理科学的バグ撲滅方法論のすすめ☆ 参考:数理科学的バグ撲滅方法論のすすめ☆ 参考:数理科学的バグ撲滅方法論のすすめ
http://itpro.nikkeibp.co.jp/article/COLUMN/20060915/248230/http://itpro.nikkeibp.co.jp/article/COLUMN/20060915/248230/http://itpro.nikkeibp.co.jp/article/COLUMN/20060915/248230/http://itpro.nikkeibp.co.jp/article/COLUMN/20060915/248230/http://itpro.nikkeibp.co.jp/article/COLUMN/20060915/248230/
16. [4] OS開発向けコンパイラとは[4] OS開発向けコンパイラとは[4] OS開発向けコンパイラとは[4] OS開発向けコンパイラとは[4] OS開発向けコンパイラとは
☆ 強い型が使えてOSを作れるコンパイラは?☆ 強い型が使えてOSを作れるコンパイラは?☆ 強い型が使えてOSを作れるコンパイラは?☆ 強い型が使えてOSを作れるコンパイラは?☆ 強い型が使えてOSを作れるコンパイラは?
☆ C言語のような使い勝手が必要☆ C言語のような使い勝手が必要☆ C言語のような使い勝手が必要☆ C言語のような使い勝手が必要☆ C言語のような使い勝手が必要
☆ ないみたいなので作りましょう!☆ ないみたいなので作りましょう!☆ ないみたいなので作りましょう!☆ ないみたいなので作りましょう!☆ ないみたいなので作りましょう!
☆ スクラッチから作るのはツライ☆ スクラッチから作るのはツライ☆ スクラッチから作るのはツライ☆ スクラッチから作るのはツライ☆ スクラッチから作るのはツライ
☆ 要求に近いコンパイラはないかな?☆ 要求に近いコンパイラはないかな?☆ 要求に近いコンパイラはないかな?☆ 要求に近いコンパイラはないかな?☆ 要求に近いコンパイラはないかな?
18. jhcバイナリは未定義シンボル20個jhcバイナリは未定義シンボル20個jhcバイナリは未定義シンボル20個jhcバイナリは未定義シンボル20個jhcバイナリは未定義シンボル20個
$ nm hs.out | grep "U "
U _IO_putc@@GLIBC_2.2.5
U __libc_start_main@@GLIBC_2.2.5
U _setjmp@@GLIBC_2.2.5
U abort@@GLIBC_2.2.5
U ctime@@GLIBC_2.2.5
U exit@@GLIBC_2.2.5
U fflush@@GLIBC_2.2.5
U fprintf@@GLIBC_2.2.5
U fputc@@GLIBC_2.2.5
U fputs@@GLIBC_2.2.5
U free@@GLIBC_2.2.5
U fwrite@@GLIBC_2.2.5
U getenv@@GLIBC_2.2.5
U malloc@@GLIBC_2.2.5
U memset@@GLIBC_2.2.5
U posix_memalign@@GLIBC_2.2.5
U realloc@@GLIBC_2.2.5
U setlocale@@GLIBC_2.2.5
U sysconf@@GLIBC_2.2.5
U times@@GLIBC_2.2.5
$ nm hs.out | grep "U "
U _IO_putc@@GLIBC_2.2.5
U __libc_start_main@@GLIBC_2.2.5
U _setjmp@@GLIBC_2.2.5
U abort@@GLIBC_2.2.5
U ctime@@GLIBC_2.2.5
U exit@@GLIBC_2.2.5
U fflush@@GLIBC_2.2.5
U fprintf@@GLIBC_2.2.5
U fputc@@GLIBC_2.2.5
U fputs@@GLIBC_2.2.5
U free@@GLIBC_2.2.5
U fwrite@@GLIBC_2.2.5
U getenv@@GLIBC_2.2.5
U malloc@@GLIBC_2.2.5
U memset@@GLIBC_2.2.5
U posix_memalign@@GLIBC_2.2.5
U realloc@@GLIBC_2.2.5
U setlocale@@GLIBC_2.2.5
U sysconf@@GLIBC_2.2.5
U times@@GLIBC_2.2.5
$ nm hs.out | grep "U "
U _IO_putc@@GLIBC_2.2.5
U __libc_start_main@@GLIBC_2.2.5
U _setjmp@@GLIBC_2.2.5
U abort@@GLIBC_2.2.5
U ctime@@GLIBC_2.2.5
U exit@@GLIBC_2.2.5
U fflush@@GLIBC_2.2.5
U fprintf@@GLIBC_2.2.5
U fputc@@GLIBC_2.2.5
U fputs@@GLIBC_2.2.5
U free@@GLIBC_2.2.5
U fwrite@@GLIBC_2.2.5
U getenv@@GLIBC_2.2.5
U malloc@@GLIBC_2.2.5
U memset@@GLIBC_2.2.5
U posix_memalign@@GLIBC_2.2.5
U realloc@@GLIBC_2.2.5
U setlocale@@GLIBC_2.2.5
U sysconf@@GLIBC_2.2.5
U times@@GLIBC_2.2.5
$ nm hs.out | grep "U "
U _IO_putc@@GLIBC_2.2.5
U __libc_start_main@@GLIBC_2.2.5
U _setjmp@@GLIBC_2.2.5
U abort@@GLIBC_2.2.5
U ctime@@GLIBC_2.2.5
U exit@@GLIBC_2.2.5
U fflush@@GLIBC_2.2.5
U fprintf@@GLIBC_2.2.5
U fputc@@GLIBC_2.2.5
U fputs@@GLIBC_2.2.5
U free@@GLIBC_2.2.5
U fwrite@@GLIBC_2.2.5
U getenv@@GLIBC_2.2.5
U malloc@@GLIBC_2.2.5
U memset@@GLIBC_2.2.5
U posix_memalign@@GLIBC_2.2.5
U realloc@@GLIBC_2.2.5
U setlocale@@GLIBC_2.2.5
U sysconf@@GLIBC_2.2.5
U times@@GLIBC_2.2.5
$ nm hs.out | grep "U "
U _IO_putc@@GLIBC_2.2.5
U __libc_start_main@@GLIBC_2.2.5
U _setjmp@@GLIBC_2.2.5
U abort@@GLIBC_2.2.5
U ctime@@GLIBC_2.2.5
U exit@@GLIBC_2.2.5
U fflush@@GLIBC_2.2.5
U fprintf@@GLIBC_2.2.5
U fputc@@GLIBC_2.2.5
U fputs@@GLIBC_2.2.5
U free@@GLIBC_2.2.5
U fwrite@@GLIBC_2.2.5
U getenv@@GLIBC_2.2.5
U malloc@@GLIBC_2.2.5
U memset@@GLIBC_2.2.5
U posix_memalign@@GLIBC_2.2.5
U realloc@@GLIBC_2.2.5
U setlocale@@GLIBC_2.2.5
U sysconf@@GLIBC_2.2.5
U times@@GLIBC_2.2.5
22. [5] Ajhcのインストールと使い方[5] Ajhcのインストールと使い方[5] Ajhcのインストールと使い方[5] Ajhcのインストールと使い方[5] Ajhcのインストールと使い方
☆ インストールしてみましょう☆ インストールしてみましょう☆ インストールしてみましょう☆ インストールしてみましょう☆ インストールしてみましょう
Ubuntu 12.04 amd64 の場合Ubuntu 12.04 amd64 の場合Ubuntu 12.04 amd64 の場合Ubuntu 12.04 amd64 の場合Ubuntu 12.04 amd64 の場合
$ sudo apt-get install haskell-platform libncurses5-dev gcc m4
$ cabal update
$ export PATH=$HOME/.cabal/bin/:$PATH
$ cabal install ajhc
$ which ajhc
/home/ユーザ名/.cabal/bin/ajhc
$ echo 'main = print "hoge"' > Hoge.hs
$ ajhc Hoge.hs
$ ./hs.out
"hoge"
$ sudo apt-get install haskell-platform libncurses5-dev gcc m4
$ cabal update
$ export PATH=$HOME/.cabal/bin/:$PATH
$ cabal install ajhc
$ which ajhc
/home/ユーザ名/.cabal/bin/ajhc
$ echo 'main = print "hoge"' > Hoge.hs
$ ajhc Hoge.hs
$ ./hs.out
"hoge"
$ sudo apt-get install haskell-platform libncurses5-dev gcc m4
$ cabal update
$ export PATH=$HOME/.cabal/bin/:$PATH
$ cabal install ajhc
$ which ajhc
/home/ユーザ名/.cabal/bin/ajhc
$ echo 'main = print "hoge"' > Hoge.hs
$ ajhc Hoge.hs
$ ./hs.out
"hoge"
$ sudo apt-get install haskell-platform libncurses5-dev gcc m4
$ cabal update
$ export PATH=$HOME/.cabal/bin/:$PATH
$ cabal install ajhc
$ which ajhc
/home/ユーザ名/.cabal/bin/ajhc
$ echo 'main = print "hoge"' > Hoge.hs
$ ajhc Hoge.hs
$ ./hs.out
"hoge"
$ sudo apt-get install haskell-platform libncurses5-dev gcc m4
$ cabal update
$ export PATH=$HOME/.cabal/bin/:$PATH
$ cabal install ajhc
$ which ajhc
/home/ユーザ名/.cabal/bin/ajhc
$ echo 'main = print "hoge"' > Hoge.hs
$ ajhc Hoge.hs
$ ./hs.out
"hoge"
バージョン0.8.0.9からはWindowsとOS Xで
もインストール可能になる予定です
バージョン0.8.0.9からはWindowsとOS Xで
もインストール可能になる予定です
バージョン0.8.0.9からはWindowsとOS Xで
もインストール可能になる予定です
バージョン0.8.0.9からはWindowsとOS Xで
もインストール可能になる予定です
バージョン0.8.0.9からはWindowsとOS Xで
もインストール可能になる予定です
24. [6] mbedマイコン上でのHaskell[6] mbedマイコン上でのHaskell[6] mbedマイコン上でのHaskell[6] mbedマイコン上でのHaskell[6] mbedマイコン上でのHaskell
mbedマイコン上でHaskellコードを動かす手
順をステップ毎に説明します
mbedマイコン上でHaskellコードを動かす手
順をステップ毎に説明します
mbedマイコン上でHaskellコードを動かす手
順をステップ毎に説明します
mbedマイコン上でHaskellコードを動かす手
順をステップ毎に説明します
mbedマイコン上でHaskellコードを動かす手
順をステップ毎に説明します
☆ C言語の開発環境構築☆ C言語の開発環境構築☆ C言語の開発環境構築☆ C言語の開発環境構築☆ C言語の開発環境構築
☆ Haskellの開発環境構築☆ Haskellの開発環境構築☆ Haskellの開発環境構築☆ Haskellの開発環境構築☆ Haskellの開発環境構築
☆ Haskellを使ったプログラミング☆ Haskellを使ったプログラミング☆ Haskellを使ったプログラミング☆ Haskellを使ったプログラミング☆ Haskellを使ったプログラミング
の大きく3つに分けようと思いますの大きく3つに分けようと思いますの大きく3つに分けようと思いますの大きく3つに分けようと思いますの大きく3つに分けようと思います
26. ビルド手順を確認ビルド手順を確認ビルド手順を確認ビルド手順を確認ビルド手順を確認
クロスコンパイル環境構築クロスコンパイル環境構築クロスコンパイル環境構築クロスコンパイル環境構築クロスコンパイル環境構築
$ cd gcc4mbed
$ ./linux_install
$ cd gcc4mbed
$ ./linux_install
$ cd gcc4mbed
$ ./linux_install
$ cd gcc4mbed
$ ./linux_install
$ cd gcc4mbed
$ ./linux_install
設定したクロスコンパイラを使うには...設定したクロスコンパイラを使うには...設定したクロスコンパイラを使うには...設定したクロスコンパイラを使うには...設定したクロスコンパイラを使うには...
$ cd gcc4mbed
$ ./BuildShell
$ cd samples/Blink
$ ls
main.c makefile
$ make
$ ls
Blink.bin Blink.elf Blink.hex LPC176x main.c makefile
$ cd gcc4mbed
$ ./BuildShell
$ cd samples/Blink
$ ls
main.c makefile
$ make
$ ls
Blink.bin Blink.elf Blink.hex LPC176x main.c makefile
$ cd gcc4mbed
$ ./BuildShell
$ cd samples/Blink
$ ls
main.c makefile
$ make
$ ls
Blink.bin Blink.elf Blink.hex LPC176x main.c makefile
$ cd gcc4mbed
$ ./BuildShell
$ cd samples/Blink
$ ls
main.c makefile
$ make
$ ls
Blink.bin Blink.elf Blink.hex LPC176x main.c makefile
$ cd gcc4mbed
$ ./BuildShell
$ cd samples/Blink
$ ls
main.c makefile
$ make
$ ls
Blink.bin Blink.elf Blink.hex LPC176x main.c makefile
Blink.elfがコンパイル結果ですBlink.elfがコンパイル結果ですBlink.elfがコンパイル結果ですBlink.elfがコンパイル結果ですBlink.elfがコンパイル結果です
27. mbedにプログラムを書き込む #1mbedにプログラムを書き込む #1mbedにプログラムを書き込む #1mbedにプログラムを書き込む #1mbedにプログラムを書き込む #1
☆ mbedファームウェアをrev.141212以降に☆ mbedファームウェアをrev.141212以降に☆ mbedファームウェアをrev.141212以降に☆ mbedファームウェアをrev.141212以降に☆ mbedファームウェアをrev.141212以降に
http://mbed.org/handbook/Firmware-LPC1768-LPC11U24http://mbed.org/handbook/Firmware-LPC1768-LPC11U24http://mbed.org/handbook/Firmware-LPC1768-LPC11U24http://mbed.org/handbook/Firmware-LPC1768-LPC11U24http://mbed.org/handbook/Firmware-LPC1768-LPC11U24
☆ pyOCDのインストール☆ pyOCDのインストール☆ pyOCDのインストール☆ pyOCDのインストール☆ pyOCDのインストール
$ sudo apt-get install python libusb-1.0-0-dev
$ git clone git@github.com:walac/pyusb.git
$ cd pyusb && sudo python setup.py install
$ git clone git@github.com:mbedmicro/mbed.git
$ cd mbed/workspace_tools/debugger
$ sudo python setup.py install
$ cp test/gdb_test.py ~/gcc4mbed/gdbserver.py
$ sudo apt-get install python libusb-1.0-0-dev
$ git clone git@github.com:walac/pyusb.git
$ cd pyusb && sudo python setup.py install
$ git clone git@github.com:mbedmicro/mbed.git
$ cd mbed/workspace_tools/debugger
$ sudo python setup.py install
$ cp test/gdb_test.py ~/gcc4mbed/gdbserver.py
$ sudo apt-get install python libusb-1.0-0-dev
$ git clone git@github.com:walac/pyusb.git
$ cd pyusb && sudo python setup.py install
$ git clone git@github.com:mbedmicro/mbed.git
$ cd mbed/workspace_tools/debugger
$ sudo python setup.py install
$ cp test/gdb_test.py ~/gcc4mbed/gdbserver.py
$ sudo apt-get install python libusb-1.0-0-dev
$ git clone git@github.com:walac/pyusb.git
$ cd pyusb && sudo python setup.py install
$ git clone git@github.com:mbedmicro/mbed.git
$ cd mbed/workspace_tools/debugger
$ sudo python setup.py install
$ cp test/gdb_test.py ~/gcc4mbed/gdbserver.py
$ sudo apt-get install python libusb-1.0-0-dev
$ git clone git@github.com:walac/pyusb.git
$ cd pyusb && sudo python setup.py install
$ git clone git@github.com:mbedmicro/mbed.git
$ cd mbed/workspace_tools/debugger
$ sudo python setup.py install
$ cp test/gdb_test.py ~/gcc4mbed/gdbserver.py
☆ gdbスクリプト設置☆ gdbスクリプト設置☆ gdbスクリプト設置☆ gdbスクリプト設置☆ gdbスクリプト設置
$ vi gcc4mbed/gdbwrite.boot
target remote localhost:3333
load
$ vi gcc4mbed/gdbwrite.boot
target remote localhost:3333
load
$ vi gcc4mbed/gdbwrite.boot
target remote localhost:3333
load
$ vi gcc4mbed/gdbwrite.boot
target remote localhost:3333
load
$ vi gcc4mbed/gdbwrite.boot
target remote localhost:3333
load
28. mbedにプログラムを書き込む #2mbedにプログラムを書き込む #2mbedにプログラムを書き込む #2mbedにプログラムを書き込む #2mbedにプログラムを書き込む #2
☆ gcc4mbed.mkにgdbターゲット追加☆ gcc4mbed.mkにgdbターゲット追加☆ gcc4mbed.mkにgdbターゲット追加☆ gcc4mbed.mkにgdbターゲット追加☆ gcc4mbed.mkにgdbターゲット追加
--- a/build/gcc4mbed.mk
+++ b/build/gcc4mbed.mk
@@ -255,6 +255,14 @@ endif
all:: $(PROJECT).hex $(PROJECT).bin $(OUTDIR)/$(PROJECT).disasm
size
+GDB = arm-none-eabi-gdb
+
+gdbwrite: all
+ @echo '################################################'
+ @echo '# Use me after running "sudo ./gdbserver4.py". #'
+ @echo '################################################'
+ $(GDB) -x ../../gdbwrite.boot $(PROJECT).elf
+
$(PROJECT).bin: $(PROJECT).elf
@echo Extracting $@
$(Q) $(OBJCOPY) -O binary $(PROJECT).elf $(PROJECT).bin
--- a/build/gcc4mbed.mk
+++ b/build/gcc4mbed.mk
@@ -255,6 +255,14 @@ endif
all:: $(PROJECT).hex $(PROJECT).bin $(OUTDIR)/$(PROJECT).disasm
size
+GDB = arm-none-eabi-gdb
+
+gdbwrite: all
+ @echo '################################################'
+ @echo '# Use me after running "sudo ./gdbserver4.py". #'
+ @echo '################################################'
+ $(GDB) -x ../../gdbwrite.boot $(PROJECT).elf
+
$(PROJECT).bin: $(PROJECT).elf
@echo Extracting $@
$(Q) $(OBJCOPY) -O binary $(PROJECT).elf $(PROJECT).bin
--- a/build/gcc4mbed.mk
+++ b/build/gcc4mbed.mk
@@ -255,6 +255,14 @@ endif
all:: $(PROJECT).hex $(PROJECT).bin $(OUTDIR)/$(PROJECT).disasm
size
+GDB = arm-none-eabi-gdb
+
+gdbwrite: all
+ @echo '################################################'
+ @echo '# Use me after running "sudo ./gdbserver4.py". #'
+ @echo '################################################'
+ $(GDB) -x ../../gdbwrite.boot $(PROJECT).elf
+
$(PROJECT).bin: $(PROJECT).elf
@echo Extracting $@
$(Q) $(OBJCOPY) -O binary $(PROJECT).elf $(PROJECT).bin
--- a/build/gcc4mbed.mk
+++ b/build/gcc4mbed.mk
@@ -255,6 +255,14 @@ endif
all:: $(PROJECT).hex $(PROJECT).bin $(OUTDIR)/$(PROJECT).disasm
size
+GDB = arm-none-eabi-gdb
+
+gdbwrite: all
+ @echo '################################################'
+ @echo '# Use me after running "sudo ./gdbserver4.py". #'
+ @echo '################################################'
+ $(GDB) -x ../../gdbwrite.boot $(PROJECT).elf
+
$(PROJECT).bin: $(PROJECT).elf
@echo Extracting $@
$(Q) $(OBJCOPY) -O binary $(PROJECT).elf $(PROJECT).bin
--- a/build/gcc4mbed.mk
+++ b/build/gcc4mbed.mk
@@ -255,6 +255,14 @@ endif
all:: $(PROJECT).hex $(PROJECT).bin $(OUTDIR)/$(PROJECT).disasm
size
+GDB = arm-none-eabi-gdb
+
+gdbwrite: all
+ @echo '################################################'
+ @echo '# Use me after running "sudo ./gdbserver4.py". #'
+ @echo '################################################'
+ $(GDB) -x ../../gdbwrite.boot $(PROJECT).elf
+
$(PROJECT).bin: $(PROJECT).elf
@echo Extracting $@
$(Q) $(OBJCOPY) -O binary $(PROJECT).elf $(PROJECT).bin
29. mbedにプログラムを書き込む #3mbedにプログラムを書き込む #3mbedにプログラムを書き込む #3mbedにプログラムを書き込む #3mbedにプログラムを書き込む #3
☆ mbedとPCをUSBケーブルで接続☆ mbedとPCをUSBケーブルで接続☆ mbedとPCをUSBケーブルで接続☆ mbedとPCをUSBケーブルで接続☆ mbedとPCをUSBケーブルで接続
☆ 一つ目のターミナルで以下を実行☆ 一つ目のターミナルで以下を実行☆ 一つ目のターミナルで以下を実行☆ 一つ目のターミナルで以下を実行☆ 一つ目のターミナルで以下を実行
$ cd gcc4mbed
$ sudo python gdbserver.py
$ cd gcc4mbed
$ sudo python gdbserver.py
$ cd gcc4mbed
$ sudo python gdbserver.py
$ cd gcc4mbed
$ sudo python gdbserver.py
$ cd gcc4mbed
$ sudo python gdbserver.py
☆ 別のターミナルを開き以下を実行☆ 別のターミナルを開き以下を実行☆ 別のターミナルを開き以下を実行☆ 別のターミナルを開き以下を実行☆ 別のターミナルを開き以下を実行
$ cd gcc4mbed
$ ./BuildShell
$ cd samples/Blink
$ make gdbwrite
(gdb) c
$ cd gcc4mbed
$ ./BuildShell
$ cd samples/Blink
$ make gdbwrite
(gdb) c
$ cd gcc4mbed
$ ./BuildShell
$ cd samples/Blink
$ make gdbwrite
(gdb) c
$ cd gcc4mbed
$ ./BuildShell
$ cd samples/Blink
$ make gdbwrite
(gdb) c
$ cd gcc4mbed
$ ./BuildShell
$ cd samples/Blink
$ make gdbwrite
(gdb) c
チカチカしました?チカチカしました?チカチカしました?チカチカしました?チカチカしました?
32. 旧makefileを新Makefileでラップ旧makefileを新Makefileでラップ旧makefileを新Makefileでラップ旧makefileを新Makefileでラップ旧makefileを新Makefileでラップ
$ mv makefile forc.mk
$ vi Makefile
HSBUILD = build_haskell
TINI = $(HSBUILD)/targets.ini
all:: $(HSBUILD)/hs_main.c
make -f forc.mk
include forc.mk
$(HSBUILD)/hs_main.c: $(HSSRC)
mkdir -p $(HSBUILD)
ajhc -fffi -p containers --tdir=$(HSBUILD) -C --
include=hs_src -o $@ $<
rm -f $(HSBUILD)/rts/gc_none.c $(HSBUILD)/rts/profile.c
$(HSBUILD)/rts/slub.c
$ mv makefile forc.mk
$ vi Makefile
HSBUILD = build_haskell
TINI = $(HSBUILD)/targets.ini
all:: $(HSBUILD)/hs_main.c
make -f forc.mk
include forc.mk
$(HSBUILD)/hs_main.c: $(HSSRC)
mkdir -p $(HSBUILD)
ajhc -fffi -p containers --tdir=$(HSBUILD) -C --
include=hs_src -o $@ $<
rm -f $(HSBUILD)/rts/gc_none.c $(HSBUILD)/rts/profile.c
$(HSBUILD)/rts/slub.c
$ mv makefile forc.mk
$ vi Makefile
HSBUILD = build_haskell
TINI = $(HSBUILD)/targets.ini
all:: $(HSBUILD)/hs_main.c
make -f forc.mk
include forc.mk
$(HSBUILD)/hs_main.c: $(HSSRC)
mkdir -p $(HSBUILD)
ajhc -fffi -p containers --tdir=$(HSBUILD) -C --
include=hs_src -o $@ $<
rm -f $(HSBUILD)/rts/gc_none.c $(HSBUILD)/rts/profile.c
$(HSBUILD)/rts/slub.c
$ mv makefile forc.mk
$ vi Makefile
HSBUILD = build_haskell
TINI = $(HSBUILD)/targets.ini
all:: $(HSBUILD)/hs_main.c
make -f forc.mk
include forc.mk
$(HSBUILD)/hs_main.c: $(HSSRC)
mkdir -p $(HSBUILD)
ajhc -fffi -p containers --tdir=$(HSBUILD) -C --
include=hs_src -o $@ $<
rm -f $(HSBUILD)/rts/gc_none.c $(HSBUILD)/rts/profile.c
$(HSBUILD)/rts/slub.c
$ mv makefile forc.mk
$ vi Makefile
HSBUILD = build_haskell
TINI = $(HSBUILD)/targets.ini
all:: $(HSBUILD)/hs_main.c
make -f forc.mk
include forc.mk
$(HSBUILD)/hs_main.c: $(HSSRC)
mkdir -p $(HSBUILD)
ajhc -fffi -p containers --tdir=$(HSBUILD) -C --
include=hs_src -o $@ $<
rm -f $(HSBUILD)/rts/gc_none.c $(HSBUILD)/rts/profile.c
$(HSBUILD)/rts/slub.c
33. forc.mkにAjhc用オプション追加forc.mkにAjhc用オプション追加forc.mkにAjhc用オプション追加forc.mkにAjhc用オプション追加forc.mkにAjhc用オプション追加
$ vi forc.mk # <= 以下を追加
HS_ENABLE = 1
GCFLAGS += -std=gnu99 -ffreestanding -nostdlib -falign-functions=4
GCFLAGS += -Wno-unused-parameter -fno-strict-aliasing -D_GNU_SOURCE
GCFLAGS += -DNDEBUG -D_JHC_GC=_JHC_GC_JGC -D_JHC_STANDALONE=0
GCFLAGS += -D_LITTLE_ENDIAN -D_JHC_USE_OWN_STDIO
GCFLAGS += -D_JHC_ARM_STAY_IN_THUMB_MODE -D_JHC_JGC_STACKGROW=16
GCFLAGS += -D_JHC_JGC_LIMITED_NUM_MEGABLOCK=2
GCFLAGS += -D_JHC_JGC_MEGABLOCK_SHIFT=13 -D_JHC_JGC_BLOCK_SHIFT=8
GCFLAGS += -D_JHC_JGC_GC_STACK_SHIFT=8
GCFLAGS += -D_JHC_JGC_LIMITED_NUM_GC_STACK=1
GCFLAGS += -D_JHC_JGC_NAIVEGC -D_JHC_JGC_SAVING_MALLOC_HEAP
GCFLAGS += -D_JHC_CONC=_JHC_CONC_NONE
$ vi forc.mk # <= 以下を追加
HS_ENABLE = 1
GCFLAGS += -std=gnu99 -ffreestanding -nostdlib -falign-functions=4
GCFLAGS += -Wno-unused-parameter -fno-strict-aliasing -D_GNU_SOURCE
GCFLAGS += -DNDEBUG -D_JHC_GC=_JHC_GC_JGC -D_JHC_STANDALONE=0
GCFLAGS += -D_LITTLE_ENDIAN -D_JHC_USE_OWN_STDIO
GCFLAGS += -D_JHC_ARM_STAY_IN_THUMB_MODE -D_JHC_JGC_STACKGROW=16
GCFLAGS += -D_JHC_JGC_LIMITED_NUM_MEGABLOCK=2
GCFLAGS += -D_JHC_JGC_MEGABLOCK_SHIFT=13 -D_JHC_JGC_BLOCK_SHIFT=8
GCFLAGS += -D_JHC_JGC_GC_STACK_SHIFT=8
GCFLAGS += -D_JHC_JGC_LIMITED_NUM_GC_STACK=1
GCFLAGS += -D_JHC_JGC_NAIVEGC -D_JHC_JGC_SAVING_MALLOC_HEAP
GCFLAGS += -D_JHC_CONC=_JHC_CONC_NONE
$ vi forc.mk # <= 以下を追加
HS_ENABLE = 1
GCFLAGS += -std=gnu99 -ffreestanding -nostdlib -falign-functions=4
GCFLAGS += -Wno-unused-parameter -fno-strict-aliasing -D_GNU_SOURCE
GCFLAGS += -DNDEBUG -D_JHC_GC=_JHC_GC_JGC -D_JHC_STANDALONE=0
GCFLAGS += -D_LITTLE_ENDIAN -D_JHC_USE_OWN_STDIO
GCFLAGS += -D_JHC_ARM_STAY_IN_THUMB_MODE -D_JHC_JGC_STACKGROW=16
GCFLAGS += -D_JHC_JGC_LIMITED_NUM_MEGABLOCK=2
GCFLAGS += -D_JHC_JGC_MEGABLOCK_SHIFT=13 -D_JHC_JGC_BLOCK_SHIFT=8
GCFLAGS += -D_JHC_JGC_GC_STACK_SHIFT=8
GCFLAGS += -D_JHC_JGC_LIMITED_NUM_GC_STACK=1
GCFLAGS += -D_JHC_JGC_NAIVEGC -D_JHC_JGC_SAVING_MALLOC_HEAP
GCFLAGS += -D_JHC_CONC=_JHC_CONC_NONE
$ vi forc.mk # <= 以下を追加
HS_ENABLE = 1
GCFLAGS += -std=gnu99 -ffreestanding -nostdlib -falign-functions=4
GCFLAGS += -Wno-unused-parameter -fno-strict-aliasing -D_GNU_SOURCE
GCFLAGS += -DNDEBUG -D_JHC_GC=_JHC_GC_JGC -D_JHC_STANDALONE=0
GCFLAGS += -D_LITTLE_ENDIAN -D_JHC_USE_OWN_STDIO
GCFLAGS += -D_JHC_ARM_STAY_IN_THUMB_MODE -D_JHC_JGC_STACKGROW=16
GCFLAGS += -D_JHC_JGC_LIMITED_NUM_MEGABLOCK=2
GCFLAGS += -D_JHC_JGC_MEGABLOCK_SHIFT=13 -D_JHC_JGC_BLOCK_SHIFT=8
GCFLAGS += -D_JHC_JGC_GC_STACK_SHIFT=8
GCFLAGS += -D_JHC_JGC_LIMITED_NUM_GC_STACK=1
GCFLAGS += -D_JHC_JGC_NAIVEGC -D_JHC_JGC_SAVING_MALLOC_HEAP
GCFLAGS += -D_JHC_CONC=_JHC_CONC_NONE
$ vi forc.mk # <= 以下を追加
HS_ENABLE = 1
GCFLAGS += -std=gnu99 -ffreestanding -nostdlib -falign-functions=4
GCFLAGS += -Wno-unused-parameter -fno-strict-aliasing -D_GNU_SOURCE
GCFLAGS += -DNDEBUG -D_JHC_GC=_JHC_GC_JGC -D_JHC_STANDALONE=0
GCFLAGS += -D_LITTLE_ENDIAN -D_JHC_USE_OWN_STDIO
GCFLAGS += -D_JHC_ARM_STAY_IN_THUMB_MODE -D_JHC_JGC_STACKGROW=16
GCFLAGS += -D_JHC_JGC_LIMITED_NUM_MEGABLOCK=2
GCFLAGS += -D_JHC_JGC_MEGABLOCK_SHIFT=13 -D_JHC_JGC_BLOCK_SHIFT=8
GCFLAGS += -D_JHC_JGC_GC_STACK_SHIFT=8
GCFLAGS += -D_JHC_JGC_LIMITED_NUM_GC_STACK=1
GCFLAGS += -D_JHC_JGC_NAIVEGC -D_JHC_JGC_SAVING_MALLOC_HEAP
GCFLAGS += -D_JHC_CONC=_JHC_CONC_NONE
普段はajhcがgcc呼び出し時に自動的につけ
てくれるものもある
普段はajhcがgcc呼び出し時に自動的につけ
てくれるものもある
普段はajhcがgcc呼び出し時に自動的につけ
てくれるものもある
普段はajhcがgcc呼び出し時に自動的につけ
てくれるものもある
普段はajhcがgcc呼び出し時に自動的につけ
てくれるものもある
GCのチューニングにもオプションが必要GCのチューニングにもオプションが必要GCのチューニングにもオプションが必要GCのチューニングにもオプションが必要GCのチューニングにもオプションが必要
34. gcc4mbed.mkを修正 #1gcc4mbed.mkを修正 #1gcc4mbed.mkを修正 #1gcc4mbed.mkを修正 #1gcc4mbed.mkを修正 #1
--- gcc4mbed/build/gcc4mbed.mk.back
+++ gcc4mbed/build/gcc4mbed.mk
@@ -100,6 +100,11 @@
GCC4MBED_TYPE ?= Release
MRI_BREAK_ON_INIT ?= 1
MRI_UART ?= MRI_UART_MBED_USB
+HS_ENABLE ?= 0
+HSDIR ?= hs_src
+HSBUILD ?= build_haskell
+HSSRC ?= $(wildcard $(HSDIR)/*.hs $(HSDIR)/*/*.hs $(HSDIR)/*/*/
*.hs $(HSDIR)/*/*/*/*.hs $(HSDIR)/*/*/*/*/*.hs)
+HSMAIN ?= $(HSDIR)/Main.hs
# Configure MRI variables based on GCC4MBED_TYPE build type
variable.
--- gcc4mbed/build/gcc4mbed.mk.back
+++ gcc4mbed/build/gcc4mbed.mk
@@ -100,6 +100,11 @@
GCC4MBED_TYPE ?= Release
MRI_BREAK_ON_INIT ?= 1
MRI_UART ?= MRI_UART_MBED_USB
+HS_ENABLE ?= 0
+HSDIR ?= hs_src
+HSBUILD ?= build_haskell
+HSSRC ?= $(wildcard $(HSDIR)/*.hs $(HSDIR)/*/*.hs $(HSDIR)/*/*/
*.hs $(HSDIR)/*/*/*/*.hs $(HSDIR)/*/*/*/*/*.hs)
+HSMAIN ?= $(HSDIR)/Main.hs
# Configure MRI variables based on GCC4MBED_TYPE build type
variable.
--- gcc4mbed/build/gcc4mbed.mk.back
+++ gcc4mbed/build/gcc4mbed.mk
@@ -100,6 +100,11 @@
GCC4MBED_TYPE ?= Release
MRI_BREAK_ON_INIT ?= 1
MRI_UART ?= MRI_UART_MBED_USB
+HS_ENABLE ?= 0
+HSDIR ?= hs_src
+HSBUILD ?= build_haskell
+HSSRC ?= $(wildcard $(HSDIR)/*.hs $(HSDIR)/*/*.hs $(HSDIR)/*/*/
*.hs $(HSDIR)/*/*/*/*.hs $(HSDIR)/*/*/*/*/*.hs)
+HSMAIN ?= $(HSDIR)/Main.hs
# Configure MRI variables based on GCC4MBED_TYPE build type
variable.
--- gcc4mbed/build/gcc4mbed.mk.back
+++ gcc4mbed/build/gcc4mbed.mk
@@ -100,6 +100,11 @@
GCC4MBED_TYPE ?= Release
MRI_BREAK_ON_INIT ?= 1
MRI_UART ?= MRI_UART_MBED_USB
+HS_ENABLE ?= 0
+HSDIR ?= hs_src
+HSBUILD ?= build_haskell
+HSSRC ?= $(wildcard $(HSDIR)/*.hs $(HSDIR)/*/*.hs $(HSDIR)/*/*/
*.hs $(HSDIR)/*/*/*/*.hs $(HSDIR)/*/*/*/*/*.hs)
+HSMAIN ?= $(HSDIR)/Main.hs
# Configure MRI variables based on GCC4MBED_TYPE build type
variable.
--- gcc4mbed/build/gcc4mbed.mk.back
+++ gcc4mbed/build/gcc4mbed.mk
@@ -100,6 +100,11 @@
GCC4MBED_TYPE ?= Release
MRI_BREAK_ON_INIT ?= 1
MRI_UART ?= MRI_UART_MBED_USB
+HS_ENABLE ?= 0
+HSDIR ?= hs_src
+HSBUILD ?= build_haskell
+HSSRC ?= $(wildcard $(HSDIR)/*.hs $(HSDIR)/*/*.hs $(HSDIR)/*/*/
*.hs $(HSDIR)/*/*/*/*.hs $(HSDIR)/*/*/*/*/*.hs)
+HSMAIN ?= $(HSDIR)/Main.hs
# Configure MRI variables based on GCC4MBED_TYPE build type
variable.
35. gcc4mbed.mkを修正 #2gcc4mbed.mkを修正 #2gcc4mbed.mkを修正 #2gcc4mbed.mkを修正 #2gcc4mbed.mkを修正 #2
@@ -212,13 +217,14 @@
ifneq "$(NO_FLOAT_PRINTF)" "1"
LDFLAGS += -u _printf_float
endif
+LDFLAGS += -Wl,--defsym,jhc_zeroAddress=0
# Compiler/Assembler/Linker Paths
GCC = arm-none-eabi-gcc
GPP = arm-none-eabi-g++
AS = arm-none-eabi-as
-LD = arm-none-eabi-g++
+LD = arm-none-eabi-gcc
OBJCOPY = arm-none-eabi-objcopy
OBJDUMP = arm-none-eabi-objdump
SIZE = arm-none-eabi-size
@@ -212,13 +217,14 @@
ifneq "$(NO_FLOAT_PRINTF)" "1"
LDFLAGS += -u _printf_float
endif
+LDFLAGS += -Wl,--defsym,jhc_zeroAddress=0
# Compiler/Assembler/Linker Paths
GCC = arm-none-eabi-gcc
GPP = arm-none-eabi-g++
AS = arm-none-eabi-as
-LD = arm-none-eabi-g++
+LD = arm-none-eabi-gcc
OBJCOPY = arm-none-eabi-objcopy
OBJDUMP = arm-none-eabi-objdump
SIZE = arm-none-eabi-size
@@ -212,13 +217,14 @@
ifneq "$(NO_FLOAT_PRINTF)" "1"
LDFLAGS += -u _printf_float
endif
+LDFLAGS += -Wl,--defsym,jhc_zeroAddress=0
# Compiler/Assembler/Linker Paths
GCC = arm-none-eabi-gcc
GPP = arm-none-eabi-g++
AS = arm-none-eabi-as
-LD = arm-none-eabi-g++
+LD = arm-none-eabi-gcc
OBJCOPY = arm-none-eabi-objcopy
OBJDUMP = arm-none-eabi-objdump
SIZE = arm-none-eabi-size
@@ -212,13 +217,14 @@
ifneq "$(NO_FLOAT_PRINTF)" "1"
LDFLAGS += -u _printf_float
endif
+LDFLAGS += -Wl,--defsym,jhc_zeroAddress=0
# Compiler/Assembler/Linker Paths
GCC = arm-none-eabi-gcc
GPP = arm-none-eabi-g++
AS = arm-none-eabi-as
-LD = arm-none-eabi-g++
+LD = arm-none-eabi-gcc
OBJCOPY = arm-none-eabi-objcopy
OBJDUMP = arm-none-eabi-objdump
SIZE = arm-none-eabi-size
@@ -212,13 +217,14 @@
ifneq "$(NO_FLOAT_PRINTF)" "1"
LDFLAGS += -u _printf_float
endif
+LDFLAGS += -Wl,--defsym,jhc_zeroAddress=0
# Compiler/Assembler/Linker Paths
GCC = arm-none-eabi-gcc
GPP = arm-none-eabi-g++
AS = arm-none-eabi-as
-LD = arm-none-eabi-g++
+LD = arm-none-eabi-gcc
OBJCOPY = arm-none-eabi-objcopy
OBJDUMP = arm-none-eabi-objdump
SIZE = arm-none-eabi-size
36. gcc4mbed.mkを修正 #3gcc4mbed.mkを修正 #3gcc4mbed.mkを修正 #3gcc4mbed.mkを修正 #3gcc4mbed.mkを修正 #3
@@ -279,7 +285,7 @@
@echo Cleaning up all build generated files
$(Q) $(REMOVE) -f $(call convert-slash,$(OBJECTS)) $(QUIET)
$(Q) $(REMOVE) -f $(call convert-slash,$(DEPFILES))
$(QUIET)
- $(Q) $(REMOVE_DIR) $(OUTDIR) $(QUIET)
+ $(Q) $(REMOVE_DIR) $(OUTDIR) $(HSBUILD) $(QUIET)
$(Q) $(REMOVE) -f $(call convert-slash,$(OUTDIR)/
$(PROJECT).map) $(QUIET)
$(Q) $(REMOVE) -f $(call convert-slash,$(OUTDIR)/
$(PROJECT).disasm) $(QUIET)
$(Q) $(REMOVE) -f $(PROJECT).bin $(QUIET)
@@ -279,7 +285,7 @@
@echo Cleaning up all build generated files
$(Q) $(REMOVE) -f $(call convert-slash,$(OBJECTS)) $(QUIET)
$(Q) $(REMOVE) -f $(call convert-slash,$(DEPFILES))
$(QUIET)
- $(Q) $(REMOVE_DIR) $(OUTDIR) $(QUIET)
+ $(Q) $(REMOVE_DIR) $(OUTDIR) $(HSBUILD) $(QUIET)
$(Q) $(REMOVE) -f $(call convert-slash,$(OUTDIR)/
$(PROJECT).map) $(QUIET)
$(Q) $(REMOVE) -f $(call convert-slash,$(OUTDIR)/
$(PROJECT).disasm) $(QUIET)
$(Q) $(REMOVE) -f $(PROJECT).bin $(QUIET)
@@ -279,7 +285,7 @@
@echo Cleaning up all build generated files
$(Q) $(REMOVE) -f $(call convert-slash,$(OBJECTS)) $(QUIET)
$(Q) $(REMOVE) -f $(call convert-slash,$(DEPFILES))
$(QUIET)
- $(Q) $(REMOVE_DIR) $(OUTDIR) $(QUIET)
+ $(Q) $(REMOVE_DIR) $(OUTDIR) $(HSBUILD) $(QUIET)
$(Q) $(REMOVE) -f $(call convert-slash,$(OUTDIR)/
$(PROJECT).map) $(QUIET)
$(Q) $(REMOVE) -f $(call convert-slash,$(OUTDIR)/
$(PROJECT).disasm) $(QUIET)
$(Q) $(REMOVE) -f $(PROJECT).bin $(QUIET)
@@ -279,7 +285,7 @@
@echo Cleaning up all build generated files
$(Q) $(REMOVE) -f $(call convert-slash,$(OBJECTS)) $(QUIET)
$(Q) $(REMOVE) -f $(call convert-slash,$(DEPFILES))
$(QUIET)
- $(Q) $(REMOVE_DIR) $(OUTDIR) $(QUIET)
+ $(Q) $(REMOVE_DIR) $(OUTDIR) $(HSBUILD) $(QUIET)
$(Q) $(REMOVE) -f $(call convert-slash,$(OUTDIR)/
$(PROJECT).map) $(QUIET)
$(Q) $(REMOVE) -f $(call convert-slash,$(OUTDIR)/
$(PROJECT).disasm) $(QUIET)
$(Q) $(REMOVE) -f $(PROJECT).bin $(QUIET)
@@ -279,7 +285,7 @@
@echo Cleaning up all build generated files
$(Q) $(REMOVE) -f $(call convert-slash,$(OBJECTS)) $(QUIET)
$(Q) $(REMOVE) -f $(call convert-slash,$(DEPFILES))
$(QUIET)
- $(Q) $(REMOVE_DIR) $(OUTDIR) $(QUIET)
+ $(Q) $(REMOVE_DIR) $(OUTDIR) $(HSBUILD) $(QUIET)
$(Q) $(REMOVE) -f $(call convert-slash,$(OUTDIR)/
$(PROJECT).map) $(QUIET)
$(Q) $(REMOVE) -f $(call convert-slash,$(OUTDIR)/
$(PROJECT).disasm) $(QUIET)
$(Q) $(REMOVE) -f $(PROJECT).bin $(QUIET)
ぜぇぜぇ。これでpatchあておわりましたぜぇぜぇ。これでpatchあておわりましたぜぇぜぇ。これでpatchあておわりましたぜぇぜぇ。これでpatchあておわりましたぜぇぜぇ。これでpatchあておわりました
37. C言語main関数修正(main.c)C言語main関数修正(main.c)C言語main関数修正(main.c)C言語main関数修正(main.c)C言語main関数修正(main.c)
#include "LPC17xx.h"
#include "jhc_rts_header.h"
#include "c_extern.h"
volatile int g_LoopDummy;
void delay(int times)
{
int i;
for (i = 0 ; i < times && !g_LoopDummy ; i++) {}
}
int main()
{
int hsargc = 1;
char *hsargv = "q";
char **hsargvp = &hsargv;
hs_init(&hsargc, &hsargvp); // Ajhcランタイム初期化
_amain(); // Haskellコード呼び出し
hs_exit();
for (;;) {}
return 0;
}
#include "LPC17xx.h"
#include "jhc_rts_header.h"
#include "c_extern.h"
volatile int g_LoopDummy;
void delay(int times)
{
int i;
for (i = 0 ; i < times && !g_LoopDummy ; i++) {}
}
int main()
{
int hsargc = 1;
char *hsargv = "q";
char **hsargvp = &hsargv;
hs_init(&hsargc, &hsargvp); // Ajhcランタイム初期化
_amain(); // Haskellコード呼び出し
hs_exit();
for (;;) {}
return 0;
}
#include "LPC17xx.h"
#include "jhc_rts_header.h"
#include "c_extern.h"
volatile int g_LoopDummy;
void delay(int times)
{
int i;
for (i = 0 ; i < times && !g_LoopDummy ; i++) {}
}
int main()
{
int hsargc = 1;
char *hsargv = "q";
char **hsargvp = &hsargv;
hs_init(&hsargc, &hsargvp); // Ajhcランタイム初期化
_amain(); // Haskellコード呼び出し
hs_exit();
for (;;) {}
return 0;
}
#include "LPC17xx.h"
#include "jhc_rts_header.h"
#include "c_extern.h"
volatile int g_LoopDummy;
void delay(int times)
{
int i;
for (i = 0 ; i < times && !g_LoopDummy ; i++) {}
}
int main()
{
int hsargc = 1;
char *hsargv = "q";
char **hsargvp = &hsargv;
hs_init(&hsargc, &hsargvp); // Ajhcランタイム初期化
_amain(); // Haskellコード呼び出し
hs_exit();
for (;;) {}
return 0;
}
#include "LPC17xx.h"
#include "jhc_rts_header.h"
#include "c_extern.h"
volatile int g_LoopDummy;
void delay(int times)
{
int i;
for (i = 0 ; i < times && !g_LoopDummy ; i++) {}
}
int main()
{
int hsargc = 1;
char *hsargv = "q";
char **hsargvp = &hsargv;
hs_init(&hsargc, &hsargvp); // Ajhcランタイム初期化
_amain(); // Haskellコード呼び出し
hs_exit();
for (;;) {}
return 0;
}
38. 独自のmalloc関数(alloc.c)独自のmalloc関数(alloc.c)独自のmalloc関数(alloc.c)独自のmalloc関数(alloc.c)独自のmalloc関数(alloc.c)
ソースコードが大きいのでwgetソースコードが大きいのでwgetソースコードが大きいのでwgetソースコードが大きいのでwgetソースコードが大きいのでwget
$ wget https://raw.github.com/ajhc/demo-cortex-m3/master/mbed-nxp-
lpc1768/samples/Haskell/alloc.c
$ grep MALLOC_HEAPSIZE alloc.c
#define MALLOC_HEAPSIZE _JHC_MALLOC_HEAP_SIZE
#define MALLOC_HEAPSIZE (2*1024)
char malloc_heapstart[MALLOC_HEAPSIZE];
char *malloc_heaplimit = (char *) (malloc_heapstart +
MALLOC_HEAPSIZE);
$ wget https://raw.github.com/ajhc/demo-cortex-m3/master/mbed-nxp-
lpc1768/samples/Haskell/alloc.c
$ grep MALLOC_HEAPSIZE alloc.c
#define MALLOC_HEAPSIZE _JHC_MALLOC_HEAP_SIZE
#define MALLOC_HEAPSIZE (2*1024)
char malloc_heapstart[MALLOC_HEAPSIZE];
char *malloc_heaplimit = (char *) (malloc_heapstart +
MALLOC_HEAPSIZE);
$ wget https://raw.github.com/ajhc/demo-cortex-m3/master/mbed-nxp-
lpc1768/samples/Haskell/alloc.c
$ grep MALLOC_HEAPSIZE alloc.c
#define MALLOC_HEAPSIZE _JHC_MALLOC_HEAP_SIZE
#define MALLOC_HEAPSIZE (2*1024)
char malloc_heapstart[MALLOC_HEAPSIZE];
char *malloc_heaplimit = (char *) (malloc_heapstart +
MALLOC_HEAPSIZE);
$ wget https://raw.github.com/ajhc/demo-cortex-m3/master/mbed-nxp-
lpc1768/samples/Haskell/alloc.c
$ grep MALLOC_HEAPSIZE alloc.c
#define MALLOC_HEAPSIZE _JHC_MALLOC_HEAP_SIZE
#define MALLOC_HEAPSIZE (2*1024)
char malloc_heapstart[MALLOC_HEAPSIZE];
char *malloc_heaplimit = (char *) (malloc_heapstart +
MALLOC_HEAPSIZE);
$ wget https://raw.github.com/ajhc/demo-cortex-m3/master/mbed-nxp-
lpc1768/samples/Haskell/alloc.c
$ grep MALLOC_HEAPSIZE alloc.c
#define MALLOC_HEAPSIZE _JHC_MALLOC_HEAP_SIZE
#define MALLOC_HEAPSIZE (2*1024)
char malloc_heapstart[MALLOC_HEAPSIZE];
char *malloc_heaplimit = (char *) (malloc_heapstart +
MALLOC_HEAPSIZE);
malloc用ヒープは2kBに設定してみましたmalloc用ヒープは2kBに設定してみましたmalloc用ヒープは2kBに設定してみましたmalloc用ヒープは2kBに設定してみましたmalloc用ヒープは2kBに設定してみました
通常用途ならたぶん十分です通常用途ならたぶん十分です通常用途ならたぶん十分です通常用途ならたぶん十分です通常用途ならたぶん十分です
39. 雑多なAjhc向け設定雑多なAjhc向け設定雑多なAjhc向け設定雑多なAjhc向け設定雑多なAjhc向け設定
☆ 標準入出力を無力化☆ 標準入出力を無力化☆ 標準入出力を無力化☆ 標準入出力を無力化☆ 標準入出力を無力化
// File: dummy4jhc.c
#include "jhc_rts_header.h"
int jhc_printf_stderr(const char *format, ...) { return 0; }
int jhc_fputs_stderr(const char *s) { return 0; }
int jhc_fflush_stdout() { return 0; }
void jhc_print_profile(void) {}
int jhc_utf8_getchar(void) { return 0; }
int jhc_utf8_getc(FILE *f) { return 0; }
int jhc_utf8_putchar(int ch) { return 0; }
int jhc_utf8_putc(int ch, FILE *f) { return 0; }
// File: dummy4jhc.c
#include "jhc_rts_header.h"
int jhc_printf_stderr(const char *format, ...) { return 0; }
int jhc_fputs_stderr(const char *s) { return 0; }
int jhc_fflush_stdout() { return 0; }
void jhc_print_profile(void) {}
int jhc_utf8_getchar(void) { return 0; }
int jhc_utf8_getc(FILE *f) { return 0; }
int jhc_utf8_putchar(int ch) { return 0; }
int jhc_utf8_putc(int ch, FILE *f) { return 0; }
// File: dummy4jhc.c
#include "jhc_rts_header.h"
int jhc_printf_stderr(const char *format, ...) { return 0; }
int jhc_fputs_stderr(const char *s) { return 0; }
int jhc_fflush_stdout() { return 0; }
void jhc_print_profile(void) {}
int jhc_utf8_getchar(void) { return 0; }
int jhc_utf8_getc(FILE *f) { return 0; }
int jhc_utf8_putchar(int ch) { return 0; }
int jhc_utf8_putc(int ch, FILE *f) { return 0; }
// File: dummy4jhc.c
#include "jhc_rts_header.h"
int jhc_printf_stderr(const char *format, ...) { return 0; }
int jhc_fputs_stderr(const char *s) { return 0; }
int jhc_fflush_stdout() { return 0; }
void jhc_print_profile(void) {}
int jhc_utf8_getchar(void) { return 0; }
int jhc_utf8_getc(FILE *f) { return 0; }
int jhc_utf8_putchar(int ch) { return 0; }
int jhc_utf8_putc(int ch, FILE *f) { return 0; }
// File: dummy4jhc.c
#include "jhc_rts_header.h"
int jhc_printf_stderr(const char *format, ...) { return 0; }
int jhc_fputs_stderr(const char *s) { return 0; }
int jhc_fflush_stdout() { return 0; }
void jhc_print_profile(void) {}
int jhc_utf8_getchar(void) { return 0; }
int jhc_utf8_getc(FILE *f) { return 0; }
int jhc_utf8_putchar(int ch) { return 0; }
int jhc_utf8_putc(int ch, FILE *f) { return 0; }
☆ Haskellから使うC言語API☆ Haskellから使うC言語API☆ Haskellから使うC言語API☆ Haskellから使うC言語API☆ Haskellから使うC言語API
// File: c_extern.h
extern volatile void jhc_zeroAddress;
void delay();
// File: c_extern.h
extern volatile void jhc_zeroAddress;
void delay();
// File: c_extern.h
extern volatile void jhc_zeroAddress;
void delay();
// File: c_extern.h
extern volatile void jhc_zeroAddress;
void delay();
// File: c_extern.h
extern volatile void jhc_zeroAddress;
void delay();
40. 何もしないHaskellコードでお試し何もしないHaskellコードでお試し何もしないHaskellコードでお試し何もしないHaskellコードでお試し何もしないHaskellコードでお試し
$ mkdir hs_src
$ vi hs_src/Main.hs
main :: IO ()
main = return ()
$ ls
Makefile c_extern.h forc.mk main.c
alloc.c dummy4jhc.c hs_src/
$ make
$ ls
Blink.bin LPC176x build_haskell forc.mk
Blink.elf Makefile c_extern.h hs_src
Blink.hex alloc.c dummy4jhc.c main.c
$ mkdir hs_src
$ vi hs_src/Main.hs
main :: IO ()
main = return ()
$ ls
Makefile c_extern.h forc.mk main.c
alloc.c dummy4jhc.c hs_src/
$ make
$ ls
Blink.bin LPC176x build_haskell forc.mk
Blink.elf Makefile c_extern.h hs_src
Blink.hex alloc.c dummy4jhc.c main.c
$ mkdir hs_src
$ vi hs_src/Main.hs
main :: IO ()
main = return ()
$ ls
Makefile c_extern.h forc.mk main.c
alloc.c dummy4jhc.c hs_src/
$ make
$ ls
Blink.bin LPC176x build_haskell forc.mk
Blink.elf Makefile c_extern.h hs_src
Blink.hex alloc.c dummy4jhc.c main.c
$ mkdir hs_src
$ vi hs_src/Main.hs
main :: IO ()
main = return ()
$ ls
Makefile c_extern.h forc.mk main.c
alloc.c dummy4jhc.c hs_src/
$ make
$ ls
Blink.bin LPC176x build_haskell forc.mk
Blink.elf Makefile c_extern.h hs_src
Blink.hex alloc.c dummy4jhc.c main.c
$ mkdir hs_src
$ vi hs_src/Main.hs
main :: IO ()
main = return ()
$ ls
Makefile c_extern.h forc.mk main.c
alloc.c dummy4jhc.c hs_src/
$ make
$ ls
Blink.bin LPC176x build_haskell forc.mk
Blink.elf Makefile c_extern.h hs_src
Blink.hex alloc.c dummy4jhc.c main.c
うんコンパイルできましたうんコンパイルできましたうんコンパイルできましたうんコンパイルできましたうんコンパイルできました
42. Haskellを使ったプログラミングHaskellを使ったプログラミングHaskellを使ったプログラミングHaskellを使ったプログラミングHaskellを使ったプログラミング
☆ HaskellからLEDチカチカしたい!☆ HaskellからLEDチカチカしたい!☆ HaskellからLEDチカチカしたい!☆ HaskellからLEDチカチカしたい!☆ HaskellからLEDチカチカしたい!
☆ まず時間待ちを作りましょう☆ まず時間待ちを作りましょう☆ まず時間待ちを作りましょう☆ まず時間待ちを作りましょう☆ まず時間待ちを作りましょう
☆ C言語のdelay関数をHaskellから呼出☆ C言語のdelay関数をHaskellから呼出☆ C言語のdelay関数をHaskellから呼出☆ C言語のdelay関数をHaskellから呼出☆ C言語のdelay関数をHaskellから呼出
-- File: hs_src/Delay.hs
module Delay where
foreign import ccall "c_extern.h delay" delay :: Int -> IO ()
-- File: hs_src/Delay.hs
module Delay where
foreign import ccall "c_extern.h delay" delay :: Int -> IO ()
-- File: hs_src/Delay.hs
module Delay where
foreign import ccall "c_extern.h delay" delay :: Int -> IO ()
-- File: hs_src/Delay.hs
module Delay where
foreign import ccall "c_extern.h delay" delay :: Int -> IO ()
-- File: hs_src/Delay.hs
module Delay where
foreign import ccall "c_extern.h delay" delay :: Int -> IO ()
43. LED操作 #1LED操作 #1LED操作 #1LED操作 #1LED操作 #1
-- File: hs_src/Led.hs (つづく)
module Led where
import Data.Word
import Data.Bits
import Foreign.Ptr
import Foreign.Storable
foreign import ccall "c_extern.h &jhc_zeroAddress"
c_jhc_zeroAddress32 :: Ptr Word32
addr_LPC_GPIO_BASE, addr_LPC_GPIO1_BASE, addr_FIODIR,
addr_FIOPIN :: Ptr Word32
addr_LPC_GPIO_BASE = c_jhc_zeroAddress32 `plusPtr` 0x2009C000
addr_LPC_GPIO1_BASE = addr_LPC_GPIO_BASE `plusPtr` 0x00020
addr_FIODIR = addr_LPC_GPIO1_BASE
addr_FIOPIN = addr_LPC_GPIO1_BASE `plusPtr` (4 + 4 * 3 + 4)
-- File: hs_src/Led.hs (つづく)
module Led where
import Data.Word
import Data.Bits
import Foreign.Ptr
import Foreign.Storable
foreign import ccall "c_extern.h &jhc_zeroAddress"
c_jhc_zeroAddress32 :: Ptr Word32
addr_LPC_GPIO_BASE, addr_LPC_GPIO1_BASE, addr_FIODIR,
addr_FIOPIN :: Ptr Word32
addr_LPC_GPIO_BASE = c_jhc_zeroAddress32 `plusPtr` 0x2009C000
addr_LPC_GPIO1_BASE = addr_LPC_GPIO_BASE `plusPtr` 0x00020
addr_FIODIR = addr_LPC_GPIO1_BASE
addr_FIOPIN = addr_LPC_GPIO1_BASE `plusPtr` (4 + 4 * 3 + 4)
-- File: hs_src/Led.hs (つづく)
module Led where
import Data.Word
import Data.Bits
import Foreign.Ptr
import Foreign.Storable
foreign import ccall "c_extern.h &jhc_zeroAddress"
c_jhc_zeroAddress32 :: Ptr Word32
addr_LPC_GPIO_BASE, addr_LPC_GPIO1_BASE, addr_FIODIR,
addr_FIOPIN :: Ptr Word32
addr_LPC_GPIO_BASE = c_jhc_zeroAddress32 `plusPtr` 0x2009C000
addr_LPC_GPIO1_BASE = addr_LPC_GPIO_BASE `plusPtr` 0x00020
addr_FIODIR = addr_LPC_GPIO1_BASE
addr_FIOPIN = addr_LPC_GPIO1_BASE `plusPtr` (4 + 4 * 3 + 4)
-- File: hs_src/Led.hs (つづく)
module Led where
import Data.Word
import Data.Bits
import Foreign.Ptr
import Foreign.Storable
foreign import ccall "c_extern.h &jhc_zeroAddress"
c_jhc_zeroAddress32 :: Ptr Word32
addr_LPC_GPIO_BASE, addr_LPC_GPIO1_BASE, addr_FIODIR,
addr_FIOPIN :: Ptr Word32
addr_LPC_GPIO_BASE = c_jhc_zeroAddress32 `plusPtr` 0x2009C000
addr_LPC_GPIO1_BASE = addr_LPC_GPIO_BASE `plusPtr` 0x00020
addr_FIODIR = addr_LPC_GPIO1_BASE
addr_FIOPIN = addr_LPC_GPIO1_BASE `plusPtr` (4 + 4 * 3 + 4)
-- File: hs_src/Led.hs (つづく)
module Led where
import Data.Word
import Data.Bits
import Foreign.Ptr
import Foreign.Storable
foreign import ccall "c_extern.h &jhc_zeroAddress"
c_jhc_zeroAddress32 :: Ptr Word32
addr_LPC_GPIO_BASE, addr_LPC_GPIO1_BASE, addr_FIODIR,
addr_FIOPIN :: Ptr Word32
addr_LPC_GPIO_BASE = c_jhc_zeroAddress32 `plusPtr` 0x2009C000
addr_LPC_GPIO1_BASE = addr_LPC_GPIO_BASE `plusPtr` 0x00020
addr_FIODIR = addr_LPC_GPIO1_BASE
addr_FIOPIN = addr_LPC_GPIO1_BASE `plusPtr` (4 + 4 * 3 + 4)
44. LED操作 #2LED操作 #2LED操作 #2LED操作 #2LED操作 #2
-- File: hs_src/Led.hs (つづき)
led1, led2, led3, led4, ledAll :: Word32
led1 = 1 `shiftL` 18
led2 = 1 `shiftL` 20
led3 = 1 `shiftL` 21
led4 = 1 `shiftL` 23
ledAll = foldl (.|.) 0 [led1, led2, led3, led4]
initLeds :: IO ()
initLeds = poke addr_FIODIR ledAll
ledsOn :: [Word32] -> IO ()
ledsOn ls = poke addr_FIOPIN $ foldl (.|.) 0 ls
-- File: hs_src/Led.hs (つづき)
led1, led2, led3, led4, ledAll :: Word32
led1 = 1 `shiftL` 18
led2 = 1 `shiftL` 20
led3 = 1 `shiftL` 21
led4 = 1 `shiftL` 23
ledAll = foldl (.|.) 0 [led1, led2, led3, led4]
initLeds :: IO ()
initLeds = poke addr_FIODIR ledAll
ledsOn :: [Word32] -> IO ()
ledsOn ls = poke addr_FIOPIN $ foldl (.|.) 0 ls
-- File: hs_src/Led.hs (つづき)
led1, led2, led3, led4, ledAll :: Word32
led1 = 1 `shiftL` 18
led2 = 1 `shiftL` 20
led3 = 1 `shiftL` 21
led4 = 1 `shiftL` 23
ledAll = foldl (.|.) 0 [led1, led2, led3, led4]
initLeds :: IO ()
initLeds = poke addr_FIODIR ledAll
ledsOn :: [Word32] -> IO ()
ledsOn ls = poke addr_FIOPIN $ foldl (.|.) 0 ls
-- File: hs_src/Led.hs (つづき)
led1, led2, led3, led4, ledAll :: Word32
led1 = 1 `shiftL` 18
led2 = 1 `shiftL` 20
led3 = 1 `shiftL` 21
led4 = 1 `shiftL` 23
ledAll = foldl (.|.) 0 [led1, led2, led3, led4]
initLeds :: IO ()
initLeds = poke addr_FIODIR ledAll
ledsOn :: [Word32] -> IO ()
ledsOn ls = poke addr_FIOPIN $ foldl (.|.) 0 ls
-- File: hs_src/Led.hs (つづき)
led1, led2, led3, led4, ledAll :: Word32
led1 = 1 `shiftL` 18
led2 = 1 `shiftL` 20
led3 = 1 `shiftL` 21
led4 = 1 `shiftL` 23
ledAll = foldl (.|.) 0 [led1, led2, led3, led4]
initLeds :: IO ()
initLeds = poke addr_FIODIR ledAll
ledsOn :: [Word32] -> IO ()
ledsOn ls = poke addr_FIOPIN $ foldl (.|.) 0 ls
長いです。。。長いです。。。長いです。。。長いです。。。長いです。。。
あとで概要を説明します!あとで概要を説明します!あとで概要を説明します!あとで概要を説明します!あとで概要を説明します!
45. Haskellのmain関数Haskellのmain関数Haskellのmain関数Haskellのmain関数Haskellのmain関数
-- File: hs_src/Main.hs
import Control.Monad
import Data.Word
import Led
import Delay
main :: IO ()
main = do
initLeds
realmain
ledList :: [Word32]
ledList = [led1, led2, led3, led4]
realmain :: IO ()
realmain = forever $ do
ledsOn [] >> mydelay
ledsOn (take 1 ledList) >> mydelay
ledsOn (take 2 ledList) >> mydelay
ledsOn (take 3 ledList) >> mydelay
ledsOn (take 4 ledList) >> mydelay
where mydelay = delay 1000000
-- File: hs_src/Main.hs
import Control.Monad
import Data.Word
import Led
import Delay
main :: IO ()
main = do
initLeds
realmain
ledList :: [Word32]
ledList = [led1, led2, led3, led4]
realmain :: IO ()
realmain = forever $ do
ledsOn [] >> mydelay
ledsOn (take 1 ledList) >> mydelay
ledsOn (take 2 ledList) >> mydelay
ledsOn (take 3 ledList) >> mydelay
ledsOn (take 4 ledList) >> mydelay
where mydelay = delay 1000000
-- File: hs_src/Main.hs
import Control.Monad
import Data.Word
import Led
import Delay
main :: IO ()
main = do
initLeds
realmain
ledList :: [Word32]
ledList = [led1, led2, led3, led4]
realmain :: IO ()
realmain = forever $ do
ledsOn [] >> mydelay
ledsOn (take 1 ledList) >> mydelay
ledsOn (take 2 ledList) >> mydelay
ledsOn (take 3 ledList) >> mydelay
ledsOn (take 4 ledList) >> mydelay
where mydelay = delay 1000000
-- File: hs_src/Main.hs
import Control.Monad
import Data.Word
import Led
import Delay
main :: IO ()
main = do
initLeds
realmain
ledList :: [Word32]
ledList = [led1, led2, led3, led4]
realmain :: IO ()
realmain = forever $ do
ledsOn [] >> mydelay
ledsOn (take 1 ledList) >> mydelay
ledsOn (take 2 ledList) >> mydelay
ledsOn (take 3 ledList) >> mydelay
ledsOn (take 4 ledList) >> mydelay
where mydelay = delay 1000000
-- File: hs_src/Main.hs
import Control.Monad
import Data.Word
import Led
import Delay
main :: IO ()
main = do
initLeds
realmain
ledList :: [Word32]
ledList = [led1, led2, led3, led4]
realmain :: IO ()
realmain = forever $ do
ledsOn [] >> mydelay
ledsOn (take 1 ledList) >> mydelay
ledsOn (take 2 ledList) >> mydelay
ledsOn (take 3 ledList) >> mydelay
ledsOn (take 4 ledList) >> mydelay
where mydelay = delay 1000000
47. [7] Ajhcコンパイラの過去と未来[7] Ajhcコンパイラの過去と未来[7] Ajhcコンパイラの過去と未来[7] Ajhcコンパイラの過去と未来[7] Ajhcコンパイラの過去と未来
☆ Ajhcの開発をはじめて9ヶ月☆ Ajhcの開発をはじめて9ヶ月☆ Ajhcの開発をはじめて9ヶ月☆ Ajhcの開発をはじめて9ヶ月☆ Ajhcの開発をはじめて9ヶ月
☆ いろいろありました...☆ いろいろありました...☆ いろいろありました...☆ いろいろありました...☆ いろいろありました...
☆ 振り返りと今後の展望をざっくりと☆ 振り返りと今後の展望をざっくりと☆ 振り返りと今後の展望をざっくりと☆ 振り返りと今後の展望をざっくりと☆ 振り返りと今後の展望をざっくりと
48. これまでのAjhcコンパイラこれまでのAjhcコンパイラこれまでのAjhcコンパイラこれまでのAjhcコンパイラこれまでのAjhcコンパイラ
☆ ユーザーズマニュアルの翻訳☆ ユーザーズマニュアルの翻訳☆ ユーザーズマニュアルの翻訳☆ ユーザーズマニュアルの翻訳☆ ユーザーズマニュアルの翻訳
http://ajhc.metasepi.org/manual_ja.htmlhttp://ajhc.metasepi.org/manual_ja.htmlhttp://ajhc.metasepi.org/manual_ja.htmlhttp://ajhc.metasepi.org/manual_ja.htmlhttp://ajhc.metasepi.org/manual_ja.html
☆ Cortex-M3マイコンへの移植☆ Cortex-M3マイコンへの移植☆ Cortex-M3マイコンへの移植☆ Cortex-M3マイコンへの移植☆ Cortex-M3マイコンへの移植
https://github.com/ajhc/demo-cortex-m3https://github.com/ajhc/demo-cortex-m3https://github.com/ajhc/demo-cortex-m3https://github.com/ajhc/demo-cortex-m3https://github.com/ajhc/demo-cortex-m3
☆ 省メモリGC☆ 省メモリGC☆ 省メモリGC☆ 省メモリGC☆ 省メモリGC
☆ 再入可能とスレッドの実現☆ 再入可能とスレッドの実現☆ 再入可能とスレッドの実現☆ 再入可能とスレッドの実現☆ 再入可能とスレッドの実現
☆ ChibiOS/RT上でのHaskellスレッド☆ ChibiOS/RT上でのHaskellスレッド☆ ChibiOS/RT上でのHaskellスレッド☆ ChibiOS/RT上でのHaskellスレッド☆ ChibiOS/RT上でのHaskellスレッド
☆ mbed-rtos上でのTCP/IPプログラミング☆ mbed-rtos上でのTCP/IPプログラミング☆ mbed-rtos上でのTCP/IPプログラミング☆ mbed-rtos上でのTCP/IPプログラミング☆ mbed-rtos上でのTCP/IPプログラミング
49. Ajhcにまつわる発表資料Ajhcにまつわる発表資料Ajhcにまつわる発表資料Ajhcにまつわる発表資料Ajhcにまつわる発表資料
* "How do you like jhc?"
http://www.slideshare.net/master_q/20121216-jhc
* "What is Metasepi?"
http://www.slideshare.net/master_q/what-is-metasepi
* "HaskellではじめるCortex-M3組込みプログラミング"
http://www.slideshare.net/master_q/20130222-jhc-stm32
* "Ajhcコンパイラの押売りに来ました"
http://www.slideshare.net/master_q/20130422-ajhc-igarashi
* "Debianを用いたCortex-M3マイコン開発事例のご紹介"
http://www.slideshare.net/master_q/20130629-deb-cortexm3
* "組込向けHaskellコンパイラAjhc / POSIX依存から脱出しよう編"
http://www.slideshare.net/master_q/20130802-osc-kyotoajhc
* "組込Haskellとλカ娘本の紹介"
http://www.slideshare.net/master_q/20130825-nagoya-festival
* "組込向けHaskellコンパイラAjhc / mbedマイコンどうでしょう編"
http://www.slideshare.net/master_q/haskellajhc-mbed
* "How do you like jhc?"
http://www.slideshare.net/master_q/20121216-jhc
* "What is Metasepi?"
http://www.slideshare.net/master_q/what-is-metasepi
* "HaskellではじめるCortex-M3組込みプログラミング"
http://www.slideshare.net/master_q/20130222-jhc-stm32
* "Ajhcコンパイラの押売りに来ました"
http://www.slideshare.net/master_q/20130422-ajhc-igarashi
* "Debianを用いたCortex-M3マイコン開発事例のご紹介"
http://www.slideshare.net/master_q/20130629-deb-cortexm3
* "組込向けHaskellコンパイラAjhc / POSIX依存から脱出しよう編"
http://www.slideshare.net/master_q/20130802-osc-kyotoajhc
* "組込Haskellとλカ娘本の紹介"
http://www.slideshare.net/master_q/20130825-nagoya-festival
* "組込向けHaskellコンパイラAjhc / mbedマイコンどうでしょう編"
http://www.slideshare.net/master_q/haskellajhc-mbed
* "How do you like jhc?"
http://www.slideshare.net/master_q/20121216-jhc
* "What is Metasepi?"
http://www.slideshare.net/master_q/what-is-metasepi
* "HaskellではじめるCortex-M3組込みプログラミング"
http://www.slideshare.net/master_q/20130222-jhc-stm32
* "Ajhcコンパイラの押売りに来ました"
http://www.slideshare.net/master_q/20130422-ajhc-igarashi
* "Debianを用いたCortex-M3マイコン開発事例のご紹介"
http://www.slideshare.net/master_q/20130629-deb-cortexm3
* "組込向けHaskellコンパイラAjhc / POSIX依存から脱出しよう編"
http://www.slideshare.net/master_q/20130802-osc-kyotoajhc
* "組込Haskellとλカ娘本の紹介"
http://www.slideshare.net/master_q/20130825-nagoya-festival
* "組込向けHaskellコンパイラAjhc / mbedマイコンどうでしょう編"
http://www.slideshare.net/master_q/haskellajhc-mbed
* "How do you like jhc?"
http://www.slideshare.net/master_q/20121216-jhc
* "What is Metasepi?"
http://www.slideshare.net/master_q/what-is-metasepi
* "HaskellではじめるCortex-M3組込みプログラミング"
http://www.slideshare.net/master_q/20130222-jhc-stm32
* "Ajhcコンパイラの押売りに来ました"
http://www.slideshare.net/master_q/20130422-ajhc-igarashi
* "Debianを用いたCortex-M3マイコン開発事例のご紹介"
http://www.slideshare.net/master_q/20130629-deb-cortexm3
* "組込向けHaskellコンパイラAjhc / POSIX依存から脱出しよう編"
http://www.slideshare.net/master_q/20130802-osc-kyotoajhc
* "組込Haskellとλカ娘本の紹介"
http://www.slideshare.net/master_q/20130825-nagoya-festival
* "組込向けHaskellコンパイラAjhc / mbedマイコンどうでしょう編"
http://www.slideshare.net/master_q/haskellajhc-mbed
* "How do you like jhc?"
http://www.slideshare.net/master_q/20121216-jhc
* "What is Metasepi?"
http://www.slideshare.net/master_q/what-is-metasepi
* "HaskellではじめるCortex-M3組込みプログラミング"
http://www.slideshare.net/master_q/20130222-jhc-stm32
* "Ajhcコンパイラの押売りに来ました"
http://www.slideshare.net/master_q/20130422-ajhc-igarashi
* "Debianを用いたCortex-M3マイコン開発事例のご紹介"
http://www.slideshare.net/master_q/20130629-deb-cortexm3
* "組込向けHaskellコンパイラAjhc / POSIX依存から脱出しよう編"
http://www.slideshare.net/master_q/20130802-osc-kyotoajhc
* "組込Haskellとλカ娘本の紹介"
http://www.slideshare.net/master_q/20130825-nagoya-festival
* "組込向けHaskellコンパイラAjhc / mbedマイコンどうでしょう編"
http://www.slideshare.net/master_q/haskellajhc-mbed
50. Ajhcコンパイラの未来Ajhcコンパイラの未来Ajhcコンパイラの未来Ajhcコンパイラの未来Ajhcコンパイラの未来
☆ 内部仕様ドキュメント作成中☆ 内部仕様ドキュメント作成中☆ 内部仕様ドキュメント作成中☆ 内部仕様ドキュメント作成中☆ 内部仕様ドキュメント作成中
https://github.com/ajhc/ajhc-hacking-guidehttps://github.com/ajhc/ajhc-hacking-guidehttps://github.com/ajhc/ajhc-hacking-guidehttps://github.com/ajhc/ajhc-hacking-guidehttps://github.com/ajhc/ajhc-hacking-guide
☆ 型によるスレッド間状態共有☆ 型によるスレッド間状態共有☆ 型によるスレッド間状態共有☆ 型によるスレッド間状態共有☆ 型によるスレッド間状態共有
☆ GHCのライブラリを移植☆ GHCのライブラリを移植☆ GHCのライブラリを移植☆ GHCのライブラリを移植☆ GHCのライブラリを移植
☆ さらなる応用例の提案☆ さらなる応用例の提案☆ さらなる応用例の提案☆ さらなる応用例の提案☆ さらなる応用例の提案
☆ NetBSD kernelを型によって再設計☆ NetBSD kernelを型によって再設計☆ NetBSD kernelを型によって再設計☆ NetBSD kernelを型によって再設計☆ NetBSD kernelを型によって再設計
☆ Metasepi上でMetasepi開発を可能に☆ Metasepi上でMetasepi開発を可能に☆ Metasepi上でMetasepi開発を可能に☆ Metasepi上でMetasepi開発を可能に☆ Metasepi上でMetasepi開発を可能に
51. 宣伝:λカ娘に記事を書きませんか?宣伝:λカ娘に記事を書きませんか?宣伝:λカ娘に記事を書きませんか?宣伝:λカ娘に記事を書きませんか?宣伝:λカ娘に記事を書きませんか?
☆ 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/
☆ 関数型言語の同人誌☆ 関数型言語の同人誌☆ 関数型言語の同人誌☆ 関数型言語の同人誌☆ 関数型言語の同人誌
☆ HaskellとかOCamlとか圏論とか☆ HaskellとかOCamlとか圏論とか☆ HaskellとかOCamlとか圏論とか☆ HaskellとかOCamlとか圏論とか☆ HaskellとかOCamlとか圏論とか
☆ C84にはAjhcの解説記事を投稿しました☆ C84にはAjhcの解説記事を投稿しました☆ C84にはAjhcの解説記事を投稿しました☆ C84にはAjhcの解説記事を投稿しました☆ C84にはAjhcの解説記事を投稿しました
☆ 立ち読みしたい方は声かけて!☆ 立ち読みしたい方は声かけて!☆ 立ち読みしたい方は声かけて!☆ 立ち読みしたい方は声かけて!☆ 立ち読みしたい方は声かけて!
☆ Call For Articlesはイカ☆ Call For Articlesはイカ☆ Call For Articlesはイカ☆ Call For Articlesはイカ☆ Call For Articlesはイカ
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