こんにちは。

最近、前髪の後退が顕著になってきましたゆってぃです。
「敵前逃亡は重罪だぞ!」と、前髪司令官に伝えたいくらいです(涙)

今回は、C言語の中でも最も悪名高いポインタについて記載しようと思います。
というのも、前回出現した後輩(K)に、「ポインタってよくわかんないんすけど、なんなんすか?」と言われたのを思い出したのがきっかけです。
「優秀な大学を出てるくせに、ポインタもわからんのか!クズが!」
と言うことも出来ず、「ああ、要はポインタ型っていう変数だよ」という全く答えになっていないイジワルな回答をしてしまったので、ここで改めて書きたいと思います。
もしかしたら微妙にが混ざっているかもしれませんが、広い心と大きな目でご覧いただけると幸いです。

と言いつつも、ここではポインタの基礎はお話しません。
筆者なんかより遥かに聡明な方々が、筆者なんかよりわかりやすく正確な情報を、すでに多くの書籍やウェブサイトでお伝えして下さっていますので。。。(本当は、ここで本質的なことを書いてボロが出るのが怖いだけですが、これは僕とあなただけの秘密です)

組み込み系や制御系のプログラム(特にノンOS)では、ポインタやアドレスという概念は、切っても切れない関係にあります。
というのも、I/Oや周辺モジュールを制御する場合、アドレス経由でないとそれらのH/Wにアクセス出来ないからです。(正確には、それらを制御するレジスタに、アドレス経由でないとアクセスできない、ということです)
でも、通常はそれぞれのアドレス(レジスタ)をわかり易い名前でdefineしてくれているヘッダファイルが作成されるので、直にアドレスを書くことは少ないですけれど。

また、マイコンによっては「○○メモリには必ず4バイトでアクセスしてください」などという極めて厄介な制限がある場合も存在します。(マイコンメーカーさん、ごめんなさい…)
そういった場合は、memset関数などではアクセス出来ませんので(いや、もしかしたら出来るかもしれないけど、きちんと動作するかわからないので…)ポインタ経由でアクセスすることになります。
これは文句を言っても仕方ありません。マイコンのH/W自体が、その様に組まれているためです。

じゃあ、4バイトアクセスってどうやるの?
という声が聞こえてきそうなので、今日はその方法をお話したいと思います。

ここで、RAM_TOPは、4バイトアクセスしか出来ないRAMの先頭アドレスだと思ってください。
ここに、0xffffffffを書き込んでみましょう。

int main(void){

  unsigned long *buf;
  buf = (unsigned long*)RAM_TOP;

  *buf = 0xffffffff;

   return 0;
}

実は筆者、この記述が本当にベストなのか未だに不安なのですが、デバッガで確認すると、きちんと4バイトでアクセスされていました。
ポインタは、こんな感じで使うときが多いですね。

また、4バイト型の変数に1バイト型の変数を4つ詰め込みたい時などもあります。
そういう時は

int main(void){

 unsigned long dens = 0; //目標となる4バイト変数
 unsigned char *buf; //1バイトずつアクセスするためのポインタ

 buf = (unsigned char*)&dens;

 *buf = 0xff;
 *(buf+1) = 0xff;

(略)

 return 0;

}

のように書いてあげれば、4バイト変数に1バイトずつアクセスすることも可能です。(エンディアンだけは注意してくださいね)

こんな感じで、ポインタは慣れるとかなり便利な使い方が出来ます。
確かにはじめは戸惑いますが、組み込み&制御系プログラマとしては必須科目ですね!

という訳で、今回の記事はここまでです。
最後まで読んでくださって、ありがとうございました(感謝)

重要:筆者はあくまでも「ど素人」エンジニアなので、話半分でお読みくださいね(笑)
関連記事
スポンサーサイト
コメント
コメントの投稿
トラックバック URL
トラックバック
ご訪問者様
プロフィール

ゆってぃ

Author:ゆってぃ
経歴7年の組み込み系・制御系エンジニアです。
("ど素人"という文言は取りました…笑)
ソフトウェア開発経験ゼロの状態から、なんとか実務がこなせるようになってきた現在に至るまでの経験を、備忘録代わりに綴っていきたいと思います。
入門者の方、大歓迎!
(上級者の方、ごめんなさい…)

あと、ブログには全然関係ないですが、Bumpy Headというバンドのギターをやっています。
ライブ情報なんかも書いたりすることがあるので、その時に「行ってもいいよ~」といった感じのコメントを戴けると、泣いて喜びます(泣)
ブログ読んでくださってる方なら、チケット代サービスしちゃいます!

最後に…滅多に流用することは無いでしょうが、このブログに書かれているソースは、特に指定の無い限りMITライセンスとします。ただし、一部それ以外のものもございますのでご注意下さい。
※ブログのリンク先にあるコードに関しては、リンク先のポリシーに従ってください。

最新記事
最新コメント
カテゴリ
RSSリンクの表示
メールフォーム

名前:
メール:
件名:
本文:

twitter
リンク
ブロとも申請フォーム
スポンサードリンク