Столкнулся с непонятным для меня явлением при работе с памятью c8051f320.
Полазил в разных форумах наткнулся на примерно похожие заморочки у других и проблему обошел.
Но метод мне не понравился, так что если кто сможет разъяснить что может происходить внутри контроллера, чтоб было понятно для середнячка в программировании и знании МК фирмы Силаб, а так же подсказать ,как выйти из данной ситуации, буду очень благодарен.
Задача практическая- надо выводить символы в графический ЖКИ.Решил поступить просто-
сформировать массивы [2]*[10] байт в памяти и выводить по мере необходимости в нужную область ЖКИ.
В даташите указано, что имеется 1024 байта XRAM, мне вполне хватает и половины.
Работаю с Cygnal IDE v 1_85.Когда скомпилировал,собрал(build) и запустил программу - все зависло. Выяснилось,что при формировании двух массивов программа работает как задумано(IDE показывает, что у меня xdata=144), а при добавлении еще одного массива (xdata=164)происходит зависание.
Чтоб не загромождать привожу основные моменты программы
//---------------------
// Global CONSTANTS
//----------------------
xdata unsigned char D0[2][10]={ {0xFC,..,0xFC},{0x3F,..,0x3F} };
xdata unsigned char D1[2][10]={ {..},{..} };
.
.
xdata unsigned char D20[2][10]={ {..},{..} };
//----------------------
// Main Routine
//-----------------------
void main(void)
{
PCA0MD &= ~0x40; // Disable Watchdog timer
Sysclk_Init();
Port_Init();
LCD_Init();
while (1)
{
WriteD(D0, 0);
WriteD(D1, 15);
WriteD(D2, 30);
.
.
}
}
Внес инициализацию D0[2][10]..D20[2][10] в модуль while (1){...} все заработало. Однако получается, что при этом программа выполняет заполнение массивов в каждом цикле, т.е. тратит уйму времени. Для моей задачи конечно пойдет, но как-то некрасиво.
Вопросы:
1.По какой причине может виснуть программа?
Зависание посмотрел в отладчике- размещал точки останова в разных местах программы. Однако в окошке, где программа расписана на си останов не происходит даже у строки PCA0MD &= ~0x40; В окошке дизассемблера видно, что маркер бегает по какому-то циклу, но в какой ветке я разобрать не смог.
2.Можно ли обойти грабли покрасивее?