SlideShare uma empresa Scribd logo
1 de 51
Baixar para ler offline
組込向けHaskellコンパイラAjhc 
mbedマイコンどうでしょう編
組込向けHaskellコンパイラAjhc 
mbedマイコンどうでしょう編
組込向けHaskellコンパイラAjhc 
mbedマイコンどうでしょう編
組込向けHaskellコンパイラAjhc 
mbedマイコンどうでしょう編
組込向けHaskellコンパイラAjhc
mbedマイコンどうでしょう編
Kiwamu OkabeKiwamu OkabeKiwamu OkabeKiwamu OkabeKiwamu Okabe
私は誰?私は誰?私は誰?私は誰?私は誰?
☆ 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で
ようこそ、ピストル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コンパイラの過去と未来
[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
デモのハードウェア構成デモのハードウェア構成デモのハードウェア構成デモのハードウェア構成デモのハードウェア構成
アーキティクチャ: 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ホスト/デバイス, シリアル
デモのソフトウェア構成デモのソフトウェア構成デモのソフトウェア構成デモのソフトウェア構成デモのソフトウェア構成
デモのソースコードツリーデモのソースコードツリーデモのソースコードツリーデモのソースコードツリーデモのソースコードツリー
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
[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はフットプリントが小さく、
☆ 高速な実行バイナリを吐くらしい☆ 高速な実行バイナリを吐くらしい☆ 高速な実行バイナリを吐くらしい☆ 高速な実行バイナリを吐くらしい☆ 高速な実行バイナリを吐くらしい
☆ 組み込みに向いてるかも☆ 組み込みに向いてるかも☆ 組み込みに向いてるかも☆ 組み込みに向いてるかも☆ 組み込みに向いてるかも
どうして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を作るため
[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/
などなどなどなどなどなどなどなどなどなど
どうしてMetasepiが必要?どうしてMetasepiが必要?どうしてMetasepiが必要?どうしてMetasepiが必要?どうしてMetasepiが必要?
☆ LinuxやWindowsが既にあるのでは?☆ LinuxやWindowsが既にあるのでは?☆ LinuxやWindowsが既にあるのでは?☆ LinuxやWindowsが既にあるのでは?☆ LinuxやWindowsが既にあるのでは?
☆ しかし組込開発は苦しんでいる☆ しかし組込開発は苦しんでいる☆ しかし組込開発は苦しんでいる☆ しかし組込開発は苦しんでいる☆ しかし組込開発は苦しんでいる
☆ kernelをカスタマイズして使用☆ kernelをカスタマイズして使用☆ kernelをカスタマイズして使用☆ kernelをカスタマイズして使用☆ kernelをカスタマイズして使用
☆ kernelのランタイムエラー☆ kernelのランタイムエラー☆ kernelのランタイムエラー☆ kernelのランタイムエラー☆ kernelのランタイムエラー
☆ 再現することでさえ困難☆ 再現することでさえ困難☆ 再現することでさえ困難☆ 再現することでさえ困難☆ 再現することでさえ困難
既存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
☆ ところが社内開発は...☆ ところが社内開発は...☆ ところが社内開発は...☆ ところが社内開発は...☆ ところが社内開発は...
主開発からそれると品質急降下主開発からそれると品質急降下主開発からそれると品質急降下主開発からそれると品質急降下主開発からそれると品質急降下
型安全とは型安全とは型安全とは型安全とは型安全とは
☆ ランタイムエラーを少なくできる☆ ランタイムエラーを少なくできる☆ ランタイムエラーを少なくできる☆ ランタイムエラーを少なくできる☆ ランタイムエラーを少なくできる
☆ 参考:数理科学的バグ撲滅方法論のすすめ☆ 参考:数理科学的バグ撲滅方法論のすすめ☆ 参考:数理科学的バグ撲滅方法論のすすめ☆ 参考:数理科学的バグ撲滅方法論のすすめ☆ 参考:数理科学的バグ撲滅方法論のすすめ
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/
kernelにこそ型安全が必要kernelにこそ型安全が必要kernelにこそ型安全が必要kernelにこそ型安全が必要kernelにこそ型安全が必要
☆ ほとんどのkernelはC言語で設計される☆ ほとんどのkernelはC言語で設計される☆ ほとんどのkernelはC言語で設計される☆ ほとんどのkernelはC言語で設計される☆ ほとんどのkernelはC言語で設計される
☆ ユーザー空間でエラー → SEGV☆ ユーザー空間でエラー → SEGV☆ ユーザー空間でエラー → SEGV☆ ユーザー空間でエラー → SEGV☆ ユーザー空間でエラー → SEGV
☆ kernel空間でエラー → システム停止☆ kernel空間でエラー → システム停止☆ kernel空間でエラー → システム停止☆ kernel空間でエラー → システム停止☆ kernel空間でエラー → システム停止
☆ kernelの設計には細心の注意が必要☆ kernelの設計には細心の注意が必要☆ kernelの設計には細心の注意が必要☆ kernelの設計には細心の注意が必要☆ kernelの設計には細心の注意が必要
☆ C言語は安全なのか?☆ C言語は安全なのか?☆ C言語は安全なのか?☆ C言語は安全なのか?☆ C言語は安全なのか?
[4] OS開発向けコンパイラとは[4] OS開発向けコンパイラとは[4] OS開発向けコンパイラとは[4] OS開発向けコンパイラとは[4] OS開発向けコンパイラとは
☆ 強い型が使えてOSを作れるコンパイラは?☆ 強い型が使えてOSを作れるコンパイラは?☆ 強い型が使えてOSを作れるコンパイラは?☆ 強い型が使えてOSを作れるコンパイラは?☆ 強い型が使えてOSを作れるコンパイラは?
☆ C言語のような使い勝手が必要☆ C言語のような使い勝手が必要☆ C言語のような使い勝手が必要☆ C言語のような使い勝手が必要☆ C言語のような使い勝手が必要
☆ ないみたいなので作りましょう!☆ ないみたいなので作りましょう!☆ ないみたいなので作りましょう!☆ ないみたいなので作りましょう!☆ ないみたいなので作りましょう!
☆ スクラッチから作るのはツライ☆ スクラッチから作るのはツライ☆ スクラッチから作るのはツライ☆ スクラッチから作るのはツライ☆ スクラッチから作るのはツライ
☆ 要求に近いコンパイラはないかな?☆ 要求に近いコンパイラはないかな?☆ 要求に近いコンパイラはないかな?☆ 要求に近いコンパイラはないかな?☆ 要求に近いコンパイラはないかな?
POSIX外で使いやすいコンパイラPOSIX外で使いやすいコンパイラPOSIX外で使いやすいコンパイラPOSIX外で使いやすいコンパイラPOSIX外で使いやすいコンパイラ
各数値が小さいほどPOSIX APIへの依存度
が小さい
各数値が小さいほどPOSIX APIへの依存度
が小さい
各数値が小さいほどPOSIX APIへの依存度
が小さい
各数値が小さいほどPOSIX APIへの依存度
が小さい
各数値が小さいほどPOSIX APIへの依存度
が小さい
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
jhcはC言語への変換器jhcはC言語への変換器jhcはC言語への変換器jhcはC言語への変換器jhcはC言語への変換器
クロスコンパイルも簡単クロスコンパイルも簡単クロスコンパイルも簡単クロスコンパイルも簡単クロスコンパイルも簡単
実用化に辿りつくために実用化に辿りつくために実用化に辿りつくために実用化に辿りつくために実用化に辿りつくために
実行可能状態を維持しながら開発 (スナッチ)実行可能状態を維持しながら開発 (スナッチ)実行可能状態を維持しながら開発 (スナッチ)実行可能状態を維持しながら開発 (スナッチ)実行可能状態を維持しながら開発 (スナッチ)
[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で
もインストール可能になる予定です
使い方詳細使い方詳細使い方詳細使い方詳細使い方詳細
「Ajhcユーザーズマニュアル」「Ajhcユーザーズマニュアル」「Ajhcユーザーズマニュアル」「Ajhcユーザーズマニュアル」「Ajhcユーザーズマニュアル」
ajhc.metasepi.org/manual_ja.htmlajhc.metasepi.org/manual_ja.htmlajhc.metasepi.org/manual_ja.htmlajhc.metasepi.org/manual_ja.htmlajhc.metasepi.org/manual_ja.html
を読んでみてください!を読んでみてください!を読んでみてください!を読んでみてください!を読んでみてください!
[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つに分けようと思います
C言語の開発環境構築C言語の開発環境構築C言語の開発環境構築C言語の開発環境構築C言語の開発環境構築
まずベースとなるソースコードを入手しましょうまずベースとなるソースコードを入手しましょうまずベースとなるソースコードを入手しましょうまずベースとなるソースコードを入手しましょうまずベースとなるソースコードを入手しましょう
https://github.com/adamgreen/gcc4mbedhttps://github.com/adamgreen/gcc4mbedhttps://github.com/adamgreen/gcc4mbedhttps://github.com/adamgreen/gcc4mbedhttps://github.com/adamgreen/gcc4mbed
githubにmbedのC言語プロジェクトがあった
ので、これをベースに開発をはじめます
githubにmbedのC言語プロジェクトがあった
ので、これをベースに開発をはじめます
githubにmbedのC言語プロジェクトがあった
ので、これをベースに開発をはじめます
githubにmbedのC言語プロジェクトがあった
ので、これをベースに開発をはじめます
githubにmbedのC言語プロジェクトがあった
ので、これをベースに開発をはじめます
$ git clone https://github.com/adamgreen/gcc4mbed.git$ git clone https://github.com/adamgreen/gcc4mbed.git$ git clone https://github.com/adamgreen/gcc4mbed.git$ git clone https://github.com/adamgreen/gcc4mbed.git$ git clone https://github.com/adamgreen/gcc4mbed.git
ビルド手順を確認ビルド手順を確認ビルド手順を確認ビルド手順を確認ビルド手順を確認
クロスコンパイル環境構築クロスコンパイル環境構築クロスコンパイル環境構築クロスコンパイル環境構築クロスコンパイル環境構築
$ 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がコンパイル結果です
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
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
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
チカチカしました?チカチカしました?チカチカしました?チカチカしました?チカチカしました?
完成したC言語開発環境完成したC言語開発環境完成したC言語開発環境完成したC言語開発環境完成したC言語開発環境
Haskellの開発環境構築Haskellの開発環境構築Haskellの開発環境構築Haskellの開発環境構築Haskellの開発環境構築
☆ Haskellプロジェクトディレクトリを掘る☆ Haskellプロジェクトディレクトリを掘る☆ Haskellプロジェクトディレクトリを掘る☆ Haskellプロジェクトディレクトリを掘る☆ Haskellプロジェクトディレクトリを掘る
$ cd gcc4mbed/samples
$ cp -a Blink Haskell
$ cd Haskell
$ ls
main.c makefile
$ cd gcc4mbed/samples
$ cp -a Blink Haskell
$ cd Haskell
$ ls
main.c makefile
$ cd gcc4mbed/samples
$ cp -a Blink Haskell
$ cd Haskell
$ ls
main.c makefile
$ cd gcc4mbed/samples
$ cp -a Blink Haskell
$ cd Haskell
$ ls
main.c makefile
$ cd gcc4mbed/samples
$ cp -a Blink Haskell
$ cd Haskell
$ ls
main.c makefile
旧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
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のチューニングにもオプションが必要
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.
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
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あておわりました
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;
}
独自の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に設定してみました
通常用途ならたぶん十分です通常用途ならたぶん十分です通常用途ならたぶん十分です通常用途ならたぶん十分です通常用途ならたぶん十分です
雑多な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();
何もしない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
うんコンパイルできましたうんコンパイルできましたうんコンパイルできましたうんコンパイルできましたうんコンパイルできました
完成したHaskell開発環境完成したHaskell開発環境完成したHaskell開発環境完成したHaskell開発環境完成したHaskell開発環境
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 ()
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)
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
長いです。。。長いです。。。長いです。。。長いです。。。長いです。。。
あとで概要を説明します!あとで概要を説明します!あとで概要を説明します!あとで概要を説明します!あとで概要を説明します!
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
このHaskellコードはどう動く?このHaskellコードはどう動く?このHaskellコードはどう動く?このHaskellコードはどう動く?このHaskellコードはどう動く?
[7] Ajhcコンパイラの過去と未来[7] Ajhcコンパイラの過去と未来[7] Ajhcコンパイラの過去と未来[7] Ajhcコンパイラの過去と未来[7] Ajhcコンパイラの過去と未来
☆ Ajhcの開発をはじめて9ヶ月☆ Ajhcの開発をはじめて9ヶ月☆ Ajhcの開発をはじめて9ヶ月☆ Ajhcの開発をはじめて9ヶ月☆ Ajhcの開発をはじめて9ヶ月
☆ いろいろありました...☆ いろいろありました...☆ いろいろありました...☆ いろいろありました...☆ いろいろありました...
☆ 振り返りと今後の展望をざっくりと☆ 振り返りと今後の展望をざっくりと☆ 振り返りと今後の展望をざっくりと☆ 振り返りと今後の展望をざっくりと☆ 振り返りと今後の展望をざっくりと
これまでの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プログラミング
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
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開発を可能に
宣伝:λカ娘に記事を書きませんか?宣伝:λカ娘に記事を書きませんか?宣伝:λカ娘に記事を書きませんか?宣伝:λカ娘に記事を書きませんか?宣伝:λカ娘に記事を書きませんか?
☆ 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

Mais conteúdo relacionado

Mais procurados

How to debug a perl script using gdb
How to debug a perl script using gdbHow to debug a perl script using gdb
How to debug a perl script using gdbakirahiguchi
 
Web Operations and Perl kansai.pm#14
Web Operations and Perl kansai.pm#14Web Operations and Perl kansai.pm#14
Web Operations and Perl kansai.pm#14Masahiro Nagano
 
20131208 agile samuraibasecamp
20131208 agile samuraibasecamp20131208 agile samuraibasecamp
20131208 agile samuraibasecampHiroshi SHIBATA
 
mbedではじめる組み込みHaskellプログラミング
mbedではじめる組み込みHaskellプログラミングmbedではじめる組み込みHaskellプログラミング
mbedではじめる組み込みHaskellプログラミングKiwamu Okabe
 
minneで学ぶクラウド脳
minneで学ぶクラウド脳minneで学ぶクラウド脳
minneで学ぶクラウド脳Uchio Kondo
 
2017年春のPerl
2017年春のPerl2017年春のPerl
2017年春のPerlcharsbar
 
ocamloptの全体像
ocamloptの全体像ocamloptの全体像
ocamloptの全体像Kiwamu Okabe
 
php and sapi and zendengine2 and...
php and sapi and zendengine2 and...php and sapi and zendengine2 and...
php and sapi and zendengine2 and...do_aki
 

Mais procurados (10)

How to debug a perl script using gdb
How to debug a perl script using gdbHow to debug a perl script using gdb
How to debug a perl script using gdb
 
Web Operations and Perl kansai.pm#14
Web Operations and Perl kansai.pm#14Web Operations and Perl kansai.pm#14
Web Operations and Perl kansai.pm#14
 
20131208 agile samuraibasecamp
20131208 agile samuraibasecamp20131208 agile samuraibasecamp
20131208 agile samuraibasecamp
 
mbedではじめる組み込みHaskellプログラミング
mbedではじめる組み込みHaskellプログラミングmbedではじめる組み込みHaskellプログラミング
mbedではじめる組み込みHaskellプログラミング
 
minneで学ぶクラウド脳
minneで学ぶクラウド脳minneで学ぶクラウド脳
minneで学ぶクラウド脳
 
GraphQL入門
GraphQL入門GraphQL入門
GraphQL入門
 
2017年春のPerl
2017年春のPerl2017年春のPerl
2017年春のPerl
 
ocamloptの全体像
ocamloptの全体像ocamloptの全体像
ocamloptの全体像
 
php and sapi and zendengine2 and...
php and sapi and zendengine2 and...php and sapi and zendengine2 and...
php and sapi and zendengine2 and...
 
about Perl5.10
about Perl5.10about Perl5.10
about Perl5.10
 

Semelhante a 組込向けHaskellコンパイラAjhc / mbedマイコンどうでしょう編

組込向けHaskellコンパイラAjhc / POSIX依存から脱出しよう編
組込向けHaskellコンパイラAjhc / POSIX依存から脱出しよう編組込向けHaskellコンパイラAjhc / POSIX依存から脱出しよう編
組込向けHaskellコンパイラAjhc / POSIX依存から脱出しよう編Kiwamu Okabe
 
mbed+Haskellどうでしょう
mbed+Haskellどうでしょうmbed+Haskellどうでしょう
mbed+HaskellどうでしょうKiwamu Okabe
 
組込Haskellとλカ娘本の紹介
組込Haskellとλカ娘本の紹介組込Haskellとλカ娘本の紹介
組込Haskellとλカ娘本の紹介Kiwamu Okabe
 
ReVIEWとLibreOfficeとOMakeで本を書きましょう!
ReVIEWとLibreOfficeとOMakeで本を書きましょう!ReVIEWとLibreOfficeとOMakeで本を書きましょう!
ReVIEWとLibreOfficeとOMakeで本を書きましょう!Kiwamu Okabe
 
Apacheの展望とmod_perlの超絶技巧 #yapcasia
Apacheの展望とmod_perlの超絶技巧 #yapcasiaApacheの展望とmod_perlの超絶技巧 #yapcasia
Apacheの展望とmod_perlの超絶技巧 #yapcasia鉄次 尾形
 
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8y_taka_23
 
#upcamp '12 Hack-a-thon Result
#upcamp '12 Hack-a-thon Result#upcamp '12 Hack-a-thon Result
#upcamp '12 Hack-a-thon ResultKazuhiro Hishinuma
 
ザ・ドキュメント~うまくいかないNoSQL~
ザ・ドキュメント~うまくいかないNoSQL~ザ・ドキュメント~うまくいかないNoSQL~
ザ・ドキュメント~うまくいかないNoSQL~Akihiro Kuwano
 
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行コードの自動修正によって実現する、機能開発を止めないフレームワーク移行
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行gree_tech
 
第2回勉強会スライド
第2回勉強会スライド第2回勉強会スライド
第2回勉強会スライドkoturn 0;
 
高位合成ツールVivado hlsのopen cv対応
高位合成ツールVivado hlsのopen cv対応高位合成ツールVivado hlsのopen cv対応
高位合成ツールVivado hlsのopen cv対応marsee101
 
Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6Ransui Iso
 
Starting qt5beta at_raspberry_pi Qtnagoya#6
Starting qt5beta at_raspberry_pi Qtnagoya#6Starting qt5beta at_raspberry_pi Qtnagoya#6
Starting qt5beta at_raspberry_pi Qtnagoya#6Kazuo Asano (@kazuo_asa)
 
恋に落ちるデプロイツール
恋に落ちるデプロイツール恋に落ちるデプロイツール
恋に落ちるデプロイツールtotty jp
 
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発emasaka
 
2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料
2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料
2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料Yasutaka Hamada
 
tcpdump & xtrabackup @ MySQL Casual Talks #1
tcpdump & xtrabackup @ MySQL Casual Talks #1tcpdump & xtrabackup @ MySQL Casual Talks #1
tcpdump & xtrabackup @ MySQL Casual Talks #1Ryosuke IWANAGA
 
【学習メモ#1st】12ステップで作る組込みOS自作入門
【学習メモ#1st】12ステップで作る組込みOS自作入門【学習メモ#1st】12ステップで作る組込みOS自作入門
【学習メモ#1st】12ステップで作る組込みOS自作入門sandai
 

Semelhante a 組込向けHaskellコンパイラAjhc / mbedマイコンどうでしょう編 (20)

組込向けHaskellコンパイラAjhc / POSIX依存から脱出しよう編
組込向けHaskellコンパイラAjhc / POSIX依存から脱出しよう編組込向けHaskellコンパイラAjhc / POSIX依存から脱出しよう編
組込向けHaskellコンパイラAjhc / POSIX依存から脱出しよう編
 
mbed+Haskellどうでしょう
mbed+Haskellどうでしょうmbed+Haskellどうでしょう
mbed+Haskellどうでしょう
 
組込Haskellとλカ娘本の紹介
組込Haskellとλカ娘本の紹介組込Haskellとλカ娘本の紹介
組込Haskellとλカ娘本の紹介
 
ReVIEWとLibreOfficeとOMakeで本を書きましょう!
ReVIEWとLibreOfficeとOMakeで本を書きましょう!ReVIEWとLibreOfficeとOMakeで本を書きましょう!
ReVIEWとLibreOfficeとOMakeで本を書きましょう!
 
Apacheの展望とmod_perlの超絶技巧 #yapcasia
Apacheの展望とmod_perlの超絶技巧 #yapcasiaApacheの展望とmod_perlの超絶技巧 #yapcasia
Apacheの展望とmod_perlの超絶技巧 #yapcasia
 
らくちん Go言語
らくちん Go言語らくちん Go言語
らくちん Go言語
 
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
 
#upcamp '12 Hack-a-thon Result
#upcamp '12 Hack-a-thon Result#upcamp '12 Hack-a-thon Result
#upcamp '12 Hack-a-thon Result
 
ゆるかわPhp
ゆるかわPhpゆるかわPhp
ゆるかわPhp
 
ザ・ドキュメント~うまくいかないNoSQL~
ザ・ドキュメント~うまくいかないNoSQL~ザ・ドキュメント~うまくいかないNoSQL~
ザ・ドキュメント~うまくいかないNoSQL~
 
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行コードの自動修正によって実現する、機能開発を止めないフレームワーク移行
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行
 
第2回勉強会スライド
第2回勉強会スライド第2回勉強会スライド
第2回勉強会スライド
 
高位合成ツールVivado hlsのopen cv対応
高位合成ツールVivado hlsのopen cv対応高位合成ツールVivado hlsのopen cv対応
高位合成ツールVivado hlsのopen cv対応
 
Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6
 
Starting qt5beta at_raspberry_pi Qtnagoya#6
Starting qt5beta at_raspberry_pi Qtnagoya#6Starting qt5beta at_raspberry_pi Qtnagoya#6
Starting qt5beta at_raspberry_pi Qtnagoya#6
 
恋に落ちるデプロイツール
恋に落ちるデプロイツール恋に落ちるデプロイツール
恋に落ちるデプロイツール
 
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発
 
2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料
2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料
2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料
 
tcpdump & xtrabackup @ MySQL Casual Talks #1
tcpdump & xtrabackup @ MySQL Casual Talks #1tcpdump & xtrabackup @ MySQL Casual Talks #1
tcpdump & xtrabackup @ MySQL Casual Talks #1
 
【学習メモ#1st】12ステップで作る組込みOS自作入門
【学習メモ#1st】12ステップで作る組込みOS自作入門【学習メモ#1st】12ステップで作る組込みOS自作入門
【学習メモ#1st】12ステップで作る組込みOS自作入門
 

Último

論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 

Último (9)

論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 

組込向け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/ などなどなどなどなどなどなどなどなどなど
  • 11. どうしてMetasepiが必要?どうしてMetasepiが必要?どうしてMetasepiが必要?どうしてMetasepiが必要?どうしてMetasepiが必要? ☆ LinuxやWindowsが既にあるのでは?☆ LinuxやWindowsが既にあるのでは?☆ LinuxやWindowsが既にあるのでは?☆ LinuxやWindowsが既にあるのでは?☆ LinuxやWindowsが既にあるのでは? ☆ しかし組込開発は苦しんでいる☆ しかし組込開発は苦しんでいる☆ しかし組込開発は苦しんでいる☆ しかし組込開発は苦しんでいる☆ しかし組込開発は苦しんでいる ☆ kernelをカスタマイズして使用☆ kernelをカスタマイズして使用☆ kernelをカスタマイズして使用☆ kernelをカスタマイズして使用☆ kernelをカスタマイズして使用 ☆ kernelのランタイムエラー☆ kernelのランタイムエラー☆ kernelのランタイムエラー☆ kernelのランタイムエラー☆ kernelのランタイムエラー ☆ 再現することでさえ困難☆ 再現することでさえ困難☆ 再現することでさえ困難☆ 再現することでさえ困難☆ 再現することでさえ困難
  • 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/
  • 15. kernelにこそ型安全が必要kernelにこそ型安全が必要kernelにこそ型安全が必要kernelにこそ型安全が必要kernelにこそ型安全が必要 ☆ ほとんどのkernelはC言語で設計される☆ ほとんどのkernelはC言語で設計される☆ ほとんどのkernelはC言語で設計される☆ ほとんどのkernelはC言語で設計される☆ ほとんどのkernelはC言語で設計される ☆ ユーザー空間でエラー → SEGV☆ ユーザー空間でエラー → SEGV☆ ユーザー空間でエラー → SEGV☆ ユーザー空間でエラー → SEGV☆ ユーザー空間でエラー → SEGV ☆ kernel空間でエラー → システム停止☆ kernel空間でエラー → システム停止☆ kernel空間でエラー → システム停止☆ kernel空間でエラー → システム停止☆ kernel空間でエラー → システム停止 ☆ kernelの設計には細心の注意が必要☆ kernelの設計には細心の注意が必要☆ kernelの設計には細心の注意が必要☆ kernelの設計には細心の注意が必要☆ kernelの設計には細心の注意が必要 ☆ C言語は安全なのか?☆ C言語は安全なのか?☆ C言語は安全なのか?☆ C言語は安全なのか?☆ C言語は安全なのか?
  • 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つに分けようと思います
  • 25. C言語の開発環境構築C言語の開発環境構築C言語の開発環境構築C言語の開発環境構築C言語の開発環境構築 まずベースとなるソースコードを入手しましょうまずベースとなるソースコードを入手しましょうまずベースとなるソースコードを入手しましょうまずベースとなるソースコードを入手しましょうまずベースとなるソースコードを入手しましょう https://github.com/adamgreen/gcc4mbedhttps://github.com/adamgreen/gcc4mbedhttps://github.com/adamgreen/gcc4mbedhttps://github.com/adamgreen/gcc4mbedhttps://github.com/adamgreen/gcc4mbed githubにmbedのC言語プロジェクトがあった ので、これをベースに開発をはじめます githubにmbedのC言語プロジェクトがあった ので、これをベースに開発をはじめます githubにmbedのC言語プロジェクトがあった ので、これをベースに開発をはじめます githubにmbedのC言語プロジェクトがあった ので、これをベースに開発をはじめます githubにmbedのC言語プロジェクトがあった ので、これをベースに開発をはじめます $ git clone https://github.com/adamgreen/gcc4mbed.git$ git clone https://github.com/adamgreen/gcc4mbed.git$ git clone https://github.com/adamgreen/gcc4mbed.git$ git clone https://github.com/adamgreen/gcc4mbed.git$ git clone https://github.com/adamgreen/gcc4mbed.git
  • 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 チカチカしました?チカチカしました?チカチカしました?チカチカしました?チカチカしました?
  • 31. Haskellの開発環境構築Haskellの開発環境構築Haskellの開発環境構築Haskellの開発環境構築Haskellの開発環境構築 ☆ Haskellプロジェクトディレクトリを掘る☆ Haskellプロジェクトディレクトリを掘る☆ Haskellプロジェクトディレクトリを掘る☆ Haskellプロジェクトディレクトリを掘る☆ Haskellプロジェクトディレクトリを掘る $ cd gcc4mbed/samples $ cp -a Blink Haskell $ cd Haskell $ ls main.c makefile $ cd gcc4mbed/samples $ cp -a Blink Haskell $ cd Haskell $ ls main.c makefile $ cd gcc4mbed/samples $ cp -a Blink Haskell $ cd Haskell $ ls main.c makefile $ cd gcc4mbed/samples $ cp -a Blink Haskell $ cd Haskell $ ls main.c makefile $ cd gcc4mbed/samples $ cp -a Blink Haskell $ cd Haskell $ ls main.c makefile
  • 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