際際滷

際際滷Share a Scribd company logo
8-bit PIC マイコン喘ネイティブコンパイラの恬撹
2015.2.25 Masayuki Takagi
Lisp Meet Up presented by Shibuya.lisp #25
? 2015 Masayuki Takagi
-2-
徭失B初
互直 囘岻
cl-cuda : a library to use NVIDIA CUDA in Common Lisp
Common Lisp から CUDA を聞うライブラリ。磯定ほどまえに、ここでB初しました。
碧並は
枠埖に氏芙をO羨。喇呂呂泙世覆い任 >_<
Common Lisp
? 2015 Masayuki Takagi
-3-
8-bit PICマイコン鬚吋優ぅ謄ブコンパイラC
これまで、まともにアセンブラをいたことがなかったのです。
1埖和儁困呂犬瓩討 PIC マイコン
2埖貧儁困呂犬瓩討離▲札鵐屮
PIC マイコンをはじめて乾りました。
PIC で採恬ろうPIC喘のコンパイラ恬ろう。
2埖嶄儁PIC 喘のコンパイラ
? 2015 Masayuki Takagi
-4-
書晩のの送れ
そのあと、書指恬った、PIC マイコン喘のコンパイラについてh苧します。
PIC マイコンについて
PIC マイコン喘コンパイラについて
恷兜に、PIC マイコン徭悶についてh苧します。
? 2015 Masayuki Takagi
-5-
PIC マイコンとは
いまだと Arduino とかありますが、PIC はそれより劣からよく聞われています。
マイクロコントロ`ラ
マイクロチップ?テクノロジ`芙
處麻匂、メモリ、k尅指揃、護りzみ、タイマ、リセット、スリ`プなど
光N指揃が1チップに。
書指聞ったのは、匯桑弌さな 8 ビット PIC。PIC12F683 や PIC16F630。
8ビット、16ビット、32ビット
? 2015 Masayuki Takagi
-6-
ピン
PIC12F6838ピン PIC16F63014ピン
VDD
? 貧2云VDD, VSSを坿に俊A
? 火り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を坿に俊A
? 火り12云を IO に聞喘辛嬬HI/LOW
? ただし、4桑ピンは秘薦のみ
? 2015 Masayuki Takagi
-7-
PIC12F683
? プログラムメモリは、2K ワ`ド
? SRAM は、128 バイト
? DDPROM は、256 バイト
? 2015 Masayuki Takagi
-8-
PIC12F683 デバイス古Q
? ALU
? \麻匂、FPU、16ビット處麻匂はない
? プログラムメモリとデ`タメモリ
? ハ`ドウェアスタック
? 2015 Masayuki Takagi
-9-
メモリア`キテクチャ
? プログラムメモリとデ`タメモリが蛍x┘路`バ`ド?ア`クテクチャ
? プログラムメモリには、喘のC匂でプログラムをきzむ
? プログラムからプログラムメモリを荷恬することはできない
デ`タメモリプログラムメモリ
? 2015 Masayuki Takagi
-10-
プログラムメモリ
? プログラムメモリは 2048 ワ`ド000h-07FFh
? プログラムは 0 桑仇から兵まる
? 4 桑仇は護りzみk伏rにここにジャンプ
? ハ`ドウェアスタックを隔つ
? CALL 凋綜などで、り・▲疋譽垢eまれる
? 2015 Masayuki Takagi
-11-
デ`タメモリ
? デ`タメモリは、SFR と GPR からなる
? SFR は、Special Function Registers
? GPR は、General Purpose Registers
? SFR は、CPU やその麿C嬬の崙囮に聞う
? 火廷なことに、桑仇により仝バンク々を俳り紋え
なければならない
SFR
喘
レジスタ
SFR
喘
レジスタ
バンク0 バンク1
00h
20h
80h
A0h
BFh
7Fh
? 2015 Masayuki Takagi
-12-
スペシャル?ファンクション?レジスタ
? SFR は、CPU やその麿C嬬の崙囮に聞う
? STATUS は、バンク俳紋(RP0)、ゼロビット(Z)、キャリ`
ビット(DC,C)など
? GPIOは、ピンの彜BHigh/Low
? TRISIOは、ピンの秘竃薦モ`ド
? PCL と PCLATH は、プログラムカウンタ
? INTCON と IOC は、護りzみの嗤/o
? 2015 Masayuki Takagi
-13-
W レジスタ
? ALU は、W レジスタとデ`タメモリから
秘薦を鞭け原ける
? 宥械の CPU の仝レジスタ々に犁
? ただし、1つしかない
W レジスタ レジスタ
デ`タメモリ メモリ
EEPROM ストレ`ジ
PIC マイコン 宥械のCPU
廾崔の
? 2015 Masayuki Takagi
-14-
坪ik尅指揃
? k尅指揃を坪i
? デフォルトの巓襖方は、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
? 凋綜は35Nのみ。掲械にg
? 勣する凋綜サイクルは、1サイクル┌1μsec@4MHz
? ただし、CALLや訳周蛍瓷などは、2サイクル
? 2015 Masayuki Takagi
-16-
ちょっと中宜
? 採をするにも、g匯の W レジスタを勣するので、ちょっと中宜
? デ`タのム`ブR0桑仇からR1桑仇へデ`タをコピ`
MOVF R0,W
MOVWF R1
END
? 屁方の紗麻R0桑仇に 42 を紗麻
MOVLW 42
ADDWF R0,F
END
? 2015 Masayuki Takagi
-17-
コンパイラの古勣
? ホスト冱Zは、ML 狼冱Zの云輝に弌さなサブセット
? タ`ゲット冱Zは、8-bit PIC マイコンのアセンブリ
? コンパイラ冱Zは、Common Lisp
? コンパイラのOは、MinCaml を歌深にしたMinCaml ですみません´
? 2015 Masayuki Takagi
-18-
MinCaml とは
? http://esumii.github.io/min-caml/
? 2015 Masayuki Takagi
-19-
猟
書指のコンパイラ MinCaml
協方
プリミティブ處麻+,-,*,/ など
訳周蛍瓷 if e1 then e2 else e3
篳協x let
篳のiみ竃し x
壅「v方協x let rec
v方柵び竃し e e1, ´, en
Mの恬撹 (e1, ´, en)
塘双の恬撹 Array.create e1 e2
Mのiみ竃し let
塘双のiみ竃し e1.(e2)
塘双へのきzみ e1.(e2) ○ e3
協方
プリミティブ處麻
訳周蛍瓷
篳協x
篳のiみ竃し
壅「v方協x┘ロ`ジャ音駻達
v方柵び竃し
Mは音駻
塘双は音駻
SFRへのきzみ setreg
? 2015 Masayuki Takagi
-20-
コンパイルステ`ジ
書指のコンパイラ MinCaml
忖鞘盾裂
猟盾裂
侏容
K屎サ
αQ
βs
ネストした let のs
インライン婢_
音勣協x茅
協方みzみ
クロ`ジャQ
∀襯泪轡鵐芥`ド伏撹
軸ラ釼m晒
レジスタ護輝て
アセンブリ伏撹
CommonLisp のリ`ダを聞喘
侏は 8 ビット屁方のみ
K屎サ
αQ
βs
ネストした let のs
恷m晒はあとで
クロ`ジャQ
∀襯泪轡鵐芥`ド伏撹
レジスタ護輝て
アセンブリ伏撹
恷m晒はあとで
? 2015 Masayuki Takagi
-21-
柵び竃しシs
? 輝兜、ソフトウェアスタックにeんで局していた
? g俊アドレッシングがjなため、圭筝
? 秘薦喘夘貌レジスタI0-I7、ロ`カル喘夘貌レジスタL0-L7
? 哈方は、秘薦喘レジスタに鯉{して、柵び竃されるv方に局す
? v方は、ロ`カル喘レジスタを徭喇に聞える
? り、蓮W レジスタに鯉{して卦す
? v方柵び竃しrに、仝伏きているレジスタ々をスタックに曜閲する
? 2015 Masayuki Takagi
-22-
クロ`ジャを音駻辰箸靴神輦
? クロ`ジャには、g俊アドレスへのジャンプが駅勣
? CALL 凋綜は、オペランドに軸、里瀛椶姥兇韻
? g俊アドレスへのジャンプは、プログラムカウンタへのきzみで辛嬬
? しかし、いろいろ中宜
? 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))))))

More Related Content

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- 徭失B初 互直 囘岻 cl-cuda : a library to use NVIDIA CUDA in Common Lisp Common Lisp から CUDA を聞うライブラリ。磯定ほどまえに、ここでB初しました。 碧並は 枠埖に氏芙をO羨。喇呂呂泙世覆い任 >_< Common Lisp
  • 3. ? 2015 Masayuki Takagi -3- 8-bit PICマイコン鬚吋優ぅ謄ブコンパイラC これまで、まともにアセンブラをいたことがなかったのです。 1埖和儁困呂犬瓩討 PIC マイコン 2埖貧儁困呂犬瓩討離▲札鵐屮 PIC マイコンをはじめて乾りました。 PIC で採恬ろうPIC喘のコンパイラ恬ろう。 2埖嶄儁PIC 喘のコンパイラ
  • 4. ? 2015 Masayuki Takagi -4- 書晩のの送れ そのあと、書指恬った、PIC マイコン喘のコンパイラについてh苧します。 PIC マイコンについて PIC マイコン喘コンパイラについて 恷兜に、PIC マイコン徭悶についてh苧します。
  • 5. ? 2015 Masayuki Takagi -5- PIC マイコンとは いまだと Arduino とかありますが、PIC はそれより劣からよく聞われています。 マイクロコントロ`ラ マイクロチップ?テクノロジ`芙 處麻匂、メモリ、k尅指揃、護りzみ、タイマ、リセット、スリ`プなど 光N指揃が1チップに。 書指聞ったのは、匯桑弌さな 8 ビット PIC。PIC12F683 や PIC16F630。 8ビット、16ビット、32ビット
  • 6. ? 2015 Masayuki Takagi -6- ピン PIC12F6838ピン PIC16F63014ピン VDD ? 貧2云VDD, VSSを坿に俊A ? 火り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を坿に俊A ? 火り12云を IO に聞喘辛嬬HI/LOW ? ただし、4桑ピンは秘薦のみ
  • 7. ? 2015 Masayuki Takagi -7- PIC12F683 ? プログラムメモリは、2K ワ`ド ? SRAM は、128 バイト ? DDPROM は、256 バイト
  • 8. ? 2015 Masayuki Takagi -8- PIC12F683 デバイス古Q ? ALU ? \麻匂、FPU、16ビット處麻匂はない ? プログラムメモリとデ`タメモリ ? ハ`ドウェアスタック
  • 9. ? 2015 Masayuki Takagi -9- メモリア`キテクチャ ? プログラムメモリとデ`タメモリが蛍x┘路`バ`ド?ア`クテクチャ ? プログラムメモリには、喘のC匂でプログラムをきzむ ? プログラムからプログラムメモリを荷恬することはできない デ`タメモリプログラムメモリ
  • 10. ? 2015 Masayuki Takagi -10- プログラムメモリ ? プログラムメモリは 2048 ワ`ド000h-07FFh ? プログラムは 0 桑仇から兵まる ? 4 桑仇は護りzみk伏rにここにジャンプ ? ハ`ドウェアスタックを隔つ ? CALL 凋綜などで、り・▲疋譽垢eまれる
  • 11. ? 2015 Masayuki Takagi -11- デ`タメモリ ? デ`タメモリは、SFR と GPR からなる ? SFR は、Special Function Registers ? GPR は、General Purpose Registers ? SFR は、CPU やその麿C嬬の崙囮に聞う ? 火廷なことに、桑仇により仝バンク々を俳り紋え なければならない SFR 喘 レジスタ SFR 喘 レジスタ バンク0 バンク1 00h 20h 80h A0h BFh 7Fh
  • 12. ? 2015 Masayuki Takagi -12- スペシャル?ファンクション?レジスタ ? SFR は、CPU やその麿C嬬の崙囮に聞う ? STATUS は、バンク俳紋(RP0)、ゼロビット(Z)、キャリ` ビット(DC,C)など ? GPIOは、ピンの彜BHigh/Low ? TRISIOは、ピンの秘竃薦モ`ド ? PCL と PCLATH は、プログラムカウンタ ? INTCON と IOC は、護りzみの嗤/o
  • 13. ? 2015 Masayuki Takagi -13- W レジスタ ? ALU は、W レジスタとデ`タメモリから 秘薦を鞭け原ける ? 宥械の CPU の仝レジスタ々に犁 ? ただし、1つしかない W レジスタ レジスタ デ`タメモリ メモリ EEPROM ストレ`ジ PIC マイコン 宥械のCPU 廾崔の
  • 14. ? 2015 Masayuki Takagi -14- 坪ik尅指揃 ? k尅指揃を坪i ? デフォルトの巓襖方は、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 ? 凋綜は35Nのみ。掲械にg ? 勣する凋綜サイクルは、1サイクル┌1μsec@4MHz ? ただし、CALLや訳周蛍瓷などは、2サイクル
  • 16. ? 2015 Masayuki Takagi -16- ちょっと中宜 ? 採をするにも、g匯の W レジスタを勣するので、ちょっと中宜 ? デ`タのム`ブR0桑仇からR1桑仇へデ`タをコピ` MOVF R0,W MOVWF R1 END ? 屁方の紗麻R0桑仇に 42 を紗麻 MOVLW 42 ADDWF R0,F END
  • 17. ? 2015 Masayuki Takagi -17- コンパイラの古勣 ? ホスト冱Zは、ML 狼冱Zの云輝に弌さなサブセット ? タ`ゲット冱Zは、8-bit PIC マイコンのアセンブリ ? コンパイラ冱Zは、Common Lisp ? コンパイラのOは、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 篳協x let 篳のiみ竃し x 壅「v方協x let rec v方柵び竃し e e1, ´, en Mの恬撹 (e1, ´, en) 塘双の恬撹 Array.create e1 e2 Mのiみ竃し let 塘双のiみ竃し e1.(e2) 塘双へのきzみ e1.(e2) ○ e3 協方 プリミティブ處麻 訳周蛍瓷 篳協x 篳のiみ竃し 壅「v方協x┘ロ`ジャ音駻達 v方柵び竃し Mは音駻 塘双は音駻 SFRへのきzみ setreg
  • 20. ? 2015 Masayuki Takagi -20- コンパイルステ`ジ 書指のコンパイラ MinCaml 忖鞘盾裂 猟盾裂 侏容 K屎サ αQ βs ネストした let のs インライン婢_ 音勣協x茅 協方みzみ クロ`ジャQ ∀襯泪轡鵐芥`ド伏撹 軸ラ釼m晒 レジスタ護輝て アセンブリ伏撹 CommonLisp のリ`ダを聞喘 侏は 8 ビット屁方のみ K屎サ αQ βs ネストした let のs 恷m晒はあとで クロ`ジャQ ∀襯泪轡鵐芥`ド伏撹 レジスタ護輝て アセンブリ伏撹 恷m晒はあとで
  • 21. ? 2015 Masayuki Takagi -21- 柵び竃しシs ? 輝兜、ソフトウェアスタックにeんで局していた ? g俊アドレッシングがjなため、圭筝 ? 秘薦喘夘貌レジスタI0-I7、ロ`カル喘夘貌レジスタL0-L7 ? 哈方は、秘薦喘レジスタに鯉{して、柵び竃されるv方に局す ? v方は、ロ`カル喘レジスタを徭喇に聞える ? り、蓮W レジスタに鯉{して卦す ? v方柵び竃しrに、仝伏きているレジスタ々をスタックに曜閲する
  • 22. ? 2015 Masayuki Takagi -22- クロ`ジャを音駻辰箸靴神輦 ? クロ`ジャには、g俊アドレスへのジャンプが駅勣 ? CALL 凋綜は、オペランドに軸、里瀛椶姥兇韻 ? g俊アドレスへのジャンプは、プログラムカウンタへのきzみで辛嬬 ? しかし、いろいろ中宜 ? 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))))))