2018年 1月 の投稿一覧

組み込みCPUって小数の計算ができないの!?

という話題について。

INTELやAMDやARMだとか、パソコンやスマホに入っているCPUは計算能力に特化しているので、整数も小数も超高速に計算できます。

 

が、組み込み用途で使うようなCPU(マイコン・MPU)なんていうのは非常に貧弱なため、全然違います。

組み込みマイコンでも高い部類(千円に近い値段)のものは浮動小数点のハードウェアを持っているのでそれなりな速度で計算できますが、

普通の安いマイコンではそもそも浮動小数点のハードウェアを持っていません。

つまり、整数計算しかできません!

それもスマホやPCみたいに64bitなんてのではなく、16bitや下手したら8bitだったりします。

 

要は、小数の計算が出来ないどころではなく、整数の計算すらしょぼいのです。

8bitのマイコンでも32bitなどの大きな数値を計算することは出来ますが、「8bitごとに足し算して繰り上げて上の桁の計算に使用して……」なんてことをするので4倍以上の時間がかかります。

浮動小数点も同様です。

浮動小数点数の仮数部だけを個別に計算して、指数部もまた個別に計算して……

要はプログラムでビット操作を延々として浮動小数点数の計算を行うのです。

考えてみればわかると思いますが、浮動小数点数の計算をビット操作でやるなんてめっちゃ大変です。

普通に整数計算の数十倍とかかかります。(下手したらもっと?)

 

さらに「浮動小数点同士の足し算・引き算・掛け算・割り算」をソフトウェアで行う必要があるので、そのためのライブラリをプログラム内に入れる必要が出てきます。

容量が数十kBしかないCPUだとけっこうな負担になります。

 

……ということで、浮動小数点数のハードウェアを持っていないCPUでは基本的には

・計算がありえないほど遅い

・ROMの容量が足りなくなる

ということで使わないという判断をすることが普通です。

 

以上、小田切でした。

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

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

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

 

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

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

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

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

 

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

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

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

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

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

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

 

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

 

以上、小田切でした。

ICの「5Vトレラント」とは?

ロジックICやCPUで「入力は5Vトレラントです」という記述にぶつかることが有ります。

これはなんでしょうか。

 

例えば、3.3Vで動いているロジックICの入力電圧は普通最大3.3Vです。

1.8Vで動いていれば入力電圧は1.8Vまでです。

(正確には絶対最大定格で電源電圧+0.3Vぐらいは許容されていますが)

このように、普通のICの入力電圧は電源電圧と同等です。

もし電源電圧以上の電圧を入力端子に入力すると、電流が電源に戻っていってしまいます。

つまり、3.3V電源のICの入力端子に5Vを入れると、3.3V電源に電流が流れて3.3V→約5Vまで上がってしまうわけです。

そもそも部品が壊れます。

 

ということで、3.3Vで動いているIC・CPUに5Vやそれ以上の電圧の信号を入れる場合、電圧レベルを変換する回路(レベルシフトICやトランジスタで組むなど)が必要になります。

でも、やっぱり面倒なんです。

 

ということで「5Vトレラント」というのは、「電源電圧に関わらず入力端子に5Vまで入れてOK」という設計だということです。

これは嬉しいです。

例えば、3.3Vや1.8Vといった低電圧で動いていても5Vを入れられるので、回路が非常にシンプルになります。

こんな便利な5Vトレラントですが、結構レアです。

もし使おうとしている部品が5Vトレラントだったらラッキーと思ってください。

 

以上、小田切でした。

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が入っている部品はちょくちょくあるのです。

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

 

以上、小田切でした。

基板開発でよく使う測定機器

そういえば、測定機器について紹介していなかったので、軽く列挙してみようと思います。

 

◯テスター

ご存知のテスター。

電圧を測ったり抵抗値を測ったり、安くてもマルチに活躍する大事な商売道具です。

 

◯LCRメーター

コンデンサの容量やインダクタの値を測定することができる機器です。

テスターの高機能版。

 

◯安定化電源

自由に電圧・電流を設定して出力ができる電源です。

「この基板の入力電圧は5V±5%だ」というときに、4.75Vと5.25Vでテストをしないといけませんが、安定化電源ならそういった中途半端な電圧も出力できます。

 

◯オシロスコープ

信号の波形を見ることができる機材です。(横軸時間、縦軸電圧)

DCDCコンバータの出力波形や通信の信号波形をみるのに使います。

帯域100MHz程度のものなら数万円でもあるほど安いですが、それ以上の周波数になるといきなりお値段上がります。

 

◯スペクトラムアナライザー

信号の周波数分布を見ることができる機材です。(横軸周波数、縦軸パワー)

無線出力など数百MHz~数GHzなのでオシロスコープでは捉えられないので、スペクトラムアナライザーで確認します。

百万円以上するのが普通です。

 

◯シグナルジェネレータ

任意の波形を出力することができる機器です。

スペクトラムアナライザーとセットで使うことが多いです。

 

◯ネットワークアナライザー

アンテナやアンテナのマッチング回路でよく使用する機材です。

「この回路に100MHzの信号を入れた時、外から(x+yj)Ωに見えるか」といった回路の実際の複素インピーダンスを測ることができます。

百万とか一千万レベルの機材です。

 

◯恒温槽

指定した温度・湿度を保ってくれる冷蔵庫みたいな装置です。

高温・低温で動作試験をする際に使用します。

 

◯静電気試験機

静電気を出すガンで、製品に静電気を打って耐性を調べる時に使います。

 

メジャーなところだとこんなところでしょうか。

気になるものがあったらぐぐってみると知識が広がりますよー。

 

以上、小田切でした。

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

デジタル信号は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のコア部分の設計は買ってきているんだな」と理解してください。

 

以上、小田切でした。