これ、大丈夫か?

C言語でマイコンプログラム作成するとときどき遭遇する、
メモリとアドレスの問題。

ポインタを使うと、何故か思い通りのアドレスにアクセスしないって
やつね。
大抵は、ポインタを誤解していることが原因。
でも、これは違う。

サックリ概要を示すと以下の通り。
・RAM領域(2Byte表記内のアドレス)
・ユーザー関数の引数(4Byteアドレス表記扱い)

機械語、ポインタとアドレスの話がちゃんと分かってる人なら
ピンとくると思うが、上記のユーザー関数の引数に指定RAMの
アドレスを引数で渡して、関数本体ではポインタで扱う場合、
コンパイラが○ホだと、
ユーザー関数の呼び出し時に引数としてスタックに積むのは
2Byteのアドレス値、
ユーザー関数の引数を実処理の直前に取得する際は4Byte値を
スタックから取り出す、
ということが
起こり得る、というか、今回はこれが発生した。

実際に新しくスタックにpushしたのは2Byteなのに、
4Byteをpopしてしまうから、別のルーチンで積んだ値まで2Byte
余計に取り出すわけだ。
結果、スタックの内容とスタックポインタがずれてしまう。
こういうのは、十中八九暴走する。

まだ量産ではなく、開発段階だから助かったが、これって
明らかにコンパイラのバグじゃないのかなぁ・・・○enesas。

とりあえず、関数を呼び出すときに、引数で渡す変数のアドレスを示す
アンパサンド(&)の前に、longかfarでのキャストをして
アドレス4Byte表記を明示的に指定したら、スタックに4Byte値を
積むようになったので、当面の問題は直った
(4Byteを積んで、4Byteを取り出すようになった)。
しかし、こんな飛び道具を使うと、次に開発する人が悩むことは必死。
どうすりゃよいのかね・・・
つーか、こんなん気づかねーよ、普通。
ア○か、R○nesas。

広告
カテゴリー: 未分類 パーマリンク

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中