簡體   English   中英

對於用C語言編寫的AVR micro,Const Char數組被修改為全0

[英]Const Char array being modified to all 0s for AVR micro written in C

我正在幫助一位朋友在他的AVR上運行圖形液晶顯示器,幾個月前所有工作都沒有問題,從那以后它一直沒有被觸及。 該芯片現已從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。

如果有興趣的話,我可以安排托管完整源代碼的副本。 任何幫助或指針都表示贊賞!

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM