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

 
 
> Здравствуйте, у меня это..
Step_ARM
сообщение Jun 23 2009, 05:43
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 132
Регистрация: 11-07-08
Пользователь №: 38 870



Половину не понял из того, что написано...
Хотя вопрос сильно интересует.
Проц. LPC2364
INT2(Р2.12) & INT3(Р2.13) подключены как счетные входы. Частоты примерно 400-500 Гц и 200-250Гц.

Обработчики такие:

__irq __nested __arm void EINT2_Handler (void)
{
EXTINT|= EINT2; /* clear interrupt */
__enable_interrupt(); /* handles nested interrupt */
//***********************************************************

ssf_o++;

//***********************************************************
VICVectAddr = 0; /* Acknowledge Interrupt */
}
__irq __nested __arm void EINT3_Handler (void)
{

EXTINT|= EINT3; /* clear interrupt */
__enable_interrupt(); /* handles nested interrupt */
//***********************************************************
count_msr++;


//***********************************************************
VICVectAddr = 0; /* Acknowledge Interrupt */
}

Короче работает только один счетчик , прерывание которого имеет больший приоритет.
Если убираю _nested и __enable_interrupt(); дела не меняет, тоже самое.

Тоже самое на 51-х, Меге и NEC работает прекрасно. Вопрос КАК извернуться? Объясните, пожалуйста , что не так...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Tanker
сообщение Jan 10 2010, 13:18
Сообщение #2


Участник
*

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



Здравствуйте, у меня это.. LPC2364 и IAR 4.42A (32kB лимит)

В программе, 2 UARTa тянут данные из одной области памяти (каждый интерфейс использует MODBUS RTU, в связи с чем, есть прерывания от UART (RX,TX) и от таймера (считает FrameEnd,TimeOut, DIR - переключение драйвера RS485 с приёма на передачу), т.е. образуется группа UART/TIMER) самая длительная операция - разбор принятого пакета (ну там CRC16 посчитать и т.п.)
Добавятся прерывания от АЦП, ШИМа и ещё 2-х таймеров.
Само собой запросы данных поступают асинхронно, и я вижу (наблюдаю на монике осциллограммы полученные от разных интерфейсов) что когда настроенный на более высокий приритет группа UART/TIMER включается в работу, та что с менее высоким- заметно подтормаживает, если задать им одинаковый приоритер, то "дёргаются" оба - теряют байты в основном. По отдельности работают отлично.
Перевожу прогу с MCS51-го, там всё работает идеально (и на асме была прога, и вот сейчас на Сях, одинаково отличный результат) и в основном цикле почти пусто, 99% кода работает в прерываниях.
Если я сейчас 4-ре прерывания подружить не могу, что дальше будет? На 51-м же они друг другу не мешают, ни разу ни где в проге прерывния не запрещал (только при записи флэшки)
Смотрел и много читал о __nested
В арме я так понял пока выполняется IRQ, другие обработчики не могут выполнятся, что теоретически приводит к пропаданиям события прерывания и сбою алгоритма что я у себя и наблюдаю. Пока надежда на __nested и Ваши советы.
Быстродействия АРМа должно с огромным запасом хватать для этой задачи.
Хочу начать с того, как в стартапе прописать код "прыгающий" сразу на мои вектора? тут был пример для SAM
но в асме пока не силён поковырял cstartup.s79 куда там что добавить?
сделал
EXTERN VICADDRESS
..................................................................
org 0x18
; ldr pc,[pc,#24] ; Branch to irq_handler
ldr pc,VICADDRESS ; Branch to irq_handler VICADDRESS-содержит адрес обработчика
при линковке получил ошибку
Warning[w52]: More than one definition for the byte at address 0x18 in common segment INTVEC. It is defined in module "main" as well as in module "?RESET"
на чём и споткнулся
Go to the top of the page
 
+Quote Post
Tanker
сообщение Jan 12 2010, 09:14
Сообщение #3


Участник
*

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



Почитал (по данному pdf я в 2003-м впервые получил опыт на LPC (вообще ARM) моргания светиком по прер. таймера и впервые на GCC!! ностальжи), в т.ч. забугорные форумы (понравилось как на кейле, одного индуса, с аналогичным вопросом, оставили без ответа, при этом куча советов "так программировать нельзя!!!")
Думаю мой трабл в том, что такие низкоуровневые вещи в разных компиляторах достигаются разными путями... в итоге в голове полная каша.
Нужен яркий пример.
Возьмем синтетический тест
0) Прерывание до выхода из своего обработчика не может сработать повторно (скажем таймер 2 останавливает свою работу при входе в обработчик, и возобновляет перед выходом их обработчика)
1) Таймер1 (Т1) заходит в прерывание каждые 1 сек и находится в прерывнии 1 сек (если его не прерывают другие)
2) Таймер2 (Т2) заходит в прерывание каждые 0,1 сек и находится в прерывнии 0,1 сек (если его не прерывают другие)
3) Таймер3 (Т3) заходит в прерывание каждые 0,1 сек и находится в прерывнии 0,1 сек (если его не прерывают другие)
4) нужно чтобы во время нахождения Т1(T2,T3) в обработчике прерывания, Т2(T1,T3) мог войти в свой обработчик, выполнить его, вернуться в обработчик Т1(T2,T3)
Как это в терминах IAR запрограммить?
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Jan 13 2010, 09:43
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(Tanker @ Jan 12 2010, 13:14) *
...
1) Таймер1 (Т1) заходит в прерывание каждые 1 сек и находится в прерывнии 1 сек (если его не прерывают другие)
...

Знаете почему так мало ответов? Просто нет слов! Думаю, что другие испытывают схожие чувства.

Прочитайте сами своё предложение... Вам не кажется, что это можно записать проще: "находится в этом прерывании непрерывно". Так, а чем оно тогда от головы отличается?!

Так назначьте ему найнизший приоритет (собственно это и не надо), и сделайте там лишь одну операцию - взведите там флаг секунды. А обработчик перенесите в голову и обрабатывайте по флагу.

И 0.1 сек - гиганское сремя для 60 МГц процессора! Тоже что-то не бъётся.

Короче - вам надо полностью переосмыслить логику работы программы!
Go to the top of the page
 
+Quote Post
defunct
сообщение Jan 15 2010, 22:38
Сообщение #5


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(SasaVitebsk @ Jan 13 2010, 11:43) *
Думаю, что другие испытывают схожие чувства.

Один в один, именно как вы и говорите - слов нет...


Цитата
я предлагал СИНТЕТИЧЕСКИЙ ТЕСТ

Афтар !
это не синтетический тест, а еретический.
Вы еще delay_ms(1000) в каждый обработчик прерывания не забудьте воткнуть, тогда их все можно будет сделать "__nested" !
Go to the top of the page
 
+Quote Post

Сообщений в этой теме


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

 


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


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