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

 
 
> Здравствуйте, у меня это..
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 13 2010, 10:23
Сообщение #3


Участник
*

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



Здравствуйте!
всё заработало.
В основном цикле while (1); я счастлив. 100% рабочего кода в прерываниях!
Помог совет Сергей Борщ (Слава Ему!) в топике Старт c IAR+Sam7x
1) Исправил стартап
EXTERN VICADDRESS
...
org 0x18
LDR PC, VICADDRESS
2) все обработчики обозначил __irq __arm
3) а то тормозное прерывание которое я не хочу переводить в основной цикл! описал как __irq __nested __arm. И в нём же, сделал __enable_interrupt(); - именно перед тем местом где заходит на длительный разбор пакетов, естественно приняты меры, чтобы небыло повторного вызова до окончания обработки
4) расставил приоритеты прерываниям: быстрым 0, чуть приторможенным 1, а тому тормозному 2

5) планирую в юартах использовать FIFO 16байт, для саморазвития, острая необходимость отпала

Про ошибку 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" которую я получал, всё просто, у меня в main был "типовой" обработчик с соответствующими атрибутами размещения # pragma vector=IRQV
__irq __arm void irq_handler (void){....}
убрал его, ошибка пропала.

SasaVitebsk! я предлагал СИНТЕТИЧЕСКИЙ ТЕСТ для изучения проблемы.
Go to the top of the page
 
+Quote Post

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


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

 


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


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