SlideShare uma empresa Scribd logo
1 de 24
Baixar para ler offline
8-bit PIC マイコン用ネイティブコンパイラの作成
2015.2.25 Masayuki Takagi
Lisp Meet Up presented by Shibuya.lisp #25
© 2015 Masayuki Takagi
-2-
自己紹介
高木 雅之
cl-cuda : a library to use NVIDIA CUDA in Common Lisp
Common Lisp から CUDA を使うライブラリ。半年ほどまえに、ここで紹介しました。
仕事は?
先月に会社を設立。売上はまだないです >_<
Common Lisp
© 2015 Masayuki Takagi
-3-
8-bit PICマイコン向けネイティブコンパイラ:動機
これまで、まともにアセンブラを書いたことがなかったのです。
1月下旬:はじめての PIC マイコン
2月上旬:はじめてのアセンブラ
PIC マイコンをはじめて触りました。
PIC で何作ろう?PIC用のコンパイラ作ろう。
2月中旬:PIC 用のコンパイラ
© 2015 Masayuki Takagi
-4-
今日の話の流れ
そのあと、今回作った、PIC マイコン用のコンパイラについて説明します。
PIC マイコンについて
PIC マイコン用コンパイラについて
最初に、PIC マイコン自体について説明します。
© 2015 Masayuki Takagi
-5-
PIC マイコンとは?
いまだと Arduino とかありますが、PIC はそれより昔からよく使われています。
マイクロコントローラ
マイクロチップ・テクノロジー社
演算器、メモリ、発振回路、割り込み、タイマ、リセット、スリープなど
各種回路が1チップに。
今回使ったのは、一番小さな 8 ビット PIC。PIC12F683 や PIC16F630。
8ビット、16ビット、32ビット
© 2015 Masayuki Takagi
-6-
ピン
PIC12F683(8ピン) PIC16F630(14ピン)
VDD
 上2本(VDD, VSS)を電源に接続
 残り6本を IO に使用可能(HI/LOW)
 ただし、4番ピンは入力のみ
GP5
GP4
GP3
VSS
GP0
GP1
GP2
VDD VSS
RA5
RA4
RA3
RC5
RC4
RC3
RA0
RA1
RA2
RC0
RC1
RC2
 上2本(VDD, VSS)を電源に接続
 残り12本を IO に使用可能(HI/LOW)
 ただし、4番ピンは入力のみ
© 2015 Masayuki Takagi
-7-
PIC12F683
 プログラムメモリは、2K ワード
 SRAM は、128 バイト
 DDPROM は、256 バイト
© 2015 Masayuki Takagi
-8-
PIC12F683 デバイス概観
 ALU
 乗算器、FPU、16ビット演算器はない
 プログラムメモリとデータメモリ
 ハードウェアスタック
© 2015 Masayuki Takagi
-9-
メモリアーキテクチャ
 プログラムメモリとデータメモリが分離(ハーバード・アークテクチャ)
 プログラムメモリには、専用の機器でプログラムを書き込む
 プログラムからプログラムメモリを操作することはできない
データメモリプログラムメモリ
© 2015 Masayuki Takagi
-10-
プログラムメモリ
 プログラムメモリは 2048 ワード(000h-07FFh)
 プログラムは 0 番地から始まる
 4 番地は割り込み発生時にここにジャンプ
 ハードウェアスタックを持つ
 CALL 命令などで、戻り値アドレスが積まれる
© 2015 Masayuki Takagi
-11-
データメモリ
 データメモリは、SFR と GPR からなる
 SFR は、Special Function Registers
 GPR は、General Purpose Registers
 SFR は、CPU やその他機能の制御に使う
 残念なことに、番地により「バンク」を切り替え
なければならない
SFR
汎用
レジスタ
SFR
汎用
レジスタ
バンク0 バンク1
00h
20h
80h
A0h
BFh
7Fh
© 2015 Masayuki Takagi
-12-
スペシャル・ファンクション・レジスタ
 SFR は、CPU やその他機能の制御に使う
 STATUS は、バンク切替(RP0)、ゼロビット(Z)、キャリー
ビット(DC,C)など
 GPIOは、ピンの状態(High/Low)
 TRISIOは、ピンの入出力モード
 PCL と PCLATH は、プログラムカウンタ
 INTCON と IOC は、割り込みの有効/無効
© 2015 Masayuki Takagi
-13-
W レジスタ
 ALU は、W レジスタとデータメモリから
入力を受け付ける
 通常の CPU の「レジスタ」に相当
 ただし、1つしかない
