SlideShare une entreprise Scribd logo
1  sur  11
Télécharger pour lire hors ligne
HaskellではじめるCortex-M3  
HaskellではじめるCortex-M3
    組込みプログラミング
       組込みプログラミング

     Kiwamu Okabe
私は誰?
☆ Twitter: @master_q
☆ ミラクル・リナックス勤務
☆ 前はコピー機のOSをNetBSDで作ってた
☆ デジタルサイネージのソフト開発してます
☆ OSSに興味のある{エンジニア,インターン}
募集中です!
Haskell流行ってますよね!
でも何に使ってるの?
*   Attoparsec           - 高速パーサコンビネータ
*   Bluespec             - SystemVerilogとSystemCのツール実装に使ってる
*   Bump Technologies    - モバイル向け連絡先交換のサーバサイド
*   Gitit                - VCSバックエンドWiki
*   Gtk2hs               - Haskellから使えるGtkラッパ
*   Hakyll               - 静的Webサイト生成
*   Microsoft Research   - GHC(Haskellコンパイラ)の研究開発
*   Mighttpd             - nginxぐらい速いWebサーバ
*   Monadius             - グラディウスっぽいゲーム
*   Pandoc               - ドキュメントフォーマット変換
*   Qualcomm             - LuaのBREWバインディングジェネレータ
*   Standard Chartered   Bank - デリバティブリスク分析
*   Tsuru Capital        - 株式トレーディング
*   Yesod                - RailsっぽいWebアプリケーションフレームワーク


でもこれってみんなPOSIX APIの上でしか動
かせませんね...
小さい機器をHaskellで書きたい!
マイコンでLEDチカチカしてみましょう
☆ STBee Mini
☆ CPU: STM32 (Cortex-M3)
☆ クロック: 72MHz
☆ フラッシュROM: 128kB
☆ RAM: 20kB
そこでjhcコンパイラ
Haskellコードを食わせると
-- snip Imports --
foreign import ccall "c_extern.h Delay" c_delay :: Word32 -> IO ()

gpioPtr :: Ptr Word32
gpioPtr = odr
  where periphBase        = nullPtr          `plusPtr` 0x40000000
        arb2periphBase   = periphBase       `plusPtr` 0x10000
        gpioaBase        = arb2periphBase   `plusPtr` 0x0800
        odr              = gpioaBase        `plusPtr` 12

gpioOut :: Word32 -> IO ()
gpioOut v = do
  poke gpioPtr v
  c_delay 500000

main :: IO ()
main = forever   $ do
  gpioOut $ (1   `shiftL`   13)
  gpioOut $ (1   `shiftL`   13) .|. (1 `shiftL` 15)
  gpioOut $ (1   `shiftL`   15)
  gpioOut $ 0
C言語コードに変換してくれる!
static void A_STD
ftheMain(gc_t gc)
{
   fR$__fControl_Monad_forever__2:;
   { *((volatile uint32_t *)(1073809420)) =    1 << 13;
      saved_gc = gc;
      (void)Delay((uint32_t)500000);
      *((volatile uint32_t *)(1073809420)) =   (1 << 13) | (1 << 15);
      saved_gc = gc;
      (void)Delay((uint32_t)500000);
      *((volatile uint32_t *)(1073809420)) =   1 << 15;
      saved_gc = gc;
      (void)Delay((uint32_t)500000);
      *((volatile uint32_t *)(1073809420)) =   0;
      saved_gc = gc;
      (void)Delay((uint32_t)500000);
      goto fR$__fControl_Monad_forever__2;
   }
   return;
}
実機デモ
動画でご覧ください (1分50秒)
http://www.nicovideo.jp/watch/sm20143937
https://gitorious.org/metasepi/demo-cortex-m3/blobs/master/
demo_movie.avi
PR:HaskellでOSを作るプロジェクト
はじめました。
http://metasepi.masterq.net/
乞御期待!
参考資料
* 本デモのソースコード
  <https://gitorious.org/metasepi/demo-cortex-m3>

* Patch適用済みjhcソースコード
  <https://gitorious.org/metasepi/jhc-arafura>

* STM32マイコンボード 『STBee Mini』
  <http://strawberry-linux.com/catalog/items?code=32105>

Contenu connexe

Tendances

Tendances (20)

ゆるバグ
ゆるバグゆるバグ
ゆるバグ
 
