CPUの割り込みって何?

CPUの割り込み(interrupt)という言葉がよく出てきますが、割り込みってなんでしょうか。

これはプログラミングの上で必要な知識なのですが、Windowsアプリケーションのようなものを作っている人にはあまりピンとこないと思います。

ある意味組み込み独特の概念かもしれません。

 

基本的にCPUはなにか処理を一生懸命やっているわけですが、その間にも周辺機器が通信をしたりAD変換したりいろいろやっているわけです。

他にもポートを監視したりもあります。

割り込みというものがないとどうなるかというと、CPUのメインルーチンの合間合間に「周辺機器の状態チェック」を入れないといけなくなります。

例えば、通信が終了したら1ms以内になにかしないといけないとしましょう。

そうすると、CPUのメインルーチンの中に1msの間隔で「通信終了チェック」という処理をしないといけなくなります。

考えてみればわかると思いますが、プログラムのあちこちに「通信処理チェック」を書くことになるので、プログラムが恐ろしく汚くなります。

その上、バグの原因にもなります。

さらにプログラムの実行速度が低下します。

周辺機器はたくさんあるので、すべての周辺機器の監視を短い間隔でやろうとするとCPUはほとんど他の作業ができなくなってしまうわけです。

 

そこであるのが「割り込み」です。

割り込みは「あるイベントが発生した時にこのサブルーチンを読んで欲しい」と登録しておく仕組みです。

これがあるとCPUはメインの処理に集中できます。

メインルーチンのあちこちに「周辺機器チェック」を書く必要もなくなります。

例えば、「UART通信が完了したらAというサブルーチンを読んで欲しい」と登録すると、

メインルーチンを処理している途中でUART通信が終了すると、メインルーチンの処理が停止して勝手にサブルーチンに移動します。

そしてサブルーチンが終わると何事もなかったかのようにメインルーチンに戻ってきます。

・CPUが余計なチェックしなくていいので処理が速い

・プログラムが汚くならない

・即座にサブルーチンが呼ばれるので、イベントに即時対応ができる

といいことずくめで、すばらしいのです。

 

このように割り込みというのは偉大な機能なんです。

 

以上、小田切でした。

CPUのスタンバイとかスリープってなんだ?(初心者向け)

CPU(MPU)には、スタンバイだとかスリープという機能があります。

言葉だけでもなんとなく、

「省電力の機能かな?」

と想像つくかもしれませんが、詳細はよくわからないという人が多いと思います。

 

まず、組み込みCPUもパワフルなCPUもそれなりに省電力の機能があります。

そして、それが特徴になっているCPUがあるくらいに、バリエーションが有ります。

「CPUを完全に止めて周辺機器だけ動かせます!」

「CPUも周辺機器も止めて、時計機能だけで動かして、一定間隔でCPUを起こすことが出来ます」

ぐらいは基本なので大抵のCPUができます。

変わったものになってくると、

「タッチセンサー機能だけを動かして、タッチセンサーを検知したらCPUを起こすことが出来ます」

「アナログ入力でCPUを起こすことが出来ます」

「電波で(ry)

みたいなものもあったりします。

 

すべてのCPUの説明なんてできないので、どのCPUでも大抵サポートしている機能について説明します。

 

・周辺機器の有効・無効

たとえば、音声の出力機能などの機能がついているとしても、それを有効・無効を切り替えられるのが普通です。

無効にすることでそのぶんの電力を節約できます。

大抵のCPU(MPU)内蔵周辺機器は無効にして電力節約できるものです。

 

・クロックの変更

水晶振動子などで生成したクロックをCPU内で倍率をかけて使用しています。

なので、倍率を変更することでCPUの速度を低速にすることが出来ます。

電力は速度(クロック数)に比例するので、これで簡単に電力落とせます。

 

・スリープ(SLEEP)

CPUのクロックを完全に止めてしまうので、CPUが完全に動作停止します。

外部からの割り込みか、内蔵周辺機器からの割り込み(時計機能など)で復帰します。

メモリは保持されます。

 

・スタンバイ(STANDBY)

CPUのクロックを完全に止めた上に、メモリ・レジスタまで全部消えます。

