Массив Const Char изменяется на все 0 для AVR micro, записанного на C
Я помогаю другу получить графический ЖК-дисплей, работающий на его AVR, несколько месяцев назад все работало без проблем, с тех пор его не трогали. Чип теперь был заменен с ATMega32 на ATMega164P. По сути, тот же чип с большим количеством флеш-памяти, так как многие изменения перестали работать.
Мы сузили место возникновения ошибки, но не можем ее исправить. Именно здесь мы передаем указатель на строку константного символа и пытаемся напечатать эту строку, однако по какой-то причине стек (куча, что-то еще?) Поврежден, и указатель содержит все нули. У кого-нибудь есть идеи, как это могло произойти? У нас включена оптимизация уровня -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);
Известно, что этот код работал несколько месяцев назад, у нас даже есть видео, где он запущен, теперь каждая функция в программе имеет одну и ту же проблему: передаваемые массивы (в стеке?), Похоже, не работают и очистить до 0с.
Я могу организовать размещение полной копии исходного кода, если кому-то интересно. Любая помощь или указатели приветствуются!
1 ответ
ATMega164P - это не замена для ATMega32, а для ATMega16. Для ATMega32 вам понадобится ATMega324P. Если вы используете карту памяти для ATMega32 (с двойной EEPROM, SRAM и флэш-памятью), ваша строка может оказаться в памяти, которая просто не существует. По вопросам портирования вы можете обратиться к руководству по портированию от Atmel.