セミコロンレスc++
セミコロンレスc++セミコロンレスc++
セミコロンレスc++
 
0622
06220622
0622
 
AVX-512(フォーマット)詳解
AVX-512(フォーマット)詳解AVX-512(フォーマット)詳解
AVX-512(フォーマット)詳解
 
Intel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgen
Intel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgenIntel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgen
Intel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgen
 
バックドア耐性のあるパスワード暗号化の提案
バックドア耐性のあるパスワード暗号化の提案バックドア耐性のあるパスワード暗号化の提案
バックドア耐性のあるパスワード暗号化の提案
 
pkgsrc とは何か? - よもやま話
pkgsrc とは何か? - よもやま話pkgsrc とは何か? - よもやま話
pkgsrc とは何か? - よもやま話
 
世界におけるKubernetes活用状況と企業向けプライベートクラウド基盤
世界におけるKubernetes活用状況と企業向けプライベートクラウド基盤世界におけるKubernetes活用状況と企業向けプライベートクラウド基盤
世界におけるKubernetes活用状況と企業向けプライベートクラウド基盤
 
BLS署名の実装とその応用
BLS署名の実装とその応用BLS署名の実装とその応用
BLS署名の実装とその応用
 
色々なOSSで競技プログラミング
色々なOSSで競技プログラミング色々なOSSで競技プログラミング
色々なOSSで競技プログラミング
 
世界におけるKubernetes活用状況と企業向けプライベートクラウド基盤
世界におけるKubernetes活用状況と企業向けプライベートクラウド基盤世界におけるKubernetes活用状況と企業向けプライベートクラウド基盤
世界におけるKubernetes活用状況と企業向けプライベートクラウド基盤
 
技適なBluetooth GNSS/GPSレシーバーをRaspberryPiで作りたい2
技適なBluetooth GNSS/GPSレシーバーをRaspberryPiで作りたい2技適なBluetooth GNSS/GPSレシーバーをRaspberryPiで作りたい2
技適なBluetooth GNSS/GPSレシーバーをRaspberryPiで作りたい2
 
20220412 IoTLT vol86 kitazaki v1
20220412 IoTLT vol86 kitazaki v120220412 IoTLT vol86 kitazaki v1
20220412 IoTLT vol86 kitazaki v1
 
golang binary hacks
golang binary hacksgolang binary hacks
golang binary hacks
 
Linux の hugepage の開発動向
Linux の hugepage の開発動向Linux の hugepage の開発動向
Linux の hugepage の開発動向
 
Pd Kai#3 Startup Process
Pd Kai#3 Startup ProcessPd Kai#3 Startup Process
Pd Kai#3 Startup Process
 
Trema day 1
Trema day 1Trema day 1
Trema day 1
 
Blenderde Qr Code
Blenderde Qr CodeBlenderde Qr Code
Blenderde Qr Code
 
Power Assert and perl.js
Power Assert and perl.jsPower Assert and perl.js
Power Assert and perl.js
 
1075: .NETからCUDAを使うひとつの方法
1075: .NETからCUDAを使うひとつの方法1075: .NETからCUDAを使うひとつの方法
1075: .NETからCUDAを使うひとつの方法
 

En vedette

En vedette (6)

ARM AAE - Memory Systems
ARM AAE - Memory SystemsARM AAE - Memory Systems
ARM AAE - Memory Systems
 
10 Tips for WeChat
10 Tips for WeChat10 Tips for WeChat
10 Tips for WeChat
 
The Presentation Come-Back Kid
The Presentation Come-Back KidThe Presentation Come-Back Kid
The Presentation Come-Back Kid
 
The Buyer's Journey - by Chris Lema
The Buyer's Journey - by Chris LemaThe Buyer's Journey - by Chris Lema
The Buyer's Journey - by Chris Lema
 
How to Build a Dynamic Social Media Plan
How to Build a Dynamic Social Media PlanHow to Build a Dynamic Social Media Plan
How to Build a Dynamic Social Media Plan
 
Learn BEM: CSS Naming Convention
Learn BEM: CSS Naming ConventionLearn BEM: CSS Naming Convention
Learn BEM: CSS Naming Convention
 

Similaire à HaskellではじめるCortex-M3組込みプログラミング

LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
Takeshi Yamamuro
 
Dive into RTS - another side
Dive into RTS - another sideDive into RTS - another side
Dive into RTS - another side
Kiwamu Okabe
 
