|
|
  |
Вложенные прерываня |
|
|
|
Jul 8 2006, 13:48
|
Местный
  
Группа: Свой
Сообщений: 421
Регистрация: 25-12-04
Пользователь №: 1 675

|
Цитата(aaarrr @ Jul 8 2006, 17:06)  Могли бы уже и сами посмотреть список команд для архитектуры V4. Нет там прямой замены. Знаю, что нет, поэтому (повторю вопрос) Написал такое, но асм для ARM я почти не знаю, может кто подскажет как оптимизировать? /* in: r3 - bit mask */ /* out: r1 - int num */ MOV r1,#0 findirqstart: AND r4, a3, #1 CMP r4, #0 BNE findirqend ADD r1, r1, #1 MOV r3, r3, lsr #1 B findirqstart findirqend: Про таблицу не понял, ну младшую 1 выделить не сложно, а дальше...
|
|
|
|
|
Jul 8 2006, 14:00
|

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

|
Цитата(Andrew2000 @ Jul 8 2006, 16:48)  Про таблицу не понял, ну младшую 1 выделить не сложно, а дальше... Таблица содержащая номер бита или _сразу_ указатель на функцию. Если предполагается работа с полноразрядным числом, то можно для экономии размера таблицы использовать сокращенную 16, 8 или 4 битную. 0x0 ? 0x1 0 0x2 1 0x3 0 0x4 2 0x5 0 0x6 1 0x7 0 0x8 3 0x9 0 ......
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jul 8 2006, 15:22
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(zltigo @ Jul 8 2006, 16:38)  Не коварнее организации вложенных прерываний на любом другом процессоре, но проектировать систему со вложенными прерываниями действительно нужно только в случае крайней необходимости. Ага. Скажите прямо, проектировать систему в которой будут сидеть на прерываниях более одного периферийного устройства крайне опасно. Бог его знает, что может произойти. И если в моей программе вдруг потребовалось одновременно обрабатывать все 8 capture-входов, PWM, два UARTа, RTC и пару вшешних прерываний, то это ну очень крайняя необходимость, которая у других никогда не возникает. Причём всё бы ничего, если бы capture не требовали максимально быстрого отклика. А так пришлось все прерывания кроме них сделать вложенными. Гордится этим? Слишком мелко как-то. Я бы гордился скажем 20-ю вложенными прерываниями. Если у вас ничего интересного нет по поводу смешивания вложенных и невложенных прерываний и как с помощью их комбинаций можно оптипизировать систему в целом, то можете говорить и дальше что это плохо и неразумно. Многие с удовольствием послушают.
Сообщение отредактировал GetSmart - Jul 8 2006, 15:26
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Jul 8 2006, 15:52
|

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

|
Цитата(GetSmart @ Jul 8 2006, 18:22)  И если в моей программе вдруг потребовалось одновременно обрабатывать все 8 capture-входов, PWM, два UARTа, RTC и пару вшешних прерываний, то это ну очень крайняя необходимость, которая у других никогда не возникает. Причём всё бы ничего, если бы capture не требовали максимально быстрого отклика. А так пришлось все прерывания кроме них сделать вложенными. Ну и где в описанной системе 8 "УРОВНЕЙ ВЛОЖЕННОСТИ" помянутые в ПЕРВОНАЧАЛЬНОМ посте??? В этом черным по белому описан вариант одного уровня, причем его наличие обосновано, хотя и не понятно, почему-бы не использовать для CAP FIQ, если конечно у Вас не дебильноватый контроллер типа STR7..... В принципе именно армовские IRQ+FIQ без дополнительной организации вложенности достаточно хорошо закрывают массу вариантов применения, в том числе и описанный Вами.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jul 8 2006, 17:38
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(zltigo @ Jul 8 2006, 21:52)  Ну и где в описанной системе 8 "УРОВНЕЙ ВЛОЖЕННОСТИ" помянутые в ПЕРВОНАЧАЛЬНОМ посте??? Собственно 8 уровней мне не надо было. Они возникают сами по себе при объявлении любого прерывания __nested. Поэтому если в системе 8 прерываний, 2 простых, 6 __nested, то если никак дополнительно не извращаться, будут именно 7 уровней вложенности. А теперь почему они сделаны __nested. Например, после приёма байта по UARTпрямо в прерывании вызывается драйвер связи, который может долго не возвращать управление, ну скажем до 100 мкс. Всё это время он не мешает никаким прерываниям с более высоким приоритетом. А в некоторых случаях (приём полного пакета) он ещё и взводит софтовое прерывание с более низким приоритетом. Так, что как только это прерывание завершится и если ничего более важного не произойдёт, управление вернётся не в основную прогу, а в софтовое прерывание связи. В нём вообще может управление застрять на десятки миллисекунд. И никто не обломается! Никаких критических секций и прочих извращений для этого применять не нужно вообще. Всё продумано и очень просто в применении. Бояться вложенных прерываний - в лес не ходить. Насчёт FIQ'ов, я всё прекрасно знал. И всё-таки решил сделать так. Всё написано на Си, никаких макросов.
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Jul 8 2006, 18:41
|

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

