Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: RTC FIQ в LPC2148
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > FreeRTOS
Seka
Добрый день.

Имеется LPC2148 на платке и кварц 32кГц для часов.
На LPC2148 поставил пример уКОСа, в настройках порта и стека ничего не менял.
Настороил RTC на внешний кварц 32кГц.
Установил FIQ на 1 секундное прерывание RTC, и дергаю в прерывании ножкой.

После запуска, некоторое время работает, а потом в дебагере попадаю на while(1){;}
с ошибкой "EXCEPT PREFETCH ABORT" sad.gif
(пробовал делать источник 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
}
avva
Не скажу за UCoS и насчёт правильности обработчика(ов) прерываний, но

VICIntSelect |= (1<<VicIntSource);

Эта строчка несколько смущает..
В user_manual 2148 нет бита "VicIntSource" в регистре VICIntSelect:-). (чтобы переключить RTC прерывание на FIQ, очевидно должно быть написать VICIntSelect |= (1<<VIC_RTC) ).
GetSmart
Код
__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 не писал и как он вызывает обработчики не знаю.
zltigo
Цитата(Seka @ Sep 29 2008, 11:50) *
И еще может кто подскажет насколько FIQ "тормозится" уКОСом. Следует ли как-то переделовать порт?
(требуется чтоб 1 сек. импульсы на ножеке как можно меньше "плавали").

Судя по приведенным ошметкам - тормозится офигительно. По ним похоже на использование самого дебильного варианта BSP - там на FIQ с IRQ в одну кучу и на них тупо сохранение контекста навешано - на чем (стек-то какой для FIQ?) все это хозяйство и сыпется. До кучи в критической секции запрещаются и FIQ и IRQ - в общем от использоания FIQ, как от козла молока в этой реализации.
Всю эту поделку без вариантов в мусорник.
GetSmart
Цитата(zltigo)
...
Грубиян smile.gif
Столько грубых слов в одном посте...
--------------------
А про стек FIQ верно подмечено. Если его не выделить в нужном количестве, то как раз симптомы будут похожие - какое-то время может проработать, а потом упадёт вся прога или какой-нибудь тред.
zltigo
Цитата(GetSmart @ Sep 30 2008, 08:27) *
Грубиян smile.gif

Реализм sad.gif порты пишут кому не лень по принципу "работает-же". Насколько мне помнится, нормальный порт uCOS под LPC21xx не вызывающий сильно грубых слов был в проекте от AlexandrY
http://aly.ogmis.lt/OpenProjects/ADP_LPC2148/ADP_LPC.htm
Seka
Цитата(avva @ Sep 29 2008, 15:55) *
Эта строчка несколько смущает..

Тут все правильно, просто оно вынесено у менея в отдельную функцию - не хотел наварачивать пост.
Код
VICIntSelect |= (1<<VIC_RTC); // VICIntSelect |= (1<<VicIntSource);


Цитата(GetSmart @ Sep 29 2008, 21:28) *
Тут в префиксе процедуры-обработчика надо писать __arm __irq

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

Цитата(zltigo @ Sep 29 2008, 23:47) *
Судя по приведенным ошметкам - тормозится офигительно

Очень оптимистично smile.gif Хотя FIQ и IRQ действительно в кучу свалено.
Стек у меня: -D_FIQ_STACK_SIZE=256
Спасибо за ссылочку, когдатоя ее уже смотрел но подзабыл уже.
Сам портироровать еже не научился, то попробую с тем портом.
Seka
Цитата(zltigo @ Sep 30 2008, 09:43) *
Насколько мне помнится, нормальный порт uCOS под LPC21xx не вызывающий сильно грубых слов был в проекте от AlexandrY

Извините, а не подскажете где можна посмотреть Укос порт с "правильным" FIQ под LPC для IAR?
(Предложеный Вами написан под Кейл, к тому-же FIQ там не используються smile.gif )
zltigo
Цитата(Seka @ Sep 30 2008, 16:11) *
Извините, а не подскажете где можна посмотреть Укос порт с "правильным" FIQ под LPC для IAR?

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

Вот именно по причине НЕ использования FIQ Вы можете им ПОЛНОСТЬЮ пользоваться им для своих не связанных с системными вызовами ногодрыганиями.
Seka
Спасибо. Идею понял, буду пробовать копать smile.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.