通電しているものの、ほとんど電源OFFと大差ない状態になります。

究極の省電力ですが、復帰後にプログラムを一から走らせないと駄目なので即座に復帰することが出来ません。

 

これぐらいを把握しておいて、あとはCPUごとのデータシートを参照するとだいたい分かるかと思います。

 

以上、小田切でした。

そもそもGPIOってなに?(初心者向け)

いままで説明で「GPIO」という言葉を普通に使っていましたが、初心者だと

「そもそもGPIOってなに?」

だと思いますので、今回簡単に説明したいと思います。

 

GPIO=General Purpose Input/Output

汎用のインプット・アウトプットです。

CPUには電源ピンやJTAG用・専用機能のための特殊ピンも多いですが、それ以外のほとんどはこのGPIO用のピンとなっています。

 

CPUのほとんどのピンがGPIOということからも、このGPIOが如何に重要なものかと分かるかと思います。

 

このGPIOは何ができるのでしょうか。

まず、入力と出力の機能があって、その機能は切り替え式です。

 

出力機能:

HIGH(ほぼ電源電圧)を出す。

LOW(ほぼ0V)を出す。

 

入力機能:

入ってきている電圧がHIGH/LOWのどちらかを判別する。

 

これだけです。

「これだけでなにができるんだ??」

と思うかもしれませんが、実はこれでなんでもできるんです。

 

出力にしてそのさきにLEDをつなげれば、LEDを点灯・消灯できます。

出力にしてそのさきにトランジスタなどをつなげれば、大電力が必要なモーターもコントロールできます。

もっといえば、高度な機能がないIC類、例えばモータードライバだとか電源ICなんていうのは、そのICのピンをHIGHにするかLOWにするかだけで動作ON・OFFが切り替わりますので、このGPIOだけで制御できてしまうわけです。

そういったICは状態出力もHIGH・LOWだけなので、それを入力モードにしたGPIOで受ければCPUで状態を判定できるわけです。

デジタル出力のセンサーとかも入力モードのGPIOで受ければいいわけです。

 

基本的にはデジタル回路はHIGH・LOWだけなので、実はこのGPIOだけで(原理的には)すべての事ができるんです。

ただし、GPIOでも(原理的にはできるけど)実際にやろうとすると難しいこともあります。

例えば、通信です。

UARTやSPIやI2Cなどの通信プロトコルは、CPUにその周辺機器が乗っていれば「◯◯のデータを送ってね」というだけで、周辺機器が勝手にデータを送ってくれて、送信が終わったら「送信終わったよ」と周辺機器が教えてきてくれます。

しかし、これをGPIOでやると、プログラムで全部操作しないといけないので、

「クロックのポートをHIGH出力にして、データ送信のポートをnbit目の状態にして、そして?us待ってからまたくクロックのポートをLOW出力にして・・・」

ということを全部やらないといけません。

これをやると、無理矢理なので遅い・CPUが他のことが出来ないという問題があるので、普通はこんなことはやりません。

(世の中にはGPIOで通信機能を実現しているものもないことはないです。特殊例ですが)

 

とまぁ、原理的にはデジタル系のことはなんでもできますが、唯一通信機能は苦手ということです。

逆に言うと、それ以外はほとんどなんでもできるので、これがないとなにもできません。

 

以上、小田切でした。

不揮発性メモリ、EEPROMとFLASHの使い分けは?

不揮発性メモリとして、EEPROMとFLASHメモリがあります。

最近ではソケットを設けてSDカードを使用したり、SDカードと電気的に互換があるeMMCというものを使う場合もあります。

まぁ、SDもeMMCもFLASHメモリなので、最終的には「EEPROMかFLASHメモリか」という問題に行き着きます。

電源を切っても保存しておきたいデータ、どっちに保存します?

 

答えは、データサイズと書き換え頻度によります。

 

まずEEPROM。

これは数kB~数十kB程度のラインナップが多いです。

EEPROMで数十Mなんて一般的ではありません。

容量は小さいのですが、1バイト単位または64バイト単位などで読み書きできます。

つかり、小回りがきくのです。

ちょっとしたデータ「MACアドレス」「設定値」みたいなものをEEPROMに入れる場合があります。