|
Цитата(GetSmart @ Jul 8 2006, 20:38)  Они возникают сами по себе при объявлении любого прерывания __nested. Когда что-то "возникает само по себе" это не радует :-(. А реально никто не мешает для описанного Вами случая в __nested запретить прерывание одного __nested другим ввиду ПОЛНОЙ НЕНУЖНОСТИ сего действия. И я не назвал-бы это "извращением" - напротив. Если-бы в ARMообразных контроллерах могли назначаться одинаковые приоритеты для разных источников, то это вообще реализовывалось без каких-либо дополнительных телодвижений. Цитата А теперь почему они сделаны __nested. Это не нуждается в дополнительных объяснениях - "надо быстро реагировать на CAP" было вполне достаточно. Цитата Бояться вложенных прерываний - в лес не ходить. Я не призываю их бояться я сам их использую, просто их не надо использовать без необходимости и уж точно бороться с возникающими "сами по себе" побочными эффектами в виде вложенности в местах, где это без надобности. Ибо, как минимум, ведет к дополнительным затратам временных ресурсов и памяти. При этом можно получить неожиданные проблемы (особенно при дописывании через годик-другой) при работе обработчиков с общими ресурсами. При совсем уже чрезмерном увлечении длинными вложенными обработчиками можно и повторный вызов обработчика схлопотать, от которого тоже надо защиту вписывать. В общем оно это надо без крайней необходимости? Цитата Насчёт FIQ'ов, я всё прекрасно знал. И всё-таки решил сделать так. Т.е. для конкретного описанного случая запутаннее и тормознее :-( без явной на то необходимости, а только по причине наличия в EWARM удобного ключевого слова __nested :-(.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jul 8 2006, 19:32
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата можно и повторный вызов обработчика схлопотать Повторный вызов не схлопотать. Запрещаются все приоритеты равные и ниже текущего. А то, что нельзя делать одинаковые приоритеты я и сам жалею. Помню как удобно было на 51/52 процах с трёхуровневой системой прерываний. Быстро и удобно. В данном вопросе только один минус - лишняя многоуровневость. Но гораздо больше плюсов. Особенно быстрое время реакции на все прерывания с учётом приоритетов. А медленные софтверные прерывания вообще не сделать без вложенности. Цитата просто их не надо использовать без необходимости Не-а. Я бы советовал не использовать обычные прерывания без особой необходимости. Особенно длинные или использующие много стека.
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Jul 8 2006, 20:02
|

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

|
Цитата(moonrock @ Jul 8 2006, 22:37)  мой компилятор(keil uVision) не знает ключевое слово __nested, чем вы пользуетесь? 1. Я не полльзуюсь Keil. 2. А зачем своими руками выдрав и отпостив из кейловских рекомендаций два макроса спрашивать чем пользоваться в Keil??? Не сильно страшно? Цитата(GetSmart @ Jul 8 2006, 22:32)  Не-а. Я бы советовал не использовать обычные прерывания без особой необходимости. Особенно длинные или использующие много стека. Без коментариев.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jul 8 2006, 20:02
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Я старым (уже) IAR 4.20 Тут где-то выкладывали ссылку на 4.30, а может даже и на 4.40. Цитата(zltigo @ Jul 9 2006, 02:02)  Без коментариев. Без коментариев.
Сообщение отредактировал GetSmart - Jul 8 2006, 20:05
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
  |
3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0
|
|
|