Я помогаю другу получить графический ЖК-дисплей, работающий на его 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с.
Я могу организовать размещение полной копии исходного кода, если кому-то будет интересно. Любая помощь или указатели приветствуются!