1.07k likes | 1.2k Views
先端ソフトウェア工学 II. スケジュール. 10/8,22,29,11/19,26: 組込みプログラミング 担当 宮本 10/15,11/5,11/12: 組込み信号処理 担当 岡田. 組込みシステムとは?. 組込みシステムの例 携帯電話 ゲーム機 ディジタル家電 車載機器(解釈によっては自動車そのもの) etc 定義 厳密な定義があるわけではなく、製品に組込まれている汎用ではないディジタルシステムのことを言う。. 組込みプログラミングの特色. 開発環境がクロスであることが多い OS の機能が制限されている ( 場合によっては無い )
E N D
スケジュール • 10/8,22,29,11/19,26:組込みプログラミング 担当 宮本 • 10/15,11/5,11/12:組込み信号処理 担当 岡田
組込みシステムとは? • 組込みシステムの例 • 携帯電話 • ゲーム機 • ディジタル家電 • 車載機器(解釈によっては自動車そのもの) • etc • 定義 • 厳密な定義があるわけではなく、製品に組込まれている汎用ではないディジタルシステムのことを言う。
組込みプログラミングの特色 • 開発環境がクロスであることが多い • OSの機能が制限されている(場合によっては無い) • プロセッサ周辺のデバイスを叩く必要があることが多い • スタートアップコードを書かなければならないこともある • リソースが制限されている
クロス開発とは? • 開発対象(ターゲット)と開発環境(ホスト)が異なる • 多くはバイナリ互換性も無い RS232CorEther
組込みシステムの開発手順 通常のアプリケーション 組込みシステム コーディング クロスコンパイル ダウンロード クロスデバッグ • コーディング • コンパイル • デバッグ
開発における考え方 • 目的を定める • 例)速度を向上するor電力を最小化する • 制約条件を調べる • 例)メモリサイズの制限 • 最適な実装方式の検討を行う • 例)最も支配的な処理の実装を効率化 • 仕様決定&コーディング トップダウンアプローチが必須
理解しなければならないこと • プロセッサの仕組み • 演算 • 制御 • ソフトウェアとハードウェアのインターフェース • オブジェクトコード • リンカ • ローダ • デバイスドライバ • スタートアップルーチン/BIOS • オペレーティングシステム(OS)
参考書 • コンピュータの構成と設計~ハードウエアとソフトウエアのインタフェース 第3版 (上) (単行本)デイビッド・A. パターソン(著), ジョン・L. ヘネシー(著), David A. Patterson(原著), John L. Hennessy(原著), 成田 光彰(翻訳)
プロセッサの構成要素 • プログラムカウンタ:命令の位置を保持 • レジスタ:データを保持 • メモリバス:命令・データの読み書き • メモリ:命令・データを保持 • 命令デコーダ:命令を解釈 • 算術論理演算器(ALU):演算を実行
プロセッサの基本的な構造 メモリ 0 メモリバス PC r0 r4 命令 デコーダ r1 r5 7 r2 r6 制御処理 r3 r7 ALU 演算処理 15
リセット メモリ 0 メモリバス 0 0 0 PC r0 r4 命令 デコーダ 0 0 r1 r5 7 0 0 r2 r6 制御処理 0 0 r3 r7 ALU 演算処理 15
0番地の命令のフェッチ メモリ 0 メモリバス 0 0 0 PC r0 r4 命令 デコーダ 0 0 r1 r5 7 0 0 r2 r6 制御処理 0 0 r3 r7 ALU 演算処理 15
命令実行&PCインクリメント メモリ 0 メモリバス 1 0 0 PC r0 r4 命令 デコーダ 0 0 r1 r5 7 0 0 r2 r6 制御処理 0 0 r3 r7 ALU 演算処理 15
命令実行&PCインクリメント メモリ 0 メモリバス 2 0 0 PC r0 r4 命令 デコーダ 0 0 r1 r5 7 0 0 r2 r6 制御処理 0 0 r3 r7 ALU 演算処理 15
命令実行&PCインクリメント メモリ 0 メモリバス 3 0 0 PC r0 r4 命令 デコーダ 0 0 r1 r5 7 0 0 r2 r6 制御処理 0 0 r3 r7 ALU 演算処理 15
命令実行&PCインクリメント メモリ 0 メモリバス 4 0 0 PC r0 r4 命令 デコーダ 0 0 r1 r5 7 0 0 r2 r6 制御処理 0 0 r3 r7 ALU 演算処理 15
分岐命令 メモリ 0 メモリバス 4 0 0 PC r0 r4 命令 デコーダ 0 0 r1 r5 7 0 0 r2 r6 制御処理 0 0 r3 r7 ALU 命令:PCに0を代入 演算処理 15
分岐命令 メモリ 0 メモリバス 0 0 0 PC r0 r4 命令 デコーダ 0 0 r1 r5 7 0 0 r2 r6 制御処理 0 0 r3 r7 ALU PCに0を代入 演算処理 15
0番地の命令のフェッチ メモリ 0 メモリバス 0 0 0 PC r0 r4 命令 デコーダ 0 0 r1 r5 7 0 0 r2 r6 制御処理 0 0 r3 r7 ALU 演算処理 15
ロード命令 メモリ 0 メモリバス 1 0 0 PC r0 r4 命令 デコーダ 0 0 r1 r5 7 0 0 r2 r6 制御処理 0 0 r3 r7 ALU 演算処理 15
ロード命令 メモリ 0 メモリバス 1 0 0 PC r0 r4 命令 デコーダ 0 0 r1 r5 7 0 0 r2 r6 制御処理 0 0 r3 r7 ALU 命令:r0に16番地のデータをロード 演算処理 15
ロード命令 メモリ 0 メモリバス 1 0 0 PC r0 r4 命令 デコーダ 0 0 r1 r5 7 0 0 r2 r6 制御処理 0 0 r3 r7 ALU 命令:r0に16番地のデータをロード 演算処理 15 1
ロード命令 メモリ 0 メモリバス 1 1 0 PC r0 r4 命令 デコーダ 0 0 r1 r5 7 0 0 r2 r6 制御処理 0 0 r3 r7 ALU 演算処理 15
命令実行&PCインクリメント メモリ 0 メモリバス 2 1 0 PC r0 r4 命令 デコーダ 0 0 r1 r5 7 0 0 r2 r6 制御処理 0 0 r3 r7 ALU 演算処理 15
命令実行&PCインクリメント メモリ 0 メモリバス 3 1 0 PC r0 r4 命令 デコーダ 0 0 r1 r5 7 0 0 r2 r6 制御処理 0 0 r3 r7 ALU 演算処理 15
ロード命令 メモリ 0 メモリバス 3 1 0 PC r0 r4 命令 デコーダ 0 0 r1 r5 7 0 0 r2 r6 制御処理 0 0 r3 r7 ALU 命令:r1に17番地のデータをロード 演算処理 15 2
命令実行&PCインクリメント メモリ 0 メモリバス 4 1 0 PC r0 r4 命令 デコーダ 2 0 r1 r5 7 0 0 r2 r6 制御処理 0 0 r3 r7 ALU 演算処理 15
命令実行&PCインクリメント メモリ 0 メモリバス 4 1 0 PC r0 r4 命令 デコーダ 2 0 r1 r5 7 0 0 r2 r6 制御処理 0 0 r3 r7 ALU 命令:r2にr0とr1を加えて代入 演算処理 15
命令実行&PCインクリメント メモリ 0 メモリバス 4 1 0 PC r0 r4 命令 デコーダ 2 0 r1 r5 7 3 0 r2 r6 制御処理 0 0 r3 r7 ALU 演算処理 15
アセンブリ言語 • MIPS アセンブリ言語による加算 • add a, b, c • 動作 • a=b+c • 減算 • sub a, b, c • 動作 • a=b-c オペランド
アセンブリ言語 • MIPS アセンブリ言語による加算 • add a, b, c • 動作 • a=b+c • 減算 • sub a, b, c • 動作 • a=b-c ディスティネーション オペランド
アセンブリ言語 • MIPS アセンブリ言語による加算 • add a, b, c • 動作 • a=b+c • 減算 • sub a, b, c • 動作 • a=b-c ソース オペランド
Cからアセンブリ言語への変換 • C コード • アセンブリコード a=b+c; d=a-e; add a,b,c sub d,a,e
Cからアセンブリ言語への変換 • C コード • アセンブリコード f=(g+h)-(i+j); add t0,g,h add t1,i,j sub f,t0,t1
メモリにある値をオペランドとした演算 • C コード • アセンブリコード g=h+A[8]; lw$t0,8($s3) add $s1,$s2,$t0 #h は$s2に格納 lw:1ワードをロードする命令 この場合、8+$s3のアドレスをロードする 今の例では32bitを考えているので1wordは32bit
lw メモリ 0 メモリバス lw$t0,8($s3) add $s1,$s2,$t0 0 0 0 PC s0 s4 命令 デコーダ 0 0 s1 s5 7 A[0] h 0 s2 t0 制御処理 A[1] A[2] 7 0 s3 t1 A[3] A[4] A[5] ALU A[6] A[7] 演算処理 15 A[8]
lw メモリ 0 メモリバス lw$t0,8($s3) add $s1,$s2,$t0 0 0 0 PC s0 s4 命令 デコーダ lw$t0,8($s3) 0 0 s1 s5 7 A[0] h 0 s2 t0 制御処理 A[1] A[2] 7 0 s3 t1 A[3] A[4] A[5] ALU A[6] A[7] 演算処理 15 A[8]
lw メモリ 0 メモリバス lw$t0,8($s3) add $s1,$s2,$t0 0 0 0 PC s0 s4 命令 デコーダ 0 0 s1 s5 7 A[0] h 0 s2 t0 制御処理 A[1] A[2] 7 0 s3 t1 A[3] A[4] A[5] ALU A[6] A[7] 演算処理 15 A[8]
lw メモリ 0 メモリバス lw$t0,8($s3) add $s1,$s2,$t0 0 0 0 PC s0 s4 命令 デコーダ 0 0 s1 s5 7 A[0] h A[8] s2 t0 制御処理 A[1] A[2] 7 0 s3 t1 A[3] A[4] A[5] ALU A[6] A[7] 演算処理 15 A[8]
add メモリ 0 メモリバス lw$t0,8($s3) add $s1,$s2,$t0 1 0 0 PC s0 s4 命令 デコーダ add $s1,$s2,$t0 0 0 s1 s5 7 A[0] h A[8] s2 t0 制御処理 A[1] A[2] 7 0 s3 t1 A[3] A[4] A[5] ALU A[6] A[7] 演算処理 15 A[8]
add メモリ 0 メモリバス lw$t0,8($s3) add $s1,$s2,$t0 1 0 0 PC s0 s4 命令 デコーダ add $s1,$s2,$t0 h+A[8] 0 s1 s5 7 A[0] h A[8] s2 t0 制御処理 A[1] A[2] 7 0 s3 t1 A[3] A[4] A[5] ALU A[6] A[7] 演算処理 15 A[8]
lw メモリ 0 メモリバス lw$t0,8($s3) add $s1,$s2,$t0 0 0 0 PC s0 s4 命令 デコーダ lw$t0,8($s3) 0 0 s1 s5 7 A[0] h 0 s2 t0 制御処理 A[1] A[2] 7 0 s3 t1 A[3] A[4] A[5] ALU A[6] A[7] 演算処理 15 A[8] ベースレジスタ オフセット
メモリのアドレス • 通常、多くのアーキテクチャではbyteつまり8bitを単位としてアドレスを表現する。 • 今までの図はワードアドレスとしては正しいがバイトアドレスとしては正しくない。MIPS32を仮定すると1word=32bit=4byte • 先のアセンブリコードは本来以下のようになる。 lw$t0,32($s3) add $s1,$s2,$t0 #h は$s2に格納
バイトアドレス メモリ 3 0 メモリバス PC r0 r4 命令 デコーダ r1 r5 31 28 r2 r6 制御処理 r3 r7 ALU 演算処理 63 60
ロードとストアが使用されるコード • C コード • アセンブリコード A[0]=h+A[8]; lw$t0,32($s3) add $t0,$s2,$t0 #h は$s2に格納 sw$t0,0($s3)
lw メモリ メモリバス 3 lw$t0,32($s3) 0 add $t0,$s2,$t0 sw$t0,0($s3) 0 0 0 PC s0 s4 命令 デコーダ 0 0 s1 s5 31 28 A[0] h 0 s2 t0 制御処理 A[1] A[2] 28 0 s3 t1 A[3] A[4] A[5] ALU A[6] A[7] 演算処理 60 63 A[8]