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

 
 
 
Reply to this topicStart new topic
> RTC FIQ в LPC2148, Работает, но не долого, почему?
Seka
сообщение Sep 29 2008, 09:50
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 18
Регистрация: 7-06-07
Из: Украина
Пользователь №: 28 265



Добрый день.

Имеется 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
}
Go to the top of the page
 
+Quote Post
avva
сообщение Sep 29 2008, 12:55
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 21
Регистрация: 15-02-07
Из: Москва
Пользователь №: 25 386



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

VICIntSelect |= (1<<VicIntSource);

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


--------------------
С уважением,
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Sep 29 2008, 18:28
Сообщение #3


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Код
__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 - Sep 29 2008, 18:38


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Sep 29 2008, 20:47
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Seka @ Sep 29 2008, 11:50) *
И еще может кто подскажет насколько FIQ "тормозится" уКОСом. Следует ли как-то переделовать порт?
(требуется чтоб 1 сек. импульсы на ножеке как можно меньше "плавали").

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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Sep 30 2008, 06:27
Сообщение #5


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



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


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Sep 30 2008, 06:43
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(GetSmart @ Sep 30 2008, 08:27) *
Грубиян smile.gif

Реализм sad.gif порты пишут кому не лень по принципу "работает-же". Насколько мне помнится, нормальный порт uCOS под LPC21xx не вызывающий сильно грубых слов был в проекте от AlexandrY
http://aly.ogmis.lt/OpenProjects/ADP_LPC2148/ADP_LPC.htm


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Seka
сообщение Sep 30 2008, 07:33
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 18
Регистрация: 7-06-07
Из: Украина
Пользователь №: 28 265



Цитата(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
Спасибо за ссылочку, когдатоя ее уже смотрел но подзабыл уже.
Сам портироровать еже не научился, то попробую с тем портом.
Go to the top of the page
 
+Quote Post
Seka
сообщение Sep 30 2008, 14:11
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 18
Регистрация: 7-06-07
Из: Украина
Пользователь №: 28 265



Цитата(zltigo @ Sep 30 2008, 09:43) *
Насколько мне помнится, нормальный порт uCOS под LPC21xx не вызывающий сильно грубых слов был в проекте от AlexandrY

Извините, а не подскажете где можна посмотреть Укос порт с "правильным" FIQ под LPC для IAR?
(Предложеный Вами написан под Кейл, к тому-же FIQ там не используються smile.gif )
Go to the top of the page
 
+Quote Post
zltigo
сообщение Sep 30 2008, 18:13
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Seka @ Sep 30 2008, 16:11) *
Извините, а не подскажете где можна посмотреть Укос порт с "правильным" FIQ под LPC для IAR?

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

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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Seka
сообщение Oct 1 2008, 05:45
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 18
Регистрация: 7-06-07
Из: Украина
Пользователь №: 28 265



Спасибо. Идею понял, буду пробовать копать smile.gif
Go to the top of the page
 
+Quote Post

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

 


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


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