関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU
Takuro Iizuka
 
スタート低レイヤー #0
スタート低レイヤー #0スタート低レイヤー #0
スタート低レイヤー #0
Kiwamu Okabe
 
「前回の COMSTAR ネタに刺激されてしまったので、オレも COMSTAR を使ってみた。」(仮)
「前回の COMSTAR ネタに刺激されてしまったので、オレも COMSTAR を使ってみた。」(仮)「前回の COMSTAR ネタに刺激されてしまったので、オレも COMSTAR を使ってみた。」(仮)
「前回の COMSTAR ネタに刺激されてしまったので、オレも COMSTAR を使ってみた。」(仮)
Kazuyuki Sato
 
tcpdumpとtcpreplayとtcprewriteと他。
tcpdumpとtcpreplayとtcprewriteと他。tcpdumpとtcpreplayとtcprewriteと他。
tcpdumpとtcpreplayとtcprewriteと他。
(^-^) togakushi
 
SDN Lab環境でのRobotFramework実践活用
SDN Lab環境でのRobotFramework実践活用SDN Lab環境でのRobotFramework実践活用
SDN Lab環境でのRobotFramework実践活用
Toshiki Tsuboi
 
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
Yasuhiro Ishii
 

Similaire à HaskellではじめるCortex-M3組込みプログラミング (20)

VHDL-2008が好きなんです
VHDL-2008が好きなんですVHDL-2008が好きなんです
VHDL-2008が好きなんです
 
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
 
Dive into RTS - another side
Dive into RTS - another sideDive into RTS - another side
Dive into RTS - another side
 
関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU
 
Halide による画像処理プログラミング入門
Halide による画像処理プログラミング入門Halide による画像処理プログラミング入門
Halide による画像処理プログラミング入門
 
Python physicalcomputing
Python physicalcomputingPython physicalcomputing
Python physicalcomputing
 
スタート低レイヤー #0
スタート低レイヤー #0スタート低レイヤー #0
スタート低レイヤー #0
 
「前回の COMSTAR ネタに刺激されてしまったので、オレも COMSTAR を使ってみた。」(仮)
「前回の COMSTAR ネタに刺激されてしまったので、オレも COMSTAR を使ってみた。」(仮)「前回の COMSTAR ネタに刺激されてしまったので、オレも COMSTAR を使ってみた。」(仮)
「前回の COMSTAR ネタに刺激されてしまったので、オレも COMSTAR を使ってみた。」(仮)
 
StackExchangeで見たシステムプログラミング案件
StackExchangeで見たシステムプログラミング案件StackExchangeで見たシステムプログラミング案件
StackExchangeで見たシステムプログラミング案件
 
あるブートローダの話
あるブートローダの話あるブートローダの話
あるブートローダの話
 
tcpdumpとtcpreplayとtcprewriteと他。
tcpdumpとtcpreplayとtcprewriteと他。tcpdumpとtcpreplayとtcprewriteと他。
tcpdumpとtcpreplayとtcprewriteと他。
 
Slide
SlideSlide
Slide
 
Polyphony の行く末(2018/3/3)
Polyphony の行く末(2018/3/3)Polyphony の行く末(2018/3/3)
Polyphony の行く末(2018/3/3)
 
PBL1-v1-008j.pptx
PBL1-v1-008j.pptxPBL1-v1-008j.pptx
PBL1-v1-008j.pptx
 
高速ネットワーク最新動向と具体例 (ENOG58 Meeting)
高速ネットワーク最新動向と具体例 (ENOG58 Meeting)高速ネットワーク最新動向と具体例 (ENOG58 Meeting)
高速ネットワーク最新動向と具体例 (ENOG58 Meeting)
 
SDN Lab環境でのRobotFramework実践活用
SDN Lab環境でのRobotFramework実践活用SDN Lab環境でのRobotFramework実践活用
SDN Lab環境でのRobotFramework実践活用
 
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
 
コンテナ情報交換会2
コンテナ情報交換会2コンテナ情報交換会2
コンテナ情報交換会2
 
A story of porting OpenBSD/luna88k
A story of porting OpenBSD/luna88kA story of porting OpenBSD/luna88k
A story of porting OpenBSD/luna88k
 
Prosym2012
Prosym2012Prosym2012
Prosym2012
 

HaskellではじめるCortex-M3組込みプログラミング