安くて、容量が小さくて、数バイト単位で書き換えができて便利だからです。

 

次、FLASHメモリ。

これはSDカードなどでわかるように、128GBみたいなどでかいサイズまであります。

容量は圧倒的ですが、小回りがききません。

基本的に読み書きは512バイト単位が一般的です。

1バイト書き換えるだけでも、

「512バイトをRAMに転送」→「CPUでRAM上のデータ編集」→「RAMからFLASHに512バイト転送」

という手順が必要になります。

しかも、実際にはFLASHメモリの中のブロック単位が512kBという場合もあるので、

外から書き込むのは512バイトでも、中ではメガ単位の読み書きが発生していることが有ります。

ということで、「書き込むとまれにすごく待たされる」ことがあったりします。

さらに、SDやeMMCではなくNANDFLASHをそのまま使うと、エラー訂正などをCPU側で処理する必要が出てきます。

ということで、大きなデータを保持するときにはFLASHを使用します。

 

こんな雰囲気でございます。

 

以上、小田切でした。

CPUのPORってなんのこと?

CPUにはいろんな用語が頻出します。

その中でもパット見わかりにくい単語「POR」。

これなんでしょう。

 

これは

Power  On Reset

の略語です。

 

読んで字のごとく、「電源ONリセット」です。

 

これの説明の前に、リセットの説明をしないといけません。

CPUをリセットするとすべてのレジスタに初期値が代入され、いつでも同じ状態になります。

つまり、いつどんな時でもリセットすれば「初期状態」になるわけです。

この機構があるからプログラムが正常に動作するのです。

毎回状態が変わっていたらプログラムの動作状況が変わってしまいます。

そのため、CPUの動作を開始する前には必ずリセットを掛けないといけません。

 

で、そのリセットをかけるためにはリセットピンを制御しないといけません。

通常、リセットピンはLにすることでリセットがかかりますので「電源を入れた後にリセットピンをLにして、しばらくしてからHにする」という動作が必要になります。

つまり、CPUとは別にリセットピンを制御するための機構が必要になります。

これはコンデンサや抵抗・ロジックICなどを組み合わせて作ることも出来ますし、専用のICを使うことも出来ます。

 

……でも、面倒だし、余計な部品が必要でコストも掛かるのでいやなんです。

ということで、最近のCPU(MPU)には、たいていPower On Resetという、電源がONになったら自分でリセットしてくれる便利な機能が入っています。

これですと、上記の回路が不要になるので楽なんです。

ただし、「POR」がないCPU(MPU)も世の中にはあります。

 

ということで、データシートを見るときにはPORをチェックしましょう。

ないと……ちょっと面倒ですよ。

 

以上、小田切でした。

長距離通信でよく使用される伝送方式

長距離通信(数メートル以上)になると、基板内で使用している通信方式(SPIなど)は完全に使用できなくなります。

というのも配線が長くなると配線に寄生容量が付いてしまって、大きな寄生容量を考慮していないこういった方式はアウトなわけです。

さらにノイズとかも問題になります。

(十分に配慮すれば使えるかもしれませんが、普通にやると問題出ます)

 

ということで、長距離通信では違う方式が使用されます。

基本的に工業チックなところで使用されるものを3つ紹介します。

 

◯RS-232C

昔はPCにもついていたアレです。

じつは今でもよく使います。

シングルエンド方式です。

 

◯RS-422

RS-232Cと違って、差動信号を使用します。

これにより、同相ノイズにより強くなります。

ただし、RXDに2本、TXDに2本使うので4本以上の信号が必要です。

 

◯RS-485

これも差動信号で伝送しますが、信号線が送受信共通になっていますので、

DATA+とDATAーの二本だけで双方向通信できます。

長距離配線すると配線も大変なので、RS-422よりRS-485のほうが好まれます。

送信も受信も同じ線を使うので、原理的にRS-422より速度が半分になりますが、それが問題なることはほとんどありません。

 

とまぁ、この3つ辺りを紹介しておきます。

ぶっちゃけると、このキーワードと「雰囲気」だけ知っておけば大丈夫です。

