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

 
 
> Запрет/Разрешение прерываний в кольцевых буферах, Как правильно и оптимально?
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
 
Start new topic
Ответов
Rst7
сообщение Jun 18 2008, 12:02
Сообщение #2


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

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



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


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


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


кекс
******

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



Цитата(Rst7 @ Jun 18 2008, 15:02) *
>> if ((U8)(buf.in + 1) != buf.out) buf.data [buf.in++] = c;

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


Это еще почему?! Еще как будет работать. По причине того что in++ делается уже после того как байт добавлен в очередь.

Предположим передатчик прервал фоновую задачу в любой момент выполнения

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

Если индекс "in" соответвует разрядности процессора, и будет записан в память одной командой ST тогда будем иметь только три возможные комбинации в обработчике прерывания:

buf.in == buf.out нет новых данных (ничего не отправлено)
buf.in == buf.out есть новые данные (ничего не отправлено, т.к. индексы говорят об отсутсвии данных)
buf.in != buf.out есть новые данные (берем сколько можно пока out != in)

Все комбинации безопасны.

Ранее чем изменится индекс in, передатчик не сможет определить, что байт был добавлен в буфер, соответвенно ничего лишнего или частично положенного не вытянет.

Для работоспособности этой конструкции необходимо
- чтобы данные шли всегда из одного и того же источника (задачи)
- забирались всегда одним и тем же адресатом (задачей)
(источник и адресат - могут быть разными задачами)
и достаточно атомарности обновления индекса (запись одной командой ST), т.е. индекс не может быть большей разрядности чем разрядность регистров процессора. Все остальное не важно.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Smallday   Запрет/Разрешение прерываний в кольцевых буферах   Jun 18 2008, 03:11
- - sensor_ua   запрет источника прерывания приводит к потере запр...   Jun 18 2008, 05:29
|- - tag   Цитата(sensor_ua @ Jun 18 2008, 09:29) за...   Jun 18 2008, 05:53
|- - aaarrr   Цитата(sensor_ua @ Jun 18 2008, 09:29) за...   Jun 18 2008, 06:44
- - sensor_ua   Цитата...Вы уверены? Абсолютно. Толко я чуть ошибс...   Jun 18 2008, 06:13
|- - tag   Цитата(sensor_ua @ Jun 18 2008, 10:13) Чи...   Jun 18 2008, 06:19
- - sensor_ua   ЦитатаПосмотрите хотя бы картинку Interrupt reques...   Jun 18 2008, 07:19
|- - aaarrr   Цитата(sensor_ua @ Jun 18 2008, 11:19) См...   Jun 18 2008, 07:30
- - Rst7   ЦитатаЧто касается буферов, то они бывают разными ...   Jun 18 2008, 09:56
|- - tag   Цитата(Rst7 @ Jun 18 2008, 13:56) А можно...   Jun 18 2008, 11:37
|- - tag   Цитата(Rst7 @ Jun 18 2008, 16:02) Да, так...   Jun 19 2008, 05:20
|- - tag   ...скажу даже больше, так реализован обмен с модем...   Jun 19 2008, 05:26
- - rezident   Для кольцевых буферов я лично использую два индекс...   Jun 18 2008, 14:21
- - Rst7   А можно пример кода?   Jun 18 2008, 16:37
- - mdmitry   Идея кольцевых буферов и код есть в avr-lib. У мен...   Jun 18 2008, 16:50
- - Rst7   ЦитатаИдея кольцевых буферов и код есть в avr-lib ...   Jun 18 2008, 17:11
- - AHTOXA   Цитата(rezident @ Jun 18 2008, 20:21) Для...   Jun 18 2008, 17:38
- - Rst7   ЦитатаЭто еще почему?! Еще как будет работать....   Jun 19 2008, 05:25


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

 


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


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