W レジスタ レジスタ
データメモリ メモリ
EEPROM ストレージ
PIC マイコン 通常のCPU
記憶装置の対応
© 2015 Masayuki Takagi
-14-
内蔵発振回路
 発振回路を内蔵
 デフォルトの周波数は、4MHz ±1%
 1命令サイクル = 4クロック = 1μsec
© 2015 Masayuki Takagi
-15-
命令セット
ADDWF ANDWF CLRF CLRW COMF DECF
DECFSZ INCF INCFSZ IORWF MOVF MOVWF
NOP RLF RRF SUBWF SWAPF XORWF
BCF BSF BTFSC BTFSS ADDLW ANDLW
CALL CLRWDT GOTO IORLW MOVLW RETFIE
RETLW RETURN SLEEP SUBLW XORLW
 命令は35種類のみ。非常に簡単
 要する命令サイクルは、1サイクル(=1μsec@4MHz)
 ただし、CALLや条件分岐などは、2サイクル
© 2015 Masayuki Takagi
-16-
ちょっと面倒
 何をするにも、単一の W レジスタを要するので、ちょっと面倒
 データのムーブ(R0番地からR1番地へデータをコピー)
MOVF R0,W
MOVWF R1
END
 整数の加算(R0番地に 42 を加算)
MOVLW 42
ADDWF R0,F
END
© 2015 Masayuki Takagi
-17-
コンパイラの概要
 ホスト言語は、ML 系言語の本当に小さなサブセット
 ターゲット言語は、8-bit PIC マイコンのアセンブリ
 コンパイラ言語は、Common Lisp
 コンパイラの設計は、MinCaml を参考にした(MinCaml ですみません…)
© 2015 Masayuki Takagi
-18-
MinCaml とは?
 http://esumii.github.io/min-caml/
© 2015 Masayuki Takagi
-19-
構文
今回のコンパイラ MinCaml
定数
プリミティブ演算(+,-,*,/ など)
条件分岐 if e1 then e2 else e3
変数定義 let
変数の読み出し x
再帰関数定義 let rec
関数呼び出し e e1, …, en
組の作成 (e1, …, en)
配列の作成 Array.create e1 e2
組の読み出し let
配列の読み出し e1.(e2)
配列への書き込み e1.(e2) ← e3
定数
プリミティブ演算
条件分岐
変数定義
変数の読み出し
再帰関数定義(クロージャ不採用)
関数呼び出し
組は不採用
配列は不採用
SFRへの書き込み setreg
© 2015 Masayuki Takagi
-20-
コンパイルステージ
今回のコンパイラ MinCaml
字句解析
構文解析
型推論
K正規化
α変換
β簡約
ネストした let の簡約
インライン展開
不要定義削除
定数畳み込み
クロージャ変換
仮想マシンコード生成
即値最適化
レジスタ割当て
アセンブリ生成
(CommonLisp のリーダを使用)
(型は 8 ビット整数のみ)
K正規化
α変換
β簡約
ネストした let の簡約
(最適化はあとで)
クロージャ変換
仮想マシンコード生成
レジスタ割当て
アセンブリ生成
(最適化はあとで)
© 2015 Masayuki Takagi
-21-
呼び出し規約
 当初、ソフトウェアスタックに積んで渡していた
 間接アドレッシングが煩雑なため、方針変更
 入力用疑似レジスタ(I0-I7)、ローカル用疑似レジスタ(L0-L7)
 引数は、入力用レジスタに格納して、呼び出される関数に渡す
 関数は、ローカル用レジスタを自由に使える
 戻り値は、W レジスタに格納して返す
 関数呼び出し時に、「生きているレジスタ」をスタックに退避する
© 2015 Masayuki Takagi
-22-
クロージャを不採用とした理由
 クロージャには、間接アドレスへのジャンプが必要
 CALL 命令は、オペランドに即値のみ受け付ける
 間接アドレスへのジャンプは、プログラムカウンタへの書き込みで可能
 しかし、いろいろ面倒
 PCL と PCLATH
 戻りアドレスの計算
 戻りアドレスの管理(ハードウェアスタックを使えない)
 PCL の桁上がりの考慮
© 2015 Masayuki Takagi
-23-
API
 defpic
 defpicmacro
 pic-compile
 pic-disassemble
