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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Запрет/Разрешение прерываний в кольцевых буферах, Как правильно и оптимально?
Smallday
сообщение Jun 18 2008, 03:11
Сообщение #1


Участник
*

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



Пожалуйста, подскажите как правильно и оптимально Запрешать/Разрешать прерывания при работе с программыми буферами устройств. Попробовал несколько вариантов:
1)
cpsr=DisableIRQ();

.... // работа с буфером

RestoreIRQ(cpsr);
2)
VICIntEnClr = 1 << UART0_INT;

.... // работа с буфером

VICIntEnable = 1 << UART0_INT;
3)
cpsr=DisableIRQ();
U0IER &= ~UIER_ETBEI;
RestoreIRQ(cpsr);

.... // работа с буфером

cpsr=DisableIRQ();
U0IER |= UIER_ETBEI;
RestoreIRQ(cpsr);

Второй случай давал сбои и зависание на LPC2138, а вот на LPC2368 работаспособен..

Сообщение отредактировал Smallday - Jun 18 2008, 03:18
Go to the top of the page
 
+Quote Post
sensor_ua
сообщение Jun 18 2008, 05:29
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387



запрет источника прерывания приводит к потере запроса прерывания, возникшего во время запрета. При глобальном запрещении прерываний запросы прерываний взводят флаги, и если они не сброшены до глобального разрешения прерываний, то после разрешения срабатывает логика контроллера прерваний и вызываются соответствующие обработчики в установленном этой логикой порядке (логика зависит от типа контроллера прерываний или конкретного решения конкретного микроконтроллера, а общий механизм един для процессорных систем). Так что второй вариант не годится.
ИМХО, в русском техническом языке существуют как минимум такие понятия как источник прерывания, запрос прерывания, контроллер прерывания, обработчик прерывания, а вот само слово прерывание в разных контекстах обозначает разное сочетание этих понятий (к моему сожалению всё чаще русскоязычные словосочетания забываются и с английского переводится без учёта контекста). А глобальное разрешение прерываний грубо относится к "кнопке" управления контроллера прерываний со стороны процессора (ядра), которая в случае запрета на время как бы придерживает выдачу запроса прерывания от контроллера прерывания к ядру (в случае с ARM это, например, IRQ со своим запретом и FIQ со своим запретом).
Что касается буферов, то они бывают разными и есть варианты построения и дисциплины работы, не требующие запрета прерываний.
Что касается вариантов 1 и 3, то существуют разные подходы в части использования и способов входа/выхода в/из критических секций и это отдельный вопрос, по которому на форуме было достаточно много обсуждений.


--------------------
aka Vit
Go to the top of the page
 
+Quote Post
tag
сообщение Jun 18 2008, 05:53
Сообщение #3


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

Группа: Свой
Сообщений: 151
Регистрация: 21-02-06
Пользователь №: 14 561



Цитата(sensor_ua @ Jun 18 2008, 09:29) *
запрет источника прерывания приводит к потере запроса прерывания, возникшего во время запрета.


...Вы уверены? Потеря запроса прерывания может произойти в том случае если имеется запрос на данный момент времени (по каким либо причинам не получивший обработку) и появился следующий запрос от этого же источника прерывания. Таким образом риск потери запроса прерывания возникает в том случае когда время обработки прерывания (и/или время реакции на прерывание) превышает минимально-возможное время между двумя запросами.
Go to the top of the page
 
+Quote Post
sensor_ua
сообщение Jun 18 2008, 06:13
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387



Цитата
...Вы уверены?

Абсолютно. Толко я чуть ошибся с контекстом. Читать "запрет обработки запроса прерывания", хотя и при запрете источника будет так же не работать.
Вопрос же скорости обработки запросов и их потерь при неуспевании, ИМХО, суть другой вопрос.


--------------------
aka Vit
Go to the top of the page
 
+Quote Post
tag
сообщение Jun 18 2008, 06:19
Сообщение #5


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

Группа: Свой
Сообщений: 151
Регистрация: 21-02-06
Пользователь №: 14 561



Цитата(sensor_ua @ Jun 18 2008, 10:13) *
Читать "запрет обработки запроса прерывания",


мне кажется сути это не меняет. А вы попробуйте запретить прервание по приему от UART и отправьте на него символ, а потом разрешите прерывание и посмотрите что получится
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 18 2008, 06:44
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(sensor_ua @ Jun 18 2008, 09:29) *
запрет источника прерывания приводит к потере запроса прерывания, возникшего во время запрета.

Да ну?! Посмотрите хотя бы картинку Interrupt request logic в описании VIC'а.
Go to the top of the page
 
