上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
こんばんは!


ひっっっっっさしぶりの更新です。
久しぶりすぎて、僕自身、なんか他の人が書いたブログに不正アクセスしちゃってる気分です(汗)

やぁ、転職して1年が経ち、もうすっかりベテラン面しているゆってぃでございます。
民生品メーカーから自動車系メーカーへの転職だったので、本当に最初はやっていけるか不安でしたが、いはやは、何とかなるものですね。

久々に書こうと思ったのは、本日の業務中、組み込みシステムの基本的な部分にも関わらず、意外と気がつきにくいミスを発見したからです。

え?いやいや、僕が埋め込んだミスじゃないですよ!
やや、本当ですって!(涙)
まぁ、気がつくのに午前いっぱい取られてしまいましたけど><

皆様ご存知の通り、マイコンのプログラムをする上で、ポインタのキャストには細心の注意を払う必要があります。
例えば、こんなことはしてはいけません。


int main(void)
{
char array[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int i;
long *p;

for(i=0;i< 7;i++)
{
p = (long*)&array[i];
printf("*p = %04x\n",*p);
}

return 0;

}


おわかりいただけただろうか?

何がいけないかというと、long型のポインタ変数に対し、char型の配列の任意のアドレスを与えているところがNGです。
(厳密に言うと、その値を参照しているprintf文がNGで、ここでマイコンがハングします)

というのも、一般的な32bitマイコンは、変数に対して4バイト境界を跨ぐ様なアクセスをした場合、アドレスエラーが発生するからです。
要するに、4バイトの変数なら、メモリ(RAM/ROM)に配置できるアドレスも4つおきになるんです。
例えば
0x0010_0000番地
0x0010_0004番地
0x0010_0008番地
・・・
みたいにね。
この例では、0x0010_0000~0x0010_0003までがひとつの纏まりで、0x0010_0003と0x0010_0004の間にバイト境界があります。

にも関わらず、上のサンプルコードでは、どこかのタイミングで
0x0010_0001番地
に、無理やり4バイトアクセスする感じになります。
つまり、
0x0010_0001
0x0010_0002
0x0010_0003
=== 越えられない壁 ===
0x0010_0004
の4つのアドレスに、一度にアクセスすることになります。
でも、途中に越えられない壁(バイト境界)があるので、エラーが発生する訳ですね。
どうです?結構落とし穴でしょ(笑)

でもこれ、パソコンで作成したアプリとかだと、エラーになりません。
マイコンなら確実にエラーになるかというと、そうとも限りません。
例えば、ARMのCortex系マイコンでは例外にはなりませんが、SH系マイコンでは例外が発生します。
だからこそ落とし穴なのです!

詳しい話は、wikiペディア先生のページにも書かれています。
バスエラー

因みに、long型やshort型に対して、char型のポインタをキャストする分には問題がありません。
なぜなら、char型はバイト境界を意識せずに、どんな変数にもアクセスできるからです。
なんせ1バイト型ですから、アクセス時にバイト境界も跨ぐもへったくれもございません。

その逆・・・long型やshort型などのポインタに対し、自分より小さな型を持つ変数のアドレスを与えることは
よほどの理由が無い限りオススメ出来ません

でも、マイコンとポインタは切っても切れない関係なので、こういったことに注意しつつ、テクニックを身につけて行きましょうね^^

最後までお読みいただいて、ありがとうございました!
関連記事
スポンサーサイト
コメント
コメントの投稿
トラックバック URL
トラックバック
ご訪問者様
プロフィール

ゆってぃ

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

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

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

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

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

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


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。