© 2015 Masayuki Takagi
-24-
サンプル - LED
(defpic init ()
(progn
(setreg :gpio #x0)
(setreg :cmcon0 #b00000111)
(setbank1)
(setreg :trisio #b00001000)
(setreg :ansel #x0)
(setreg :ioc #x0)
(setbank0)
(setreg :intcon #b00000000)))
(defpic main ()
(progn
(setreg :gpio #b00100000)
(mdelay 50)
(setreg :gpio #b00000000)
(mdelay 950)
(main)))
(defpic mdelay1 ()
(loop 52
0))
(defpicmacro mdelay (n)
(unless (<= 0 n 65535)
(error "The value ~S is invalid." n))
(multiple-value-bind (q r) (truncate n 256)
(if (= q 0)
`(loop ,r (mdelay1))
`(loop ,q (loop ,r (mdelay1))))))

Mais conteúdo relacionado

Mais procurados

関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPUTakuro Iizuka
 
Akka Stream x Kinesis at Shinjuku reactive meetup vol2
Akka Stream x Kinesis at Shinjuku reactive meetup vol2Akka Stream x Kinesis at Shinjuku reactive meetup vol2
Akka Stream x Kinesis at Shinjuku reactive meetup vol2Masaki Toyoshima
 
きつねさんでもわかるLlvm読書会 第2回
きつねさんでもわかるLlvm読書会 第2回きつねさんでもわかるLlvm読書会 第2回
きつねさんでもわかるLlvm読書会 第2回Tomoya Kawanishi
 
RcppEigen and SVD
RcppEigen and SVDRcppEigen and SVD
RcppEigen and SVDXiangze
 
ナウいAndroidセキュリティ
ナウいAndroidセキュリティナウいAndroidセキュリティ
ナウいAndroidセキュリティHiromu Yakura
 
CMSI計算科学技術特論A(9) 高速化チューニングとその関連技術2
CMSI計算科学技術特論A(9) 高速化チューニングとその関連技術2CMSI計算科学技術特論A(9) 高速化チューニングとその関連技術2
CMSI計算科学技術特論A(9) 高速化チューニングとその関連技術2Computational Materials Science Initiative
 
Adaptive optimization of JIT compiler
Adaptive optimization of JIT compilerAdaptive optimization of JIT compiler
Adaptive optimization of JIT compilernothingcosmos
 
あなたのScalaを爆速にする7つの方法(日本語版)
あなたのScalaを爆速にする7つの方法(日本語版)あなたのScalaを爆速にする7つの方法(日本語版)
あなたのScalaを爆速にする7つの方法(日本語版)x1 ichi
 
「FPGA 開発入門:FPGA を用いたエッジ AI の高速化手法を学ぶ」
「FPGA 開発入門:FPGA を用いたエッジ AI の高速化手法を学ぶ」「FPGA 開発入門:FPGA を用いたエッジ AI の高速化手法を学ぶ」
「FPGA 開発入門:FPGA を用いたエッジ AI の高速化手法を学ぶ」直久 住川
 

Mais procurados (12)

関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU
 
Akka Stream x Kinesis at Shinjuku reactive meetup vol2
Akka Stream x Kinesis at Shinjuku reactive meetup vol2Akka Stream x Kinesis at Shinjuku reactive meetup vol2
Akka Stream x Kinesis at Shinjuku reactive meetup vol2
 
きつねさんでもわかるLlvm読書会 第2回
きつねさんでもわかるLlvm読書会 第2回きつねさんでもわかるLlvm読書会 第2回
きつねさんでもわかるLlvm読書会 第2回
 
RcppEigen and SVD
RcppEigen and SVDRcppEigen and SVD
RcppEigen and SVD
 
Thinking in Cats
Thinking in CatsThinking in Cats
Thinking in Cats
 
ナウいAndroidセキュリティ
ナウいAndroidセキュリティナウいAndroidセキュリティ
ナウいAndroidセキュリティ
 
CMSI計算科学技術特論A(9) 高速化チューニングとその関連技術2
CMSI計算科学技術特論A(9) 高速化チューニングとその関連技術2CMSI計算科学技術特論A(9) 高速化チューニングとその関連技術2
CMSI計算科学技術特論A(9) 高速化チューニングとその関連技術2
 
20180728 halide-study
20180728 halide-study20180728 halide-study
20180728 halide-study
 
llvm入門
llvm入門llvm入門
llvm入門
 
Adaptive optimization of JIT compiler
Adaptive optimization of JIT compilerAdaptive optimization of JIT compiler
Adaptive optimization of JIT compiler
 
あなたのScalaを爆速にする7つの方法(日本語版)
あなたのScalaを爆速にする7つの方法(日本語版)あなたのScalaを爆速にする7つの方法(日本語版)
あなたのScalaを爆速にする7つの方法(日本語版)
 
「FPGA 開発入門:FPGA を用いたエッジ AI の高速化手法を学ぶ」
「FPGA 開発入門:FPGA を用いたエッジ AI の高速化手法を学ぶ」「FPGA 開発入門:FPGA を用いたエッジ AI の高速化手法を学ぶ」
「FPGA 開発入門:FPGA を用いたエッジ AI の高速化手法を学ぶ」
 

Destaque

闇魔術を触ってみた
闇魔術を触ってみた闇魔術を触ってみた
闇魔術を触ってみたSatoshi Sato
 
C++の話(本当にあった怖い話)
C++の話(本当にあった怖い話)C++の話(本当にあった怖い話)
C++の話(本当にあった怖い話)Yuki Tamura
 
エクストリームC++11/14プログラミング
エクストリームC++11/14プログラミングエクストリームC++11/14プログラミング
エクストリームC++11/14プログラミングegtra
 
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだconstexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだGenya Murakami
 
中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexprGenya Murakami
 
中3女子でもわかる constexpr
中3女子でもわかる constexpr中3女子でもわかる constexpr
中3女子でもわかる constexprGenya Murakami
 
C++ Template Metaprogramming
C++ Template MetaprogrammingC++ Template Metaprogramming
C++ Template MetaprogrammingAkira Takahashi
 
Template Meta Programming入門から応用まで
Template Meta Programming入門から応用までTemplate Meta Programming入門から応用まで
Template Meta Programming入門から応用までyoshihikoozaki5
 
C++でCプリプロセッサを作ったり速くしたりしたお話
C++でCプリプロセッサを作ったり速くしたりしたお話C++でCプリプロセッサを作ったり速くしたりしたお話
C++でCプリプロセッサを作ったり速くしたりしたお話Kinuko Yasuda
 
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14Ryo Suzuki
 
プログラムの処方箋~健康なコードと病んだコード
プログラムの処方箋~健康なコードと病んだコードプログラムの処方箋~健康なコードと病んだコード
プログラムの処方箋~健康なコードと病んだコードShigenori Sagawa
 
すごい constexpr たのしくレイトレ!
すごい constexpr たのしくレイトレ!すごい constexpr たのしくレイトレ!
すごい constexpr たのしくレイトレ!Genya Murakami
 
夜寝ていたら突然本番障害だと起こされて異世界に召還されたときに役に立つこと
夜寝ていたら突然本番障害だと起こされて異世界に召還されたときに役に立つこと夜寝ていたら突然本番障害だと起こされて異世界に召還されたときに役に立つこと
夜寝ていたら突然本番障害だと起こされて異世界に召還されたときに役に立つことkouzirou tenkubashi
 

Destaque (17)

闇魔術を触ってみた
闇魔術を触ってみた闇魔術を触ってみた
闇魔術を触ってみた
 
C++の話(本当にあった怖い話)
C++の話(本当にあった怖い話)C++の話(本当にあった怖い話)
C++の話(本当にあった怖い話)
 
C++の黒魔術
C++の黒魔術C++の黒魔術
C++の黒魔術
 
エクストリームC++11/14プログラミング
エクストリームC++11/14プログラミングエクストリームC++11/14プログラミング
エクストリームC++11/14プログラミング
 
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだconstexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
 
中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr
 
中3女子でもわかる constexpr
中3女子でもわかる constexpr中3女子でもわかる constexpr
中3女子でもわかる constexpr
 
C++ Template Metaprogramming
C++ Template MetaprogrammingC++ Template Metaprogramming
C++ Template Metaprogramming
 
Template Meta Programming入門から応用まで
Template Meta Programming入門から応用までTemplate Meta Programming入門から応用まで
Template Meta Programming入門から応用まで
 
More C++11
More C++11More C++11
More C++11
 
Boost.SIMD
Boost.SIMDBoost.SIMD
Boost.SIMD
 
C++でCプリプロセッサを作ったり速くしたりしたお話
C++でCプリプロセッサを作ったり速くしたりしたお話C++でCプリプロセッサを作ったり速くしたりしたお話
C++でCプリプロセッサを作ったり速くしたりしたお話
 
C++14 Overview
C++14 OverviewC++14 Overview
C++14 Overview
 
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14
 
プログラムの処方箋~健康なコードと病んだコード
プログラムの処方箋~健康なコードと病んだコードプログラムの処方箋~健康なコードと病んだコード
プログラムの処方箋~健康なコードと病んだコード
 
すごい constexpr たのしくレイトレ!
すごい constexpr たのしくレイトレ!すごい constexpr たのしくレイトレ!
すごい constexpr たのしくレイトレ!
 
夜寝ていたら突然本番障害だと起こされて異世界に召還されたときに役に立つこと
夜寝ていたら突然本番障害だと起こされて異世界に召還されたときに役に立つこと夜寝ていたら突然本番障害だと起こされて異世界に召還されたときに役に立つこと
夜寝ていたら突然本番障害だと起こされて異世界に召還されたときに役に立つこと
 

Semelhante a Lisp Meet Up #25, 8-bit PIC マイコン用ネイティブコンパイラの作成

IL2CPPに関する軽い話
IL2CPPに関する軽い話IL2CPPに関する軽い話
IL2CPPに関する軽い話Wooram Yang
 
LLILUM and TinyCLR OS
LLILUM and TinyCLR OSLLILUM and TinyCLR OS
LLILUM and TinyCLR OSAtomu Hidaka
 
rablについてざっくりだけ調べてみた #shinjukurb 新宿rb 41th
rablについてざっくりだけ調べてみた #shinjukurb 新宿rb 41thrablについてざっくりだけ調べてみた #shinjukurb 新宿rb 41th
rablについてざっくりだけ調べてみた #shinjukurb 新宿rb 41thKoichiro Sumi
 
私たちはRESTCONFでネットワーク自動化的に何が嬉しくなるのか考えてみた
私たちはRESTCONFでネットワーク自動化的に何が嬉しくなるのか考えてみた私たちはRESTCONFでネットワーク自動化的に何が嬉しくなるのか考えてみた
私たちはRESTCONFでネットワーク自動化的に何が嬉しくなるのか考えてみたakira6592
 
StrongLoopでサクっと始めるAPIエコノミー
StrongLoopでサクっと始めるAPIエコノミーStrongLoopでサクっと始めるAPIエコノミー
StrongLoopでサクっと始めるAPIエコノミーYUSUKE MORIZUMI
 
新しい Visual Studio & .NET と新時代のアーキテクチャ
新しい Visual Studio & .NET と新時代のアーキテクチャ新しい Visual Studio & .NET と新時代のアーキテクチャ
新しい Visual Studio & .NET と新時代のアーキテクチャ慎一 古賀
 
何が変わった? VisualWorks 8.0
何が変わった? VisualWorks 8.0何が変わった? VisualWorks 8.0
何が変わった? VisualWorks 8.0Masashi Umezawa
 
Final LINQ extensions III
Final LINQ extensions IIIFinal LINQ extensions III
Final LINQ extensions IIIKouji Matsui
 
MfcLightToolkit for small MFC apps
MfcLightToolkit for small MFC appsMfcLightToolkit for small MFC apps
MfcLightToolkit for small MFC appsTakaaki Suzuki
 
RxShowcase -for ignote & i-Jupiter-
RxShowcase -for ignote & i-Jupiter-RxShowcase -for ignote & i-Jupiter-
RxShowcase -for ignote & i-Jupiter-Takaaki Suzuki
 
Deploy TypeScript with CodePipeline in Fargate
Deploy TypeScript with CodePipeline in FargateDeploy TypeScript with CodePipeline in Fargate
Deploy TypeScript with CodePipeline in Fargatebitbank, Inc. Tokyo, Japan
 
Linq Expressions でつくるスクリプト言語
Linq Expressions でつくるスクリプト言語Linq Expressions でつくるスクリプト言語
Linq Expressions でつくるスクリプト言語Takahiro Yaota
 
Vivado hls勉強会4(axi4 master)
Vivado hls勉強会4(axi4 master)Vivado hls勉強会4(axi4 master)
Vivado hls勉強会4(axi4 master)marsee101
 
RubyKaigi Lightning Talks TwYM episode2
RubyKaigi Lightning Talks TwYM episode2RubyKaigi Lightning Talks TwYM episode2
RubyKaigi Lightning Talks TwYM episode2Kuniaki Igarashi
 
Mbed祭り 2017@春の新横浜 20170225 竹之下
Mbed祭り 2017@春の新横浜 20170225 竹之下Mbed祭り 2017@春の新横浜 20170225 竹之下
Mbed祭り 2017@春の新横浜 20170225 竹之下Koyo Takenoshita
 
WebRTC SFU Mediasoup Sample update
WebRTC SFU Mediasoup Sample updateWebRTC SFU Mediasoup Sample update
WebRTC SFU Mediasoup Sample updatemganeko
 
わんくま名古屋#36 (20150725) Windows 10 ユニバーサル Windows アプリ開発入門
わんくま名古屋#36 (20150725) Windows 10 ユニバーサル Windows アプリ開発入門わんくま名古屋#36 (20150725) Windows 10 ユニバーサル Windows アプリ開発入門
わんくま名古屋#36 (20150725) Windows 10 ユニバーサル Windows アプリ開発入門Yasuhiko Yamamoto
 

Semelhante a Lisp Meet Up #25, 8-bit PIC マイコン用ネイティブコンパイラの作成 (20)

IL2CPPに関する軽い話
IL2CPPに関する軽い話IL2CPPに関する軽い話
IL2CPPに関する軽い話
 
LLILUM and TinyCLR OS
LLILUM and TinyCLR OSLLILUM and TinyCLR OS
LLILUM and TinyCLR OS
 
concrete5×ec cube(武氏)スライドシェア用
concrete5×ec cube(武氏)スライドシェア用concrete5×ec cube(武氏)スライドシェア用
concrete5×ec cube(武氏)スライドシェア用
 
rablについてざっくりだけ調べてみた #shinjukurb 新宿rb 41th
rablについてざっくりだけ調べてみた #shinjukurb 新宿rb 41thrablについてざっくりだけ調べてみた #shinjukurb 新宿rb 41th
rablについてざっくりだけ調べてみた #shinjukurb 新宿rb 41th
 
私たちはRESTCONFでネットワーク自動化的に何が嬉しくなるのか考えてみた
私たちはRESTCONFでネットワーク自動化的に何が嬉しくなるのか考えてみた私たちはRESTCONFでネットワーク自動化的に何が嬉しくなるのか考えてみた
私たちはRESTCONFでネットワーク自動化的に何が嬉しくなるのか考えてみた
 
StrongLoopでサクっと始めるAPIエコノミー
StrongLoopでサクっと始めるAPIエコノミーStrongLoopでサクっと始めるAPIエコノミー
StrongLoopでサクっと始めるAPIエコノミー
 
新しい Visual Studio & .NET と新時代のアーキテクチャ
新しい Visual Studio & .NET と新時代のアーキテクチャ新しい Visual Studio & .NET と新時代のアーキテクチャ
新しい Visual Studio & .NET と新時代のアーキテクチャ
 
何が変わった? VisualWorks 8.0
何が変わった? VisualWorks 8.0何が変わった? VisualWorks 8.0
何が変わった? VisualWorks 8.0
 
Final LINQ extensions III
Final LINQ extensions IIIFinal LINQ extensions III
Final LINQ extensions III
 
MfcLightToolkit for small MFC apps
MfcLightToolkit for small MFC appsMfcLightToolkit for small MFC apps
MfcLightToolkit for small MFC apps
 
RxShowcase -for ignote & i-Jupiter-
RxShowcase -for ignote & i-Jupiter-RxShowcase -for ignote & i-Jupiter-
RxShowcase -for ignote & i-Jupiter-
 
Deploy TypeScript Application by CodePipeline
Deploy TypeScript Application by CodePipelineDeploy TypeScript Application by CodePipeline
Deploy TypeScript Application by CodePipeline
 
Deploy TypeScript with CodePipeline in Fargate
Deploy TypeScript with CodePipeline in FargateDeploy TypeScript with CodePipeline in Fargate
Deploy TypeScript with CodePipeline in Fargate
 
Linq Expressions でつくるスクリプト言語
Linq Expressions でつくるスクリプト言語Linq Expressions でつくるスクリプト言語
Linq Expressions でつくるスクリプト言語
 
Vivado hls勉強会4(axi4 master)
Vivado hls勉強会4(axi4 master)Vivado hls勉強会4(axi4 master)
Vivado hls勉強会4(axi4 master)
 
RubyKaigi Lightning Talks TwYM episode2
RubyKaigi Lightning Talks TwYM episode2RubyKaigi Lightning Talks TwYM episode2
RubyKaigi Lightning Talks TwYM episode2
 
Netmf-180224
Netmf-180224Netmf-180224
Netmf-180224
 
Mbed祭り 2017@春の新横浜 20170225 竹之下
Mbed祭り 2017@春の新横浜 20170225 竹之下Mbed祭り 2017@春の新横浜 20170225 竹之下
Mbed祭り 2017@春の新横浜 20170225 竹之下
 
WebRTC SFU Mediasoup Sample update
WebRTC SFU Mediasoup Sample updateWebRTC SFU Mediasoup Sample update
WebRTC SFU Mediasoup Sample update
 
わんくま名古屋#36 (20150725) Windows 10 ユニバーサル Windows アプリ開発入門
わんくま名古屋#36 (20150725) Windows 10 ユニバーサル Windows アプリ開発入門わんくま名古屋#36 (20150725) Windows 10 ユニバーサル Windows アプリ開発入門
わんくま名古屋#36 (20150725) Windows 10 ユニバーサル Windows アプリ開発入門
 

Último

Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsWSO2
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルCRI Japan, Inc.
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Gamesatsushi061452
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptxsn679259
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...Toru Tamaki
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイスCRI Japan, Inc.
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video UnderstandingToru Tamaki
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 

Último (10)

Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 

Lisp Meet Up #25, 8-bit PIC マイコン用ネイティブコンパイラの作成

  • 1. 8-bit PIC マイコン用ネイティブコンパイラの作成 2015.2.25 Masayuki Takagi Lisp Meet Up presented by Shibuya.lisp #25
  • 2. © 2015 Masayuki Takagi -2- 自己紹介 高木 雅之 cl-cuda : a library to use NVIDIA CUDA in Common Lisp Common Lisp から CUDA を使うライブラリ。半年ほどまえに、ここで紹介しました。 仕事は? 先月に会社を設立。売上はまだないです >_< Common Lisp
  • 3. © 2015 Masayuki Takagi -3- 8-bit PICマイコン向けネイティブコンパイラ:動機 これまで、まともにアセンブラを書いたことがなかったのです。 1月下旬:はじめての PIC マイコン 2月上旬:はじめてのアセンブラ PIC マイコンをはじめて触りました。 PIC で何作ろう?PIC用のコンパイラ作ろう。 2月中旬:PIC 用のコンパイラ
  • 4. © 2015 Masayuki Takagi -4- 今日の話の流れ そのあと、今回作った、PIC マイコン用のコンパイラについて説明します。 PIC マイコンについて PIC マイコン用コンパイラについて 最初に、PIC マイコン自体について説明します。
  • 5. © 2015 Masayuki Takagi -5- PIC マイコンとは? いまだと Arduino とかありますが、PIC はそれより昔からよく使われています。 マイクロコントローラ マイクロチップ・テクノロジー社 演算器、メモリ、発振回路、割り込み、タイマ、リセット、スリープなど 各種回路が1チップに。 今回使ったのは、一番小さな 8 ビット PIC。PIC12F683 や PIC16F630。 8ビット、16ビット、32ビット
  • 6. © 2015 Masayuki Takagi -6- ピン PIC12F683(8ピン) PIC16F630(14ピン) VDD  上2本(VDD, VSS)を電源に接続  残り6本を IO に使用可能(HI/LOW)  ただし、4番ピンは入力のみ GP5 GP4 GP3 VSS GP0 GP1 GP2 VDD VSS RA5 RA4 RA3 RC5 RC4 RC3 RA0 RA1 RA2 RC0 RC1 RC2  上2本(VDD, VSS)を電源に接続  残り12本を IO に使用可能(HI/LOW)  ただし、4番ピンは入力のみ
  • 7. © 2015 Masayuki Takagi -7- PIC12F683  プログラムメモリは、2K ワード  SRAM は、128 バイト  DDPROM は、256 バイト
  • 8. © 2015 Masayuki Takagi -8- PIC12F683 デバイス概観  ALU  乗算器、FPU、16ビット演算器はない  プログラムメモリとデータメモリ  ハードウェアスタック
  • 9. © 2015 Masayuki Takagi -9- メモリアーキテクチャ  プログラムメモリとデータメモリが分離(ハーバード・アークテクチャ)  プログラムメモリには、専用の機器でプログラムを書き込む  プログラムからプログラムメモリを操作することはできない データメモリプログラムメモリ
  • 10. © 2015 Masayuki Takagi -10- プログラムメモリ  プログラムメモリは 2048 ワード(000h-07FFh)  プログラムは 0 番地から始まる  4 番地は割り込み発生時にここにジャンプ  ハードウェアスタックを持つ  CALL 命令などで、戻り値アドレスが積まれる
  • 11. © 2015 Masayuki Takagi -11- データメモリ  データメモリは、SFR と GPR からなる  SFR は、Special Function Registers  GPR は、General Purpose Registers  SFR は、CPU やその他機能の制御に使う  残念なことに、番地により「バンク」を切り替え なければならない SFR 汎用 レジスタ SFR 汎用 レジスタ バンク0 バンク1 00h 20h 80h A0h BFh 7Fh
  • 12. © 2015 Masayuki Takagi -12- スペシャル・ファンクション・レジスタ  SFR は、CPU やその他機能の制御に使う  STATUS は、バンク切替(RP0)、ゼロビット(Z)、キャリー ビット(DC,C)など  GPIOは、ピンの状態(High/Low)  TRISIOは、ピンの入出力モード  PCL と PCLATH は、プログラムカウンタ  INTCON と IOC は、割り込みの有効/無効
  • 13. © 2015 Masayuki Takagi -13- W レジスタ  ALU は、W レジスタとデータメモリから 入力を受け付ける  通常の CPU の「レジスタ」に相当  ただし、1つしかない W レジスタ レジスタ データメモリ メモリ EEPROM ストレージ PIC マイコン 通常のCPU 記憶装置の対応
  • 14. © 2015 Masayuki Takagi -14- 内蔵発振回路  発振回路を内蔵  デフォルトの周波数は、4MHz ±1%  1命令サイクル = 4クロック = 1μsec
  • 15. © 2015 Masayuki Takagi -15- 命令セット ADDWF ANDWF CLRF CLRW COMF DECF DECFSZ INCF INCFSZ IORWF MOVF MOVWF NOP RLF RRF SUBWF SWAPF XORWF BCF BSF BTFSC BTFSS ADDLW ANDLW CALL CLRWDT GOTO IORLW MOVLW RETFIE RETLW RETURN SLEEP SUBLW XORLW  命令は35種類のみ。非常に簡単  要する命令サイクルは、1サイクル(=1μsec@4MHz)  ただし、CALLや条件分岐などは、2サイクル
  • 16. © 2015 Masayuki Takagi -16- ちょっと面倒  何をするにも、単一の W レジスタを要するので、ちょっと面倒  データのムーブ(R0番地からR1番地へデータをコピー) MOVF R0,W MOVWF R1 END  整数の加算(R0番地に 42 を加算) MOVLW 42 ADDWF R0,F END
  • 17. © 2015 Masayuki Takagi -17- コンパイラの概要  ホスト言語は、ML 系言語の本当に小さなサブセット  ターゲット言語は、8-bit PIC マイコンのアセンブリ  コンパイラ言語は、Common Lisp  コンパイラの設計は、MinCaml を参考にした(MinCaml ですみません…)
  • 18. © 2015 Masayuki Takagi -18- MinCaml とは?  http://esumii.github.io/min-caml/
  • 19. © 2015 Masayuki Takagi -19- 構文 今回のコンパイラ MinCaml 定数 プリミティブ演算(+,-,*,/ など) 条件分岐 if e1 then e2 else e3 変数定義 let 変数の読み出し x 再帰関数定義 let rec 関数呼び出し e e1, …, en 組の作成 (e1, …, en) 配列の作成 Array.create e1 e2 組の読み出し let 配列の読み出し e1.(e2) 配列への書き込み e1.(e2) ← e3 定数 プリミティブ演算 条件分岐 変数定義 変数の読み出し 再帰関数定義(クロージャ不採用) 関数呼び出し 組は不採用 配列は不採用 SFRへの書き込み setreg
  • 20. © 2015 Masayuki Takagi -20- コンパイルステージ 今回のコンパイラ MinCaml 字句解析 構文解析 型推論 K正規化 α変換 β簡約 ネストした let の簡約 インライン展開 不要定義削除 定数畳み込み クロージャ変換 仮想マシンコード生成 即値最適化 レジスタ割当て アセンブリ生成 (CommonLisp のリーダを使用) (型は 8 ビット整数のみ) K正規化 α変換 β簡約 ネストした let の簡約 (最適化はあとで) クロージャ変換 仮想マシンコード生成 レジスタ割当て アセンブリ生成 (最適化はあとで)
  • 21. © 2015 Masayuki Takagi -21- 呼び出し規約  当初、ソフトウェアスタックに積んで渡していた  間接アドレッシングが煩雑なため、方針変更  入力用疑似レジスタ(I0-I7)、ローカル用疑似レジスタ(L0-L7)  引数は、入力用レジスタに格納して、呼び出される関数に渡す  関数は、ローカル用レジスタを自由に使える  戻り値は、W レジスタに格納して返す  関数呼び出し時に、「生きているレジスタ」をスタックに退避する
  • 22. © 2015 Masayuki Takagi -22- クロージャを不採用とした理由  クロージャには、間接アドレスへのジャンプが必要  CALL 命令は、オペランドに即値のみ受け付ける  間接アドレスへのジャンプは、プログラムカウンタへの書き込みで可能  しかし、いろいろ面倒  PCL と PCLATH  戻りアドレスの計算  戻りアドレスの管理(ハードウェアスタックを使えない)  PCL の桁上がりの考慮
  • 23. © 2015 Masayuki Takagi -23- API  defpic  defpicmacro  pic-compile  pic-disassemble
  • 24. © 2015 Masayuki Takagi -24- サンプル - LED (defpic init () (progn (setreg :gpio #x0) (setreg :cmcon0 #b00000111) (setbank1) (setreg :trisio #b00001000) (setreg :ansel #x0) (setreg :ioc #x0) (setbank0) (setreg :intcon #b00000000))) (defpic main () (progn (setreg :gpio #b00100000) (mdelay 50) (setreg :gpio #b00000000) (mdelay 950) (main))) (defpic mdelay1 () (loop 52 0)) (defpicmacro mdelay (n) (unless (<= 0 n 65535) (error "The value ~S is invalid." n)) (multiple-value-bind (q r) (truncate n 256) (if (= q 0) `(loop ,r (mdelay1)) `(loop ,q (loop ,r (mdelay1))))))