Столкнулся с непонятным для меня явлением при работе с памятью 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.Можно ли обойти грабли покрасивее?
|