「へぇ、そんなものがあるんだ」と。

あとは実際に使う時に調べると、メーカなどで詳細説明資料を配っているのでそれを読めばOKです。

 

以上、手抜きな小田切でした。

基板内で主に使用される通信方式

ICや機器同士の通信にはさまざまな通信が使用されますが、とりあえず今回は基板内の通信に使用されるものを紹介したいと思います。

要は長距離通信を想定していない通信方式たちです。

 

ちなみに、これも初心者にはわかりにくいんですがどれも厳密に仕様があってそれを守っているようなものではありません。

「I2C」と言っても、実際に使われているのは「I2Cっぽいもの」です。

(CPUによっては「実質I2C」なのに「I2C」とすら呼ばれていない場合もあります)

元々どこかのメーカが開発した方式を真似して他社も使うようになった方式ばかりなので、いろいろ権利関係が微妙なんです。

まぁ、「っぽいもの」でも実際動くので問題ないんですが。

 

◯I2C

DATA線である「SDA」、CLOCK線である「SCK」の2線で通信できる便利なやつ。

マスターとスレーブがSDA信号を互いに使うことで、これだけで双方向通信できます。

さらに、マルチスレーブ接続もできる。(スレーブはアドレスで指定して通信するので、別のCEピンが不要)

いい事だらけに見えますが、通信速度が遅いです。

最大400kbpsです。

 

◯SPI

CLOCK「SCK」、MASTER→SLAVE「MOSI」、SLAVE→MASTER「MISO」と、スレーブのイネーブルを制御する「CE」の4線で通信する方式。

I2Cと違ってとても速い。

ICによりますが、10Mbps以上で通信することもできます。

 

◯UART

「TXD」「RXD」の2線を使う通信方式。

クロックがないので、お互いに通信速度を設定してから通信する必要がある。

これはクロック同期がないのであまり速く出来ません。

普通は速めでも115kbpsぐらいです。(特殊な場合にそれ以上速いこともありますが)

 

◯SD I/F

SDカードで使用されている通信方式。

DATA0-3,CLOCK,CMDの6線を使います。

データ転送が4bit幅なので速いです。

ICの対応規格によりますが、50Mbpsとか出ます。

主に通信IC(WiFiとか)とCPUの通信で使用されます。

 

とまぁ、ざっくりこんなものが頻出します。

それぞれの規格の詳細はいつかそのうち・・・。

 

以上、小田切でした。

CPUの「チャンネル」ってなんだろう

CPUのデータシートを見ていると、

「2 x ADC」とか「3 x UART」とか書いてあります。

これはわかりやすいですね。

「ADコンバータが一個載っています」

「UART通信用の周辺回路が3個載っています」

これは困らないんです。

 

紛らわしいのは、「ADC 6 channel」とか書いてあるものです。

「え、6 x ADCと同じじゃないの?」

そう思った方、それが違うんです。

 

CPUのデータシートの慣例として、

「2 x ADC」と書いてあれば、その回路が二つ内蔵されているという意味になります。

こう書いてある場合、ADCの回路が二つあるわけですから、二つのアナログ入力を同時に監視できるわけです。(特別な制約がない場合。CPUは結構例外多いので油断できません)

 

では「ADC 6 chennel」と書いて有る場合、ICの中身はどうなっているでしょうか。

ADCに数が書いてありませんので、恐らくADCの回路は一つしか入っていません。

ADCの回路が一つしか無いのに「6チャンネル」とはこれ如何に。

これは、入り口が6個あるということです。

つまり、CPUのピンのうち6個をADC入力として使えるということです。

どのポートを中身のADCに接続するかをソフトウェアから指示して初めて使えるわけです。

6個のアナログ入力ピンにそれぞれアナログを入力できますが、ADC回路が一つしか無いので同時に一つしか見ることが出来ないのです。

高速でチャンネルを切り替えていけば、ほぼリアルタイムで見ることができるかもしれませんが、CPUが非常に忙しくなってしまいますし、それでは最高速度で監視ができません。

ということで、常に見張っていないといけない高速なアナログ値が複数ある場合はこれは困るということです。

でも時々見ればいいアナログ値(例えば電池電圧)であればこれで十分なわけです。

 

