Seka 0 29 сентября, 2008 Опубликовано 29 сентября, 2008 · Жалоба Добрый день. Имеется 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 } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alliv 0 29 сентября, 2008 Опубликовано 29 сентября, 2008 · Жалоба Не скажу за UCoS и насчёт правильности обработчика(ов) прерываний, но VICIntSelect |= (1<<VicIntSource); Эта строчка несколько смущает.. В user_manual 2148 нет бита "VicIntSource" в регистре VICIntSelect:-). (чтобы переключить RTC прерывание на FIQ, очевидно должно быть написать VICIntSelect |= (1<<VIC_RTC) ). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GetSmart 0 29 сентября, 2008 Опубликовано 29 сентября, 2008 (изменено) · Жалоба __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 не писал и как он вызывает обработчики не знаю. Изменено 29 сентября, 2008 пользователем GetSmart Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 1 29 сентября, 2008 Опубликовано 29 сентября, 2008 · Жалоба И еще может кто подскажет насколько FIQ "тормозится" уКОСом. Следует ли как-то переделовать порт? (требуется чтоб 1 сек. импульсы на ножеке как можно меньше "плавали"). Судя по приведенным ошметкам - тормозится офигительно. По ним похоже на использование самого дебильного варианта BSP - там на FIQ с IRQ в одну кучу и на них тупо сохранение контекста навешано - на чем (стек-то какой для FIQ?) все это хозяйство и сыпется. До кучи в критической секции запрещаются и FIQ и IRQ - в общем от использоания FIQ, как от козла молока в этой реализации. Всю эту поделку без вариантов в мусорник. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GetSmart 0 30 сентября, 2008 Опубликовано 30 сентября, 2008 · Жалоба ...Грубиян :) Столько грубых слов в одном посте... -------------------- А про стек FIQ верно подмечено. Если его не выделить в нужном количестве, то как раз симптомы будут похожие - какое-то время может проработать, а потом упадёт вся прога или какой-нибудь тред. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 1 30 сентября, 2008 Опубликовано 30 сентября, 2008 · Жалоба Грубиян :) Реализм :( порты пишут кому не лень по принципу "работает-же". Насколько мне помнится, нормальный порт uCOS под LPC21xx не вызывающий сильно грубых слов был в проекте от AlexandrY http://aly.ogmis.lt/OpenProjects/ADP_LPC2148/ADP_LPC.htm Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Seka 0 30 сентября, 2008 Опубликовано 30 сентября, 2008 · Жалоба Эта строчка несколько смущает.. Тут все правильно, просто оно вынесено у менея в отдельную функцию - не хотел наварачивать пост. VICIntSelect |= (1<<VIC_RTC); // VICIntSelect |= (1<<VicIntSource); Тут в префиксе процедуры-обработчика надо писать __arm __irq Тут тоже вроде все правильно, RTC_ISR это просто функция котороя вызывается обработчиком уКоса OS_CPU_ExceptHndlr. Судя по приведенным ошметкам - тормозится офигительно Очень оптимистично :) Хотя FIQ и IRQ действительно в кучу свалено. Стек у меня: -D_FIQ_STACK_SIZE=256 Спасибо за ссылочку, когдатоя ее уже смотрел но подзабыл уже. Сам портироровать еже не научился, то попробую с тем портом. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Seka 0 30 сентября, 2008 Опубликовано 30 сентября, 2008 · Жалоба Насколько мне помнится, нормальный порт uCOS под LPC21xx не вызывающий сильно грубых слов был в проекте от AlexandrY Извините, а не подскажете где можна посмотреть Укос порт с "правильным" FIQ под LPC для IAR? (Предложеный Вами написан под Кейл, к тому-же FIQ там не используються :) ) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 1 30 сентября, 2008 Опубликовано 30 сентября, 2008 · Жалоба Извините, а не подскажете где можна посмотреть Укос порт с "правильным" FIQ под LPC для IAR? Отпортируйте, заодно немного ознакомитесь с потрохами. Я uCOS не пользуюсь - скромновата для ARM. В своей ветке FreeRTOS FIQ не задействую в системе, взаимодействие с которой при необходимости в стиле описанном AlexanderY. Сохранение контекста производится безусловно только для таймерного прерывания, остальные прерывания обрамляются сохранением контекста индивидуально только если из них существует необходимость использовать тяжелые системные вызовы переключения контекста. ... к тому-же FIQ там не используються :) Вот именно по причине НЕ использования FIQ Вы можете им ПОЛНОСТЬЮ пользоваться им для своих не связанных с системными вызовами ногодрыганиями. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Seka 0 1 октября, 2008 Опубликовано 1 октября, 2008 · Жалоба Спасибо. Идею понял, буду пробовать копать :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться