CPU

ウォッチドッグタイマーとは?

CPUにウォッチドッグタイマーという機能があります。

回路設計そのものでは知らなくても問題ありませんが、ソフト開発者と話すときの知識としては知っておいたほうがいい機能です。

 

実際の運用ではハードの問題やソフトウェアのバグで、CPUの動作がおかしくなってしまうことが有ります。

そんなときに復帰させるのは非常に難しいです。

なにしろ、頭であるCPU(またはプログラム)がおかしくなっているので、制御もできません。

そんなときの対策として組み込まれている「ウォッチドッグタイマー」です。

 

どういう機能かというと、

「定期的にウォッチドッグタイマーに『ちゃんと動いているよ』と言わないと、CPUをリセットしちゃう機能」です。

例えば、なにかを10個のセンサーを監視しているプログラムがあるとしましょう。

そうしたら、「10個のセンサーを監視し終わったらウォッチドッグタイマーに通知して最初に戻る」というプログラムを組みます。

そうすると、どこかのセンサー監視中に処理が止まってしまった場合、ウォッチドッグタイマに通知が行かなくなります。

そうすると、ウォッチドッグタイマーは「あれ、通知が来ないな。リセットだ」とCPUをリセットするので、CPUが復帰することが出来ます。

 

こんな機能ですので、頭においておきましょう。

 

以上、小田切でした。

CPUの中に小さなCPUが入っていたり、IC内にCPUが入ってるのなに?

たとえば、TIのCC1310というCPUがあります。

http://www.tij.co.jp/product/jp/CC1310

このページのなかにブロック図がありますが、この中に「Cortex M3」と「Cortex M0」という二つのCPUが見えます。

 

「なるほど、デュアルコアCPUなのかな?」

 

そういう風に言うこともできるかもしれませんが、開発者からすると扱えるのは「Cortex M3」だけです。

Cortex M3の横には「Flash」と書いてあるのに、Cortex M0の横には「ROM」と書いてあります。

つまり、開発者はM3のプログラムを作って書き換えることはできるのですが、M0のプログラムは書き換えることが出来ません。

 

「じゃあ、M0はなんのためにあるの?」

 

普通はそう思います。

実はこれ、無線部の制御をしている裏のCPUなのです。

M3から無線部に「電波を出せ!」とか言うと、M0がそのメッセージを受け取って実際に無線を出力しているわけです。

言ってしまえば、M0は「ただの制御回路」として動いています。

無線の制御をする専門の回路を組んでもいいのですが、メーカとしてはそれは大変だったのでしょう。

専門の回路の代わりに小さなCPUを組み込んでそこにメーカがプログラムを書き込んで、制御回路の代わりをさせているわけです。

 

このパターン、最初見ると混乱しますが、じつはちょくちょくあります。

例えば、NXPというメーカのRFID(非接触カード)の読み書きを行うICなども、外から見るとただのICなのに中には小さなCPUが入っていたりします。

こんな風に、制御回路の代わりにCPUが入っている部品はちょくちょくあるのです。

最初に見ると驚くと同時に「自分でプログラムを書き換えられるのかな」と思ってしまうものですが、そういう性質のものではありません。

 

以上、小田切でした。

デジタル入力になまった波形を入れては駄目!

デジタル信号は3.3V系なら、約3.3Vと約0VでHighとLowを表現します。

ところがよく考えてみてほしいのですが、High→LowまたはLow→Highの変化の時に1Vとか2Vに一瞬なりますよね。

これって問題ないのでしょうか。

 

実は問題が有ります。

あるCPUの例では、LOW入力は0.3VCC=約1V以下、HIGH入力は0.7VCC=約2.3V以上と規定されています。

ということは、1V~2.3Vの間ではHIGHかLOWかはわからないということです。

この部分を「中間電位」と呼びます。

この中間電位ではデジタル回路は不安定になります。

しかし電圧の変化時に絶対に通過するのでゼロにするわけには行かないので、CPUなどのICの側で「x us以内に信号を変化させること」と規定されています。

これを守らないで、例えばRC回路などでゆっくり変化する信号をデジタル入力に入れるとどうなるでしょうか。

 

1,チャタリングする

中間の電圧の認識というのは非常に不安定です。

入力電圧が微妙にふらついていたりすると、HIGHかLOWの検出がブレたりします。

入力信号:0V→ふらふらしながら上昇→3.3V

出力理想:LOW→HIGH

出力現実:LOW→HIGH→LOW→HIGH……→最終的にHIGH

こんな風にぐちゃぐちゃな信号として読まれてしまいます。

 

2,貫通電流(大電流)が流れる

デジタル入力回路というのは、中間電圧をそもそも想定していません。

構造上、中間電位が入ると内部で「貫通電流」という大電流が流れてしまいます。

