0

私は、友人が彼の AVR でグラフィック LCD を動作させるのを手伝っています。数か月前は、すべて問題なく動作していました。それ以来、手つかずのままです。チップは ATMega32 から ATMega164P に交換されました。この変更により、多くのコードが機能しなくなったため、本質的に同じチップにフラッシュが追加されています。

エラーが発生している場所を絞り込みましたが、修正できません。const char 文字列へのポインターを渡し、その文字列を出力しようとしましたが、何らかの理由でスタック (ヒープ、何か他のもの?) が破損し、ポインターにすべてゼロが含まれています。これがどのように発生する可能性があるか、誰にも考えがありますか? 正確なタイミングに必要な -O1 レベルの最適化を有効にしました。変更なしで winAVR コンパイラにも切り替えました。また、デバッガーにアクセスすることもできず、限られた「印刷」スタイルのデバッグしかありません。

問題を引き起こしているコードのセクションは次のとおりです。

//in the header file that is included
int SGCTEXTStringF(int column, int row, int font, int colour, const char* text);

//Call the function
SGCTEXTStringF(0, 0, 0x10, SGCColour(255,255,255), "text");

//Function
int SGCTEXTStringF(int column, int row, int font, int colour, const char* text){

unsigned char bytes[23]={0};

//...Code to communicate with LCD and set up a 'print string'

if(text[0] == 0) {
    bytes[6] = 'a'; 
    bytes[7] = 't';
    bytes[8] = 'e';
    bytes[9] = 's';
    bytes[10] = 't';
}

//..more code to finish sending the array
}

コードを実行すると、ディスプレイに「atest」と表示されます。これは、const char 配列がどの程度ゼロになっていることを示していますか? また、すべて「atest」を出力する次の行も試しました

if(text[1] == 0)   //prints 'atest'
if(*text== 0)      //prints 'atest'
if(text != 0)      //prints 'atest'

これは、有効なポインターを取得していることを示していますが、すべてゼロを指しているように見えます。

また、メソッドの呼び出しを次のように変更しようとしました。

const char * string = "test";
SGCTEXTStringF(0, 0, 0x10, SGCColour(255,255,255), string);

このコードは数か月前に動作することが知られており、実行中のビデオさえありますが、プログラム内のすべての関数で同じ問題が発生し、(スタック上で?) 渡された char 配列が動作していないようで、 0 にクリアされます。

興味のある方がいらっしゃいましたら、完全なソース コードのコピーをホストするよう手配できます。どんな助けや指針も大歓迎です!

4

1 に答える 1