Массив Const Char изменяется на все 0 для AVR micro, записанного на C - PullRequest
0 голосов
/ 23 ноября 2011

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

2 голосов
/ 23 ноября 2011

ATMega164P - это не замена для ATMega32, а для ATMega16.Для ATMega32 вам понадобится ATMega324P.Если вы используете карту памяти для ATMega32 (с двойной EEPROM, SRAM и флэш-памятью), ваша строка может оказаться в памяти, которая просто не существует.По вопросам портирования вы можете обратиться к руководству по портированию от Atmel.

...