ICで規定された時間以内に信号が変化すれば問題はないのですが、ゆっくり信号が変化するとこの貫通電流が長時間流れてしまい、部品の破壊につながります。

 

と、こんなわけなのでゆっくりと変化する信号をデジタル回路やCPUのデジタル入力につっこんではいけません。

「シュミットトリガ入力」だとか「ヒステリシス入力」などと書いてあるIC・CPUは問題ありませんので、そういった部品を使うようにしましょう。

 

以上、小田切でした。

CPUに取り付けた水晶振動子が発振しない時

実際に仕事であったことなんですが、CPUに取り付けている水晶振動子が発振しません。

たしかにマッチング前なので水晶振動子についているコンデンサの容量などは最適ではありません。

しかし、全く動かないというのも奇妙です。

不安定でも不安定なりに動きそうなものですが、うんともすんともいいません。

 

1,電源は正常

2,CPUはこわれていない

3,CPUのリセットはきちんと解除されている

 

これで水晶振動子が発振しないという状況で、原因が特定できたらなかなか凄い!

 

しばらく考えてみましょう

 

・・・

 

・・・

 

・・・

 

・・・

 

・・・

 

ここで大ヒントです。

 

「水晶振動子が動いていないのにプログラムは動いている」

 

これでわかりませんか?

 

・・・

 

・・・

 

・・・

 

・・・

 

はい、タイムアップ。

 

プログラムが動いているということは、なにかクロックが存在しているということです。

しかし、クロック源として回路設計で取り付けた水晶振動子は動いていない。

となると、クロック源は「内蔵発振器」ということになります。

 

そう、最近のCPUは精度はいまいちなものの単体で動作する内蔵発振器がついています。

水晶振動子がなくても動作しちゃうんです。

そして、たいてい内蔵発振器があるCPUはデフォルトで内蔵発振器を使うようになっています。

つまり、ソフトウェアで適切に設定をしないと、外部の水晶振動子を活用してくれないのです。

 

ということで、正解は「内蔵発振器で動いてしまっている」でした。

水晶振動子がうんともすんとも言わないときはこれを疑ってみましょう。

 

以上、小田切でした。

DMAってなんだろう?

CPU・MPUのブロック図やデータシートには必ず「DMA」というものが出てきます。

DMA = Direct Memory Access

直截メモリにアクセス!ってことです。

 

普通、メモリというのはCPUが触ります。

プログラムでメモリにデータを書き込んだり、読み込んだりします。

プログラムを実行するだけの機械ならこれでOKです。

 

が、現実のマイコンというのはいろんなことをしています。

例えば、Aと通信をしながらBとの通信に必要なデータを組み立てている場合を考えてください。

Bの通信に必要な計算を一生懸命しているのに、Aと通信している周辺機器から「1バイト送ったよ。次のデータ頂戴」と呼び出されるわけです。

その度にBの計算を中断して、Aのデータが入っているメモリを読み込んでAと通信している周辺機器に渡してあげる必要があるわけです。

これは結構無駄です。

 

DMAというのはそういった処理を自動化してくれる機能です。

最初にプログラム(CPU)から「こういうデータをこういう風に送ってね」と設定しておくと、あとは勝手にやってくれるわけです。

例えば先程の例では、「周辺機器から次のデータを求められたら次のバイトのデータを転送するように」とかできます。

 

DMA自体はメモリコピー全般に使えるように設計されているため、他にもいろいろ使いみちがあります。

・CPUと無関係に大量のデータをコピーしたい

・CPUが低消費電力状態で低速クロックで動いている時でも、データのコピーをしたい(DMAはCPUと無関係に動作するので)

etc…

