ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Вторник
2 июля
274562
scorp (25.09.2011 22:30, просмотров: 918)
Data-abort на LPC3250, вылетает при определённых условиях. Здравствуйте. У меня такая проблема, никак не могу понять от чего. Система с SDRAM один в один как на плате Phytek, две 16-бит SDRAM как 32бит память. Код вертится в SDRAM, RTOS Segger/PowerPac, компилятор IAR 6.20. LCD контроллер выводит с SDRAM 320x240 16-бит. Инициализация контроллера и MMU из примера Seggera. Если Idle задачу ставлю в iRAM в таком виде(int32 LowPowerEnable=1 в SDRAM): Код __ramfunc void OS_Idle(void) { // Idle loop: No task is ready to exec while (1) { if((LowPowerEnable != 0) && ((PWR_CTRL&4)!=0)) { PWR_CTRL &= 0xFFFFFFFB;//идём в Direct Run EMCDynamicRefresh = 0x6; // (64ms/8192)*13MHz/16 } } } то черен несколько секунд исполнения программы контроллер вылетает на дата аборт(иногда и на аборт инструкции) именно в Idle процессе чаще всего в одном месте: Код 399 if((LowPowerEnable != 0) && ((PWR_CTRL&4)!=0)) \ OS_Idle: \ ??OS_Idle_0: \ 00000000 ........ LDR R0,??DataTable17 \ 00000004 000090E5 LDR R0,[R0, #+0] \ 00000008 000050E3 CMP R0,#+0 \ 0000000C FBFFFF0A BEQ ??OS_Idle_0 \ 00000010 ........ LDR R0,??DataTable17_1;; 0x40004044 \ 00000014 000090E5 LDR R0,[R0, #+0]!!!!!!!!!!!!!!!!!!!!!Вылетает тут \ 00000018 040010E3 TST R0,#0x4 \ 0000001C F7FFFF0A BEQ ??OS_Idle_0 400 { 401 PWR_CTRL &= 0xFFFFFFFB; \ 00000020 ........ LDR R0,??DataTable17_1;; 0x40004044 \ 00000024 000090E5 LDR R0,[R0, #+0]!!!!!!!!!!!!!!!!!!!!!или тут \ 00000028 0400D0E3 BICS R0,R0,#0x4 \ 0000002C ........ LDR R1,??DataTable17_1;; 0x40004044 \ 00000030 000081E5 STR R0,[R1, #+0] \ 00000034 F1FFFFEA B ??OS_Idle_0 402 //EMCDynamicRefresh = 0x6; // (64ms/8192)*13MHz/16 403 } При этом в R0 совсем не адрес PWR_CTRL. Это не проблема выравнивания получается как обычно бывает, а ошибка доступа к несуществуещему адресу Да ещё, имеется Код void myHookSub( void ) { PWR_CTRL_bit.HCKL_FORCE = 0;//возвращаемся в Run mode EMCDynamicRefresh = 0x32; } Тоесть таким образом я организовал режим пониженного потребления в Idle. Заметил если отключить DCACHE то проблема исчезает, но экран перерисовывается очень медленно. Если Idle перенести в SDRAM то тоже перестаёт вылетать. Если LowPowerEnable обьявляю в iRAM тоже проблема вроде уходит. Если контроллер кручу всегда в Direct Run режиме(13 Мгц кварц), или в Run то тоже не вылетает. Создаётся впечатление что кэширование както конфликтует в Direct Run и iRAM. Вообщем я запутался. Ещё эта проблема усугубляется если в настройках PLL на Периферию я даю деление 15.5 а не 16(так я подстроил частоту чтоб при переключении Direct Run UART работал на той же частоте, почемуто PLL не точно на 16 умножает). Конечно есть решение не крутить програму в iRAM и режим пониженного потребления сделать черех FORCE_HCLK(так тоже всё нормально, но дело в том что я собираюсь переводить контроллер в STOP который через Direct Run и в iRAM(SDRAM в авторефреш загоняю без проблем) и тоже клинит. Да и хочу понять почему не работает как положенно. Пользуюсь J-Link, J-Trace нет.