大文字と小文字の違い
1kgの「k」と1KBの「K」の違いは知っているかな?
1kg=1000g、1km=1000mの意味だよね。一般的な数量を表す単位系だと、小文字の「k」というのがつくと「1000」を意味する。これに対して「ファイルのサイズは50KBです」というようにコンピュータの世界だと大文字の「K」が使われている。この大文字の「K」は「1000」ではなく「1024」を意味してる。つまり、1KB=1024Bだね。
コンピュータは0/1の2進数で動作している、とよく言われてる。実は「1000」というのは、2進数では大変切りの悪い数字なんだ。そこで、210(2の10乗)である「1024」を基本にしたというわけ。ちなみに1MBの「M」も1024×1024の意味だよ。
大文字と小文字のついでに「b」と「B」の違いについても触れてみよう。例えば、ネットワークの通信速度の表記などでよく見かける「bps」と「Bps」という単位。これらは、どれくらい違うのだろうか。
小文字の「b」は「ビット」の意味。ビットは、コンピュータが動作する最小単位で0N(1)とOFF(0)の2つの状態を持つ小さなスイッチだと考えて。ビット値はそのまま2進数で表すことができる。ビットが4個あれば、24=16の状態の組み合わせを表現することができるよね。ビットが16個あれば、216=65536になる。「コンピュータは2進数で動作している」と言われるゆえんなんだ。
これに対して、大文字の「B」は「バイト」を意味してる。1バイト=8ビットと決められていて、これもコンピュータでデータを扱う上で基本単位となっているんだ。先の例に戻ってみよう。「bps」は「ビット/秒」、「Bps」は「バイト/秒」を意味してる。つまり、100Kbpsと100KBpsを比べると、100KBpsのほうが8倍高速であることを示しているんだ。
2進数と16進数
前置きが長くなってしまったけど、組込みの世界では、2進数や16進数をいかに早く正確に扱えるかが大変重要なスキルのひとつになる。いろいろな場面で、2/10/16進数をパッと相互変換できる力が求められる。これを間違えるとバグに直結するし、いちいち考えてしまうようでは仕事にならないんだ。よく使う値を紹介するね。まるごと暗記してしまってもいいと思う。
(注)ここでは以下のルールで「進数」を表現することにします。
- 10進数:何もつけない
- 16進数:先頭に「0x」をつける
- 2進数:最後に「b」をつける
上記をみてもらえると分かるけど、2進数だと数が大きくなるにつれて桁数が膨大になってしまうよね。16進数を使うのはこれを扱いやすくするためなんだ。
ビット論理演算
デバイスドライバを書くときには、通常「レジスタ」というインターフェースを介してハードウエアを制御するんだ。レジスタはビットの集まりで、各ビットに異なる機能が割り当てられている。レジスタの種類や各ビットの機能を記述した資料は「データシート」と呼ばれていて、ハードウエア開発元から提供されるんだ。
デバイスドライバの開発は、このデータシートを読み込むところから始まるんだよね。それじゃ本題。レジスタの制御をプログラムから行う場合に必要となるのが「ビット論理演算」なんだ。例えば、8ビットのレジスタAがあるとする。このレジスタは以下の3つのビットに機能が割り当てられているんだ。
- ビット4を1にすると内蔵メモリをクリアする。
- ビット5を0にすると転送を開始する。
- ビット7が1になったら転送が完了したことを示す。
それぞれ以下のようなコードで表現することができる。
変数regは、上記レジスタAのアドレスが設定されているものとするね。
まず、ビット4,5,7をそれぞれ2進数、16進数で表現すると以下のようになる(ビットは0から始まりますので注意)。
(1)は、ビットOR演算子(|)を使って、ビット4を1にセットしている。これはわかりやすいよね。(2)は、ビットAND演算子(&)を使って、ビット5だけ0にクリアしている。これはすこしややこしいので、説明するね。
0x20にNOT演算子(?)がついているから、各ビットの1/0を反転させると下に示しているようになるんだ。
これを元のデータにANDすると・・・ビット5だけが落ちるのがわかるかな?
(3)も、ビットAND演算子を使った例だよ。ビット7だけマスクをかけてチェックするというやり方なんだ。
他にも「このビット以外をクリアしたい」「ビット5,6,7に値を設定したい」など、さまざまなパターンがある。また、レジスタのサイズも16ビット、32ビットと大きいものがあるから、制御しなければならないビットの数も増えていくんだ。
けれど、どんな場合も基本は上記例と変わらないんだ。データシートに記載されているとおりに、任意のレジスタのビットを正確に制御することができるようになれば、デバイスドライバの開発作業がよりスムーズになるよ。ぜひ、今回の「2進数と16進数」「ビット論理演算」を繰り返し練習して体に覚えこませてみて。同期に差をつけられること間違いなしだと思うよ。
-
- 第1回 組込みシステムのこれから
- 第2回 IoTの成功はセキュリティ次第
- 第3回 組込みでもGPUやFPGAと早めに親しんでおこう
- 第4回 電子産業の紅白歌合戦、CEATECで垣間見えた未来
- 第5回 小口開発案件の集合市場、IoTの歩き方(上)
- 第6回 小口開発案件の集合市場、IoTの歩き方(下)
- 第7回 徹底予習:AI時代の組込みシステム開発のお仕事
- 第8回 いまどきのセンサー(上):ありのままの状態を知る
- 第9回 いまどきのセンサー(下):データを賢く取捨選択する
- 第10回 組込みブロックチェーンの衝撃(上)
- 第11回 組込みブロックチェーンの衝撃(下)
- 第12回 エネルギーハーベスティングの使い所、使い方
- 第13回 「人を育てる」から「道具を育てる」へ、農業から学ぶAI有効活用法
- 第14回 CPS時代に組込みシステム開発に求められることとは
- 第15回 次世代車のE/Eアーキテクチャに見る組込みの進む道
- 第16回 RISC-Vが拓く専用プロセッサの時代
- 第17回 振動計測の大進化で、熟練エンジニアのスキルを広く身近に
-
- 零の巻:組込みというお仕事
- 壱の巻:2進数と16進数を覚えよう!
- 弐の巻:割り込みとポーリング
- 参の巻:printf()が使えない?
- 四の巻:これにもIntelが入ってるの?
- 五の巻:Endianってなに?
- 六の巻:マルチタスクとは
- 七の巻:スタックってなあに?(1)
- 七の巻:スタックってなあに?(2)
- 八の巻:メモリを壊してみましょう
- 九の巻:コードが消える?~最適化の罠~
- 拾の巻:例外が発生しました
- 拾壱の巻:コードサイズを聞かれたら
- 拾弐の巻:キャッシュは諸刃の剣
- 拾参の巻:デバイスにアクセスするには
- 拾四の巻:セキュリティってなに?(1)
- 拾四の巻:セキュリティってなに?(2)
- 拾四の巻:セキュリティってなに?(3)
- 拾五の巻 :DMA対応と言われたら(1)
- 拾五の巻 :DMA対応と言われたら(2)
- 拾六の巻:ヒープとスタック
- 拾七の巻:フラグメンテーション
- 拾八の巻:CPU起動とブートローダ
- 拾九の巻:kmとKByteの「kとK」
- ビリーへの質問:DMAとキャッシュの関係
- ビリーへの質問:スタックオーバーフローについて
- ビリーへの質問:CPUレジスタについて