以上、小田切でした。

CPUのCache(キャッシュ)って何?

CPUのデータシートに「キャッシュ」ってあります。

これ、気にしないといけないのでしょうか。

 

答え:基本的に無視でOK

 

キャッシュというのは、簡単に言うと超高速メモリです。

RAMからデータを読む時、こういう動きになります。

 

1回目の読み込み:RAM→キャッシュ→CPUの演算部

2回目の読み込み:キャッシュ→CPUの演算部(超高速)

 

キャッシュはRAMより速いので、上の動きになることで2回目以降の読み込みが高速になるのです。

(書き込みにも使用されるので、書き込みも早くなります)

 

だいたい重い計算のときは同じアドレスのメモリを何度も参照しますから、

このキャッシュがあることでメモリアクセスが劇的に早くなるわけです。

 

そして、このキャッシュは基本的に自動で処理されます。

CPUの中で勝手にキャッシュメモリに格納して、使わなくなったら古いものから上書きします。

結構高度な機能ですが、利用者から完全に隠蔽されています。

 

ということで、原理的にはキャッシュが大きいほど処理が早くなるわけですが、

「キャッシュが足りなくて速度が出ない」と問題になることは普通ありません。

それに、キャッシュメモリが大きくても小さくて利用者からは見えないので関係ありません。

 

「へぇ、このCPUのキャッシュメモリは8kBか。小さいCPUの割に大きいな」

ぐらいの感想でそのままスルーしてしまって普通は問題ありません。

 

以上、小田切でした。

クロックってなに? なんかたくさんあるんだけど(初心者向け)

CPUのデータシートを見ると、例えば

「最大周波数40MHz」とか書いてあります。

 

しかし、その後読んでいくと実際に繋げる水晶振動子は20MHzと書いてあったりします。

さらに、読んでいくと32kHzの水晶振動子の話が出てきて、

さらに読んでいくと内蔵低速オシレータだのなのだの、セラミック発振子、LC発振器だの「クロック」に関することが山のように出てきて、はっきりいってわけわからめ!

なにこれ!?

 

ってなことで、クロックに関してざっくりしたことを説明したいと思います。

 

まず、クロック(周波数)というのは内部の回路を動かすための速度です。

1クロックごとに回路の状態が変化していきますので、40MHzであれば、秒間4000万回状態が変化するわけです。

あらためて数字にすると結構凄いですね。わずか100円程度のCPUであってもこれだけの速度で動きますから。

 

さて、で、このクロックというのをどうやって作っているかというのが、まず複数あります。

・水晶振動子

→水晶振動子をCPUに取り付けると、CPUが水晶振動子を駆動してクロックを作る

・外部クロック供給

→他の部品でクロックを作ってCPUに入れる

・セラミック発振子

→水晶振動子に似た安い部品。精度悪い。

・内蔵発振器

→CPU内臓のクロック生成機能。追加部品いらないので安いが、だいたい精度最悪。

 

普通は水晶振動子でクロックを作ります。

数十円のお値段で精度が一番いいので、無難です。

内蔵発振器は一番お安いですが、精度が悪いので問題が出る時があります。

(通信速度がずれてしまうので通信の時に問題が出るなど)

 

そしてクロックを作った後に、このクロックを掛け算したり割ったりして内部クロックを作ります。

たとえば、20MHzを2倍して40MHzです。

こういう機構があるので、CPUの動作速度と水晶振動子の動作速度は違うのです。

 

これで全体はなんとなくわかったかと思います。

 

そして、おまけとして「低速クロック」というのがあります。

これは32kHzの水晶振動子か内蔵発振器で作ります。

これは、物凄く低速で動く機器(32kHz程度の処理速度でいい機器)か、時計の駆動に使います。

CPUの処理を止めておいて(スリープ・スタンバイ)、時間だけカウントするという事ができるのですが、その際に使用します。

これはオプションなので、CPUは常に高速で動き続け、CPUと止めて時間を計測する必要がなければ、低速クロックは不要です。

 

こんな風になっているので、ぱっと見るといろいろあってわけわからなくなりやすいのです。

 

以上、小田切でした。