我正在幫助朋友得到一個在他的AVR上工作的圖形LCD,幾個月前所有的工作都沒有問題,從那時起它一直沒有任何問題。芯片現在已經從ATMega32換成ATMega164P。基本上與更多閃存相同的芯片,因爲這種改變很多代碼已停止工作。const Char數組被修改爲全0,AVR微寫入C
我們縮小了發生錯誤的位置,但無法糾正錯誤。我們在這裏傳遞一個指向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」被運行的代碼時,這表明該常量字符陣列正被一些如何zero'd ?我也曾嘗試以下行也所有打印「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。
如果任何人有興趣,我可以安排提供完整源代碼的副本。任何幫助或指針都是值得讚賞的!
它看起來像某種鏈接器問題。也許字符串文字沒有被鏈接到正確的地址,或根本沒有。我會查看生成的二進制文件並確認它確實包含所有需要的文字。同時嘗試打印並驗證他們的地址。 –
檢查堆棧的大小。如果它太小,你會得到這種奇怪的行爲。另外,你可以顯示SGCColour的定義嗎? – qehgt
並重新檢查您的地圖文件(鏈接器可以生成它)。可能是「常量數據」(放置C字符串)部分有問題。 – qehgt