Перейти к содержанию
    

RTC FIQ в LPC2148

Добрый день.

 

Имеется LPC2148 на платке и кварц 32кГц для часов.

На LPC2148 поставил пример уКОСа, в настройках порта и стека ничего не менял.

Настороил RTC на внешний кварц 32кГц.

Установил FIQ на 1 секундное прерывание RTC, и дергаю в прерывании ножкой.

 

После запуска, некоторое время работает, а потом в дебагере попадаю на while(1){;}

с ошибкой "EXCEPT PREFETCH ABORT" :(

(пробовал делать источник 1 сек. прерыванй с TIMER0 - работает). В чем проблема?

 

И еще может кто подскажет насколько FIQ "тормозится" уКОСом. Следует ли как-то переделовать порт?

(требуется чтоб 1 сек. импульсы на ножеке как можно меньше "плавали").

 

void RTC_Init(void)
{
CCR_bit.CLKEN  = 0;    // RTC_Disable
CCR_bit.CLKSRC = 1;    // External 32kHz
CCR_bit.CTCRST = CCR_bit.CTTEST = 0; // test disable and reset
AMR=0xFF;
CIIR_bit.IMSEC = 1;    // Setup 1-SEC interrupt
ILR            = 0x03; // Clear RTC interrupt
CCR_bit.CLKEN  = 1;    // RTC_Enable

VICIntSelect |= (1<<VicIntSource);
VICIntEnable |= (1<<VIC_RTC);
}

__arm void RTC_ISR(void)
{
ILR = 0x03; // Clear RTC interrupt flag

IO0DIR |= (1<<29);
if(IO0PIN & (1<<29) ) IO0CLR = (1<<29);
                  else IO0SET = (1<<29);
}

void  OS_CPU_ExceptHndlr (CPU_INT32U  except_id)
{
CPU_FNCT_VOID  pfnct;

if(except_id == OS_CPU_ARM_EXCEPT_FIQ)  // FIQ
{
  RTC_ISR();
}
else
  if(except_id == OS_CPU_ARM_EXCEPT_IRQ) // IRQ
  {
   ...
  }
  else while(1){;}  // EXCEPT PREFETCH ABORT there
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не скажу за UCoS и насчёт правильности обработчика(ов) прерываний, но

 

VICIntSelect |= (1<<VicIntSource);

 

Эта строчка несколько смущает..

В user_manual 2148 нет бита "VicIntSource" в регистре VICIntSelect:-). (чтобы переключить RTC прерывание на FIQ, очевидно должно быть написать VICIntSelect |= (1<<VIC_RTC) ).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

__arm void RTC_ISR(void)
{
ILR = 0x03; // Clear RTC interrupt flag

IO0DIR |= (1<<29);
if(IO0PIN & (1<<29) ) IO0CLR = (1<<29);
                  else IO0SET = (1<<29);
}

Тут в префиксе процедуры-обработчика надо писать

__arm _fiq void RTC_ISR(void)

Ну или __arm __irq, они вроде бы одинаково действуют. Хотя на 100% не уверен про необходимость префикса __irq или __fiq. Под UCoS не писал и как он вызывает обработчики не знаю.

Изменено пользователем GetSmart

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И еще может кто подскажет насколько FIQ "тормозится" уКОСом. Следует ли как-то переделовать порт?

(требуется чтоб 1 сек. импульсы на ножеке как можно меньше "плавали").

Судя по приведенным ошметкам - тормозится офигительно. По ним похоже на использование самого дебильного варианта BSP - там на FIQ с IRQ в одну кучу и на них тупо сохранение контекста навешано - на чем (стек-то какой для FIQ?) все это хозяйство и сыпется. До кучи в критической секции запрещаются и FIQ и IRQ - в общем от использоания FIQ, как от козла молока в этой реализации.

Всю эту поделку без вариантов в мусорник.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

...
Грубиян :)

Столько грубых слов в одном посте...

--------------------

А про стек FIQ верно подмечено. Если его не выделить в нужном количестве, то как раз симптомы будут похожие - какое-то время может проработать, а потом упадёт вся прога или какой-нибудь тред.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Грубиян :)

Реализм :( порты пишут кому не лень по принципу "работает-же". Насколько мне помнится, нормальный порт uCOS под LPC21xx не вызывающий сильно грубых слов был в проекте от AlexandrY

http://aly.ogmis.lt/OpenProjects/ADP_LPC2148/ADP_LPC.htm

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Эта строчка несколько смущает..

Тут все правильно, просто оно вынесено у менея в отдельную функцию - не хотел наварачивать пост.

VICIntSelect |= (1<<VIC_RTC); // VICIntSelect |= (1<<VicIntSource);

 

Тут в префиксе процедуры-обработчика надо писать __arm __irq

Тут тоже вроде все правильно, RTC_ISR это просто функция котороя вызывается обработчиком уКоса OS_CPU_ExceptHndlr.

 

Судя по приведенным ошметкам - тормозится офигительно

Очень оптимистично :) Хотя FIQ и IRQ действительно в кучу свалено.

Стек у меня: -D_FIQ_STACK_SIZE=256

Спасибо за ссылочку, когдатоя ее уже смотрел но подзабыл уже.

Сам портироровать еже не научился, то попробую с тем портом.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Насколько мне помнится, нормальный порт uCOS под LPC21xx не вызывающий сильно грубых слов был в проекте от AlexandrY

Извините, а не подскажете где можна посмотреть Укос порт с "правильным" FIQ под LPC для IAR?

(Предложеный Вами написан под Кейл, к тому-же FIQ там не используються :) )

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Извините, а не подскажете где можна посмотреть Укос порт с "правильным" FIQ под LPC для IAR?

Отпортируйте, заодно немного ознакомитесь с потрохами. Я uCOS не пользуюсь - скромновата для ARM.

В своей ветке FreeRTOS FIQ не задействую в системе, взаимодействие с которой при необходимости в стиле описанном AlexanderY. Сохранение контекста производится безусловно только для таймерного прерывания, остальные прерывания обрамляются сохранением контекста индивидуально только если из них существует необходимость использовать тяжелые системные вызовы переключения контекста.

... к тому-же FIQ там не используються :)

Вот именно по причине НЕ использования FIQ Вы можете им ПОЛНОСТЬЮ пользоваться им для своих не связанных с системными вызовами ногодрыганиями.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...