読者です 読者をやめる 読者になる 読者になる

Natural Software

KinectなどのDepthセンサーを中心に活動しています

sizeof(char)==sizeof(int)となる処理系とsizeof(char)!=sizeof(int)となる処理系の橋渡し

C言語

ネタでしかないんだけど、この系統の記事を読むたびに TI(テキサス・インスツルメンツ) の DSP を思い出す^^;
#前にも書いた気がするけど気にしない:)
sizeof(char)==sizeof(int)となる処理系の奇妙な世界 | 株式会社きじねこ


上記記事では sizeof(char)==sizeof(int)==16bit==1Byte を紹介しててこれは多分 C5x 系の話。
他にもっと楽しい C3x 系(C6x系のご先祖様)がある。
この C3x 系は

  • sizeof(char)==sizeof(int)==sizeof(long)==sizeof(ポインタ)==32bit==1Byte

なんですよ。


なんでもかんでも 32bit 、でも 1Byte

  • char は 1Byte:32bit
  • int も1Byte:32bit
  • long も1Byte:32bit
  • ポインタも1Byte:32bit


これだけでもややこしいのに、システムの仕様で 16bit CPU である H8 とデュアルポート RAM (いわゆる共有メモリ)でつながっている。
H8 は 16bit CPU なので

  • char は 1Byte:8bit
  • int は2Byte:16bit
  • long は4Byte:32bit
  • ポインタは2Byte:16bit

となる。


このようにアドレスとbit、Byteの考え方が違う CPU 同士で共有メモリを作ると面白いことになる。

  • H8 は 32bit のデータを書き込むのに 4Byte(4アドレス)必要
  • でも DSP は 32bit のデータには 1Byte(1アドレス)しか必要としない

このような動きをするので、お互いにデータをやり取りするにはメモリに展開されたイメージを持ちながらコードを書く必要がある。
DSP 側でビット演算してくっつけたり、ばらしたり。


あとは、デュアルポート RAM は 1アドレス(1Byte)8bit なので、DSP の1アドレスとの整合も取れておらず、しかも DSP のデータバスと 下位 8bit でしかつながっていないので、単純に 32bit 読み込むと上位 24bit にゴミが入るのでマスクしなきゃいけなかったりと結構面白かった。
#字で書くより絵で書いて見せたほうが面白さは伝わるかも・・・

結局なにが言いたいかというと

普通のソフトではまず経験できない世界が組み込みにはあるので、大変だけど面白い世界だなぁと毎度毎度感じるってこと。

どうでもいいこと

C5x 系は他にもバンクでメモリ空間がプログラム・データ・I/Oの3つの空間に分かれるナゾ仕様があった。
#データ空間が足りないので、無理やりプログラムの空間にデータを置いたりしてた
C3x 系にしてもC5x 系にしてもなぜこんな CPU を作る必要があったのか経緯が知りたい(本当に^^;)