2011-11-23 56 views
0

我正在幫助朋友得到一個在他的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。

如果任何人有興趣,我可以安排提供完整源代碼的副本。任何幫助或指針都是值得讚賞的!

+0

它看起來像某種鏈接器問題。也許字符串文字沒有被鏈接到正確的地址,或根本沒有。我會查看生成的二進制文件並確認它確實包含所有需要的文字。同時嘗試打印並驗證他們的地址。 –

+0

檢查堆棧的大小。如果它太小,你會得到這種奇怪的行爲。另外,你可以顯示SGCColour的定義嗎? – qehgt

+0

並重新檢查您的地圖文件(鏈接器可以生成它)。可能是「常量數據」(放置C字符串)部分有問題。 – qehgt

回答

2

ATMega164P不是ATMega32的替代品,而是ATMega16的替代品。對於ATMega32,您需要ATMega324P。 如果您使用ATMega32(具有雙EEPROM,SRAM和閃存)的內存映射,則您的字符串可能已經存在於根本不存在的內存中。 對於移植問題,您可以查看Atmel的porting guide

+0

編譯時選擇了正確的芯片,還有哪些其他選項需要更改? – rolls

+0

必須只是內存不足。 – rolls

+0

evice:atmega164p 計劃:3398個字節(20.7%滿) (+的.text。數據+ .bootloader) 數據:886個字節(86.5%滿) (。數據+的.bss + .noinit)看起來像很多可用空間? – rolls