+Quote Post
sensor_ua
сообщение Jun 18 2008, 07:19
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387



Цитата
Посмотрите хотя бы картинку Interrupt request logic в описании VIC'а.

Смотрю документ
http://infocenter.arm.com/help/topic/com.a...81e/DDI0181.pdf Figure 2-2 и триггеров не наблюдаю. Читаем до того на стр. 20 примечание
The VIC does not handle interrupt sources with transient behavior. For example, an
interrupt is asserted and then deasserted before software can clear the interrupt source. ... However, when a transient interrupt occurs, the priority logic of
the VIC is not set ...
Может я, конечно чего не понимаю, но в LPC2138, например, для источника прерывания по ExtInt проложен регистр (триггеры) ДО VIC (смотрю UM LPC2138 раздел 5-2 External Interrupt Flag register) и если выходы таких регистров служат запросами прерывания, то, естественно, если триггер не сбросишь, то запросы прерывания на соответствующих входах Interrupt Request Logic VIC будет активны.


--------------------
aka Vit
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 18 2008, 07:30
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(sensor_ua @ Jun 18 2008, 11:19) *
Смотрю документ
http://infocenter.arm.com/help/topic/com.a...81e/DDI0181.pdf Figure 2-2 и триггеров не наблюдаю.

Зато у UART'а они имеются, как и у >90% других источников.

Просто ваши слова можно было истолковать так, как будто в ситуации "запретили прерывание->получили запрос->разрешили прерывание" запрос будет в любом случае потерян, что неверно.
Go to the top of the page
 
+Quote Post
Rst7
сообщение Jun 18 2008, 09:56
Сообщение #9


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Цитата
Что касается буферов, то они бывают разными и есть варианты построения и дисциплины работы, не требующие запрета прерываний.


А можно примерчик такого?


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
tag
сообщение Jun 18 2008, 11:37
Сообщение #10


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

Группа: Свой
Сообщений: 151
Регистрация: 21-02-06
Пользователь №: 14 561



Цитата(Rst7 @ Jun 18 2008, 13:56) *
А можно примерчик такого?


...вот пример кольцевого буфера не требующего запрета прерываний

struct
{
U8 in;
U8 out;
U8 data [256];
} buf;


void init_buf(void)
{
buf.in = buf.out;
}



void isr_rx(void)
{
U8 c;
...

if ((U8)(buf.in + 1) != buf.out) buf.data [buf.in++] = c;
else return;
}


void main(void)
{
U8 c;

...

if (buf.in != buf.out) c = buf.data[buf.out++];

...

}

Go to the top of the page
 
+Quote Post
Rst7
сообщение Jun 18 2008, 12:02
Сообщение #11


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Цитата
..вот пример кольцевого буфера не требующего запрета прерываний


Да, такая конструкция работает. По причине атомарности добавления. А вот аналогиная передача - работать не будет.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
rezident
сообщение Jun 18 2008, 14:21
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Для кольцевых буферов я лично использую два индекса - один индекс для чтения, другой для записи. Ну и счетчик еще. Счетчик индицирует количество элементов в буфере. При записи сначала происходит запись в буфер, затем инкремент индекса, затем инкремент счетчика. При чтении - сначала извлечение из буфера, затем декремент счетчика, затем инкремент индекса. Естественно при изменениях и индексы и значение счетчика каждый раз проверяются на выход за границы диапазона буфера.
Go to the top of the page
 
+Quote Post
Rst7
сообщение Jun 18 2008, 16:37
Сообщение #13


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



А можно пример кода?


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
mdmitry
сообщение Jun 18 2008, 16:50
Сообщение #14


Начинающий профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648



Идея кольцевых буферов и код есть в avr-lib. У меня на его основе сделаны кольцевые буферы USART, но для AVR. Идею можно перенести на любую платформу.


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post
Rst7
сообщение Jun 18 2008, 17:11
Сообщение #15


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Цитата
Идея кольцевых буферов и код есть в avr-lib


Да где ее только нет. Я и сам могу десяток реализаций разных сделать (и делал). Я к тому веду, что в общем случае, при работе с кольцевыми буферами необходима атомарная RMW-операция с памятью хотя-бы в одном месте. С учетом того, что на RISC-процах нет столь любимого на PDP11 INC и DEC прямо ячейки памяти, получается, что необходимо уметь запрещать/разрешать прерывания (или переключение задач в общем случае). Кстати, в ARM есть комманда SWP для управления семафорами (она как раз RMW), только я не могу пока придумать, как ее использовать для циклических буферов.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post

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

 


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


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