|
Здравствуйте, у меня это.. |
|
|
|
 |
Ответов
|
Jan 10 2010, 13:18
|
Участник

Группа: Участник
Сообщений: 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" на чём и споткнулся
|
|
|
|
|
Jan 12 2010, 09:14
|
Участник

Группа: Участник
Сообщений: 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 запрограммить?
|
|
|
|
|
Jan 13 2010, 09:43
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(Tanker @ Jan 12 2010, 13:14)  ... 1) Таймер1 (Т1) заходит в прерывание каждые 1 сек и находится в прерывнии 1 сек (если его не прерывают другие) ... Знаете почему так мало ответов? Просто нет слов! Думаю, что другие испытывают схожие чувства. Прочитайте сами своё предложение... Вам не кажется, что это можно записать проще: "находится в этом прерывании непрерывно". Так, а чем оно тогда от головы отличается?! Так назначьте ему найнизший приоритет (собственно это и не надо), и сделайте там лишь одну операцию - взведите там флаг секунды. А обработчик перенесите в голову и обрабатывайте по флагу. И 0.1 сек - гиганское сремя для 60 МГц процессора! Тоже что-то не бъётся. Короче - вам надо полностью переосмыслить логику работы программы!
|
|
|
|
|
Jan 15 2010, 22:38
|

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

|
Цитата(SasaVitebsk @ Jan 13 2010, 11:43)  Думаю, что другие испытывают схожие чувства. Один в один, именно как вы и говорите - слов нет... Цитата я предлагал СИНТЕТИЧЕСКИЙ ТЕСТ Афтар ! это не синтетический тест, а еретический. Вы еще delay_ms(1000) в каждый обработчик прерывания не забудьте воткнуть, тогда их все можно будет сделать "__nested" !
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|