реклама на сайте
подробности

 
 
> Data-abort на LPC3250, вылетает при определённых условиях
scorp2011
сообщение Sep 25 2011, 09:55
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 72
Регистрация: 29-01-11
Пользователь №: 62 559



Здравствуйте. У меня такая проблема, никак не могу понять от чего.
Система с 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 нет.

Сообщение отредактировал scorp2011 - Sep 25 2011, 10:05
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 19:56
Рейтинг@Mail.ru


Страница сгенерированна за 0.01343 секунд с 7
ELECTRONIX ©2004-2016