[セットトップ]MDKにおける変数グローバルアドレスとローカル変数アドレスの重ね合わせ問題--fyy


MDKにおける変数アドレスの重ね合わせ問題
 
 
最近MDKを使ってLPC 1768のプロジェクトを開発しています.MDKで自動的に生成される起動コードを利用して、少し修正して使用します.デバッグ中に、多くの問題が見つかりました.
1.プログラムにはグローバルな配列があり、300バイト、VS 2010ではデバッグが完全に正しいが、MDKに移植するとデータが間違っており、印刷された結果は予想と異なる
2.もっと奇妙なのは、関数を1つ多く書くと、関数に変数が定義されているので、プログラムを実行すると、300バイトのデータバッファの内容が印刷され、この新しい関数を書いていないことに気づいたときの結果が違います.
3.N久をデバッグして、苦しんで、プログラムの中の関数を修正して、できるだけ省く変数、配列をすべて行って、うん、いいですね.結果はやっと正しいです.窃喜中、これはメモリの問題だと断定して、しかしメモリのオーバーフローではないことを考えてみて、LPC 1768は64 KのRAMがあるので、完全に十分で、一時的に何が起こっているのか分からないので、先に置いて、どうせ今は正しいです.
4.前のステップで無駄な変数を減らす方法は目の前の問題を解決するしかなく、確定して、コードの増加に従って、変数は増加して、今日、あの変な今再び再現して、私はもう変数を除去してこの問題を修正することができません.痛い中...
5.苦しみ続ける…
[原句]生活はいつも続けなければならない......、考え!
7.突発的な奇想天外な考え:この重要なグローバル配列を直接あるアドレスに指定することができて、このようにこの問題をもたらすことができませんか?
8.心が動くより行動して、やると言ったらやる!!!
9.MDKのヘルプドキュメントを検索することは、その年に自分のどんな雑多な本を読んだことがあるメリットにも役立ち、位置づけ方法を見つけました.
#include <absacc.h>  
unsigned char data_packge_buffer[300] __at ( 0x10000000 + 0x8000 - 0x4ff) = {0}; 


int x __at (0x10000004 );                         // variable at address 0x10000004 

試してみましたが、やはりこのように使うことができて、コンパイルして、間違いありません!
テスト:結果はやはりだめ!......探索を続けると......、最後に説明が見つかりました.位置決めも開始位置を決めるだけですが、この位置が他の変数で使用されていることを検出するわけではありません.対応するメモリ空間も開いていないので、この道は通じません.
10.思索を続ける......
11.動的割当てを使用できますか???
12.動的分配空間は自動的に解放されず、解決できるはずだが、オペレーティングシステムがないので、動的分配空間を作るのはよくない.
13.绝境の出会い、大量の资料を调べて、最后についに问题の根源を探し出しました---コードの中のスタックの空间が小さすぎて、多く局部の変数を定义する时に全体の変数に影响することができて、简単に住所が重なりました!!!
14.卵が痛くて、このKEIL MDKもあまり普通ではありません.スタックスペース不足の深刻な問題が検出されなかった.
15.問題が見つかりました.興奮の中で、党に感謝して、CCTVに感謝して、MTVに感謝します!
16.そうだ、最も重要なことを言うのを忘れたのは、もちろん解決方法です.簡単で、コードのスタック空間の大きさを変更します.
この文章は私のためにオリジナルで、私も多くの汗を払って書いたので、転載して出典を明記してください!