COREでやったイキリクソ電装講習第1回のスライドです
CORE 電装講習コンピュータのしくみsksat
View Slide
電装をちゃんと作るために考えるべきこと・マイコンがどう動いているか?・何で実装するか?・どのように開発するか?←今回はココ
マイコン・マインド・コントロール・マイクロ・コントローラ・まあ組み込み向けのコンピュータと思って大丈夫
マイコンの例・PIC・Arduino・mbed・Raspberry pi(マイコ...マイコン?)
マイコンができること・計算・他の部品に対するI/O
マイコンができること - 計算・1+2, 2.5-1.2・デジタル計算(内部的には全て2進数)・実数ではない・整数型は整数しか表現できない・小数は浮動小数点で表現する・表現できる範囲が決まっている(16bit整数は-32768〜32767)・誤差がある
マイコンができること - I/O・Input/Outputのこと・Input・センサの値の取得,ボタンやフライトピンの入力・Output・センサの設定,アクチュエータの駆動
マイコンの使い方センサセンサセンサ値よこせ!!!モータニクロム線
マイコンの使い方センサセンサセンサヘイお待ち!!!モータニクロム線
マイコンの使い方センサセンサセンサモータニクロム線(ほーん,なるほどね)
マイコンの使い方センサセンサセンサモータニクロム線オラッ動かんかい!!!
マイコンとPCの違い・別にやってることは変わらん・計算と入出力・用途が違うだけ・いわゆるコンピュータは汎用コンピュータってやつ・マイコンは組み込み用のもの・スペック低くて良い・必要なものだけ載っていればいい・やることやれりゃいい → 安い
コンピュータの構成要素・CPU・メモリ・外部装置
コンピュータの構成要素(余談)・は?マイコンでそんな部品見たことないが...・SoCってやつ・System On Chip・1つのチップに全部載ってる.べんり.
CPU・コンピュータの頭脳ってやつ・バカ・できること・計算・値のコピー・入出力
CPUの構成・制御装置・演算装置(計算するやつ)・レジスタ・少しだけ(32bitとか)データを覚えておける・高速・用途ごとに色々ある
メモリ・クソ遅い(レジスタと比べると)・大容量のデータを保存できる・揮発性(電源切るとデータも消える)・残したいデータはどうするか・外部の記憶装置(EEPROM, SDカード, ...)に保存する・通信する(他のモジュールに送る,地上局に無線で送る)
メモリの読み書き・メモリは住宅街みたいなもの・家にあたるのが記憶素子・「何番地の記憶素子さん,ちょっと1という値を覚えておいておくんなまし」・読む時も番地を指定する・番地のことを「アドレス」と呼ぶメモリアドレス0xffffffffアドレス0x00000000
プログラムの実行のしくみ1.プログラムを外部の記憶装置から読み込んでメモリに書き込む2.プログラムの現在実行している部分をメモリから読む3.読み込んだ命令を実行する4. 2に戻る(無限ループ)(兵庫県警こんにちは)
プログラムもデータ・コンピュータにとってはあらゆるものがデータ・プログラムも例外ではない・データは全部0と1・長いので大体16進数で表現する・こういうのをバイナリデータというこんなかんじ↓
機械語・プログラムは大量の命令の塊・これらの命令を機械語と呼ぶ
機械語赤枠で囲ったのが1つの命令
機械語の種類・メモリの読み書き・レジスタにメモリの値をコピー,メモリにレジスタの値をコピー, …・実行場所の変更・***番地にジャンプ,前の演算結果が等しかったらジャンプ, ...・算術命令・レジスタAとレジスタBを足した値をレジスタAに格納, …・入出力命令・「オラッ***センサから値を1byte読んでAレジスタに入れろ!!!」
機械語の実行・メモリ上に並んでいる機械語を順番に実行していく(OoO「オッそうだな」)・次に実行する命令のアドレスを保持するプログラム・カウンタがある・プログラム・カウンタもレジスタの一つ
機械語の実行メモリ命令1命令2命令3命令4命令5プログラム・カウンタ実行中:命令1内容:センサ値読み込み
機械語の実行メモリ命令1命令2命令3命令4命令5プログラム・カウンタ実行中:命令2内容:読んだ値を0と比較
機械語の実行メモリ命令1命令2命令3命令4命令5プログラム・カウンタ実行中:命令3内容:前回の演算が等しくなければ戻る
機械語の実行メモリ命令1命令2命令3命令4命令5プログラム・カウンタ実行中:命令4内容:メモリ書き込み
アーキテクチャの違い・CPUの種類によって機械語のフォーマットが異なる・PC用のプログラムのバイナリファイルをArduinoとかに突っ込んでも動かない・命令長にも色々ある・固定長:RISC・命令によって変わる:CISC(キモい)・まあRISCでもキモいやつはキモいけどx86よりは遥かにマシ
“プログラミング”とは?・CPUにやらせたいことを考える・どうにかしてそれを実行する機械語を作る
アセンブリ・人力でバイナリを書くのは難しい(まあそれはそれで面白いけど)・少しでも可読性を上げたい・そこでアセンブリ・機械語と一対一対応・アセンブリ言語とも呼ばれる
アセンブリとアセンブラ・アセンブリはただの文字列・CPUはアセンブリなんか読めない(バカなので)・アセンブラというソフトウェアを使う・一対一対応なので余裕アセンブリ(テキストファイル)アセンブラバイナリファイル(実行ファイル)
コンパイラ・アセンブリでも書くのめんどい・アセンブリはあくまで機械語と一対一対応・そこで考えられたのがコンパイラアセンブリ(テキストファイル)アセンブラバイナリファイル(実行ファイル)なんか人間が読みやすいやつコンパイラコンパイル アセンブル広義にはコンパイルとアセンブルを合わせてコンパイルと呼ぶ
プログラミング言語・プログラムを記述するための言語・アセンブリよりも抽象度が高い・「1+2*3」とか書ける・コンパイル型言語の場合,コンパイルして機械語を生成する
色々なプログラミング言語・C・C++・Java・Rust・Zen
C言語・OSを書くために作られためっちゃ歴史が長い言語・メモリを直接扱える(ポインタ)・全部自分でやらなきゃいけない・自分の足も容赦なく撃ち抜ける・アセンブリがある程度分かってるとコンパイラの気持ちになれる
C++・C言語を魔改造し根源に至ろうとしている言語・もちろん自分の足を撃てる・マルチパラダイム・色々な言語の良いところ取りしようとしてまだまだ爆進中・TMPできる!やったぜ(黒魔術)・C++03, C++11, C++14, C++17(最新リリース), C++20とかのバージョンがある・人権があるのはC++11から・C++17は正義
Java・生の機械語ではなくJVMをターゲットにした実行コードを生成する・JVMはJava系言語用の仮想マシン・JVMが動くならどんなマシン(アーキテクチャ, OS)上でも動作する・JVM系の言語は色々ある・OpenRocketはこれで書かれてる
Rust・最近出てきたシステムプログラミング言語・firefoxのMozillaが中心となって開発している・メモリアクセスとかをコンパイル時にチェックしてくれる・コンパイルが通れば勝ちみたいなところがある・結構良いらしいが学習コストも結構高い
Zen・Zigからforkしたシステムプログラミング言語・僕がインターンで行ってたconnectFreeで開発中・Cとの併用が可能・ちゃんとコンパイラが怒ってくれる・結構便利だった.OSとか低レイヤなもの書くならかなり良い・ワンチャンcfと共同でなんかできそう
手続き型プログラミング言語・C/C++とか,紹介したやつは全部これ・書いた順番に実行していく,みたいな認識でOK
関数型プログラミング言語・LISPとか・式を組み合わせていってプログラムを記述する・数学畑の人は馴染みやすいらしい
次回予告(?)・とりあえずC言語やります・次次回:Gitとか