この辺はハードウェア設計者より、実際に組込みソフトウェアを作っている人のほうが詳しいはずです(汗;

 

ここまで書いといて何ですが、DMAは知識として必要ですが、これによってハードウェアの組み方が変わることは普通ありません。

なので、回路設計するときはぶっちゃけあんまり関係ありません。(汗;

 

以上、小田切でした。

CPUとMPUって何が違うの?(初心者向け)

マイコンのことを「CPU」と言ったり「MPU」と言ったりします。

なにが違うのでしょうか。

 

実はほとんど変わりません。

本当は意味が違うのですが、どちらもマイコンのことを指しています。

 

しかし、厳密に言うと両者の意味は違います。

 

◯CPU:中央演算処理装置

つまり計算する部分だけを指しています。

マイコンの中には計算だけでなく、通信や入出力の機能も入っていますが、そういったものは含みません。

 

◯MPU:マイクロプロセッシングユニット

マイコンそのものを指しています。

 

つまり、マイコンのことを呼ぶならMPUが正しいのですが、慣例的にCPUとも呼んでいるわけです。

たまに会話で「このマイコンのCPUは~」というフレーズが出ますが、このときはMPUの中の演算部だけを指しています。

まぁ、めったにないですが。

 

とこんな感じです。

 

以上、小田切でした。

ARMとかCORTEXってなんだろう?

それぞれのメーカーがCPUを作っているので、各社いろいろCPUがあります。

しかし、ずーっとみていくと、いろいろな会社のCPUで「ARM」だとか「CORTEX」という単語が出てくるのに気が付かないでしょうか。

 

「アーキテクチャ」と書いてあるので、CPUの設計のことを指しているはずです。

それならばメーカーに寄って違うはず。

それなのにどのメーカーでも「ARM]とか「CORTEX」という単語が出てくる。

なんででしょう?

 

それは、「ARM」という会社がCPUの設計をしている会社だからです。

そしてARMが設計したCPUの名前が「ARMなんちゃら」とか「CORTEX」なんです。

各社自分でCPUも設計しているのですが、「ARMなんちゃらが欲しい」「CORTEX」が欲しいという声に答えてARMから設計を買ってそのCPUも作っているのです。

 

ARM社のアーキテクチャは普及しているので、一度開発していればその資産が流用できます。

ということで、ARM社のアーキテクチャを採用したCPUが最近増えているようです。

とはいえ、周辺機器は各社が作っているので、「ARMだから全部同じ」というわけではありません。

基本的なプログラムは流用できますが、周辺機器の制御部は作り直す必要があります。

 

ということで、「ARM」という文字が書いてあったら、「CPUのコア部分の設計は買ってきているんだな」と理解してください。

 

以上、小田切でした。

GPIOで流せる電流っていくつ?

GPIOで流せる電流は気になりますよね。

大きければそのままLEDなどを駆動できますが、小さければトランジスタなどが必要になります。

もちろんLEDだけでなく、なにを繋げる場合でもGPIOも駆動能力はとても重要です。

 

しかし、これがなかなかデータシートで読みにくいんです。

「GPIOの電流はいくつまで流せます」と明確に書いてないことが多いです。

 

時々、絶対最大定格に「MAX~~」と書いて有る場合もありますが、絶対最大定格は「これ以上やると壊れる」と言っているだけであって、それだけ流せると保証しているわけではありません。

データシートを読んでいっても、なかなか見つかりません。

実はどこに書いてあるかというと、「DC Characteristics(DC特性)」に書いてあります。

どう書いてあるかというと、「VOH @ 4mAの電圧はxx-xxV」という書き方がしてあります。

つまり、「◯mA引ける」という書き方ではなく「4mA引いた時に何ボルトになる」という書き方をしています。

GPIOにかんして電流の記述があるのはここだけですので、これを参考にするしかありません。

2mA流したときの特性しか書いてなければ最大2mA、20mA流したときの特性が書いてあれば最大20mAということです。

もちろん、そこで書いてある電圧も重要です。

「3V、8mA以上必要な回路」に対して「8mA引いたときの電圧が2.3V~」というGPIOじゃ駆動能力足りませんからね。

 

ということで、GPIOの電流が知りたければDC特性を見てみてください。

 

以上、よろしくお願いいたします。

CPUの内蔵プルアップ・プルダウン抵抗ってなに?

CPUから出ている各ポートにたまに内蔵プルアップ抵抗やプルダウン抵抗がある場合があります。

プルアップ抵抗・プルダウン抵抗は、普通回路を引く側がCPUの外側につけるものです。

なんで、内蔵されているんでしょうか・・・?

 

実はこれは2パターンあります。

 

◯「つけるに決まっている抵抗を先につけておきます」パターン

例えば、RESETピン。

これはLOWになるとリセットされますので、通常はHIGHにしておかないといけません。

もし外側に抵抗がないとRESETピンはHかLかどちらになるか予測がつきません。

ということで、安全を見込んで中でプルアップ抵抗がついていることがあるんです。

ほかにも、JTAGなどデバッグで使用されるピンはプルアップ・プルダウンが決まっているので、最初からCPU内に内蔵されていたりします。

 

◯「プルアップ抵抗やプルダウン抵抗のコストを削減しましょう」パターン

さらに一歩進んで、プルアップ抵抗やプルアップ抵抗の両方が内蔵されていて、プログラムで有効・無効を切り替えることができるCPUがあります。

こうなると、UART_RXDのプルアップなどを(原理的には)削除できるので、外付け抵抗をかなり減らすことが出来ます。

小規模な回路だと基板が小さかったりするので、抵抗を減らせるととても部品配置がしやすくなります。

 

と、こんなふうにプルアップ・プルダウンひとつとっても、いろいろ工夫されています。

 

以上、小田切でした。

CPUの割り込みって何?

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

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

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

 

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

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

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

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

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

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

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

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

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

 

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

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

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

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

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

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

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

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

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

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

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

 

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

 

以上、小田切でした。