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

 
 
> Глобальное прерывание, возможно ли?
Yaumen
сообщение Nov 5 2009, 13:32
Сообщение #1


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

Группа: Свой
Сообщений: 187
Регистрация: 22-06-05
Из: Минск, Беларусь
Пользователь №: 6 213



В очередной раз натолкнулся на проблему. В этот раз связанную с прерываниями.

В частности, для обмена через CAN, я организовал очередь сообщений, которая пополняется вызовом метода AddMessage, а освобождается по прерыванию от CAN. Проблема возникла из-за того, что и метод AddMessage и обработчик модифицируют одну и ту же область памяти, поэтому встречается случай когда они пытаются сделать это одновременно, а это недопустимо. Как одно из решений - это запретить прерывание на момент работы метода AddMessage, однако я не смог найти флаг глобального разрешения и запрещения прерывания. Попытка "игры" с флагами прерывания CAN приводит к тому, что события происходящие во время запрета прерываний, не фиксируются вовсе, т.е. в этом процессоре флаги прерывания выставляются только если установлено разрешение по прерыванию.

Есть ли решение в этой ситуации или надо полностью менять подход при работе с очередью?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
sergeeff
сообщение Nov 6 2009, 17:24
Сообщение #2


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

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Действительно не дурно!
Go to the top of the page
 
+Quote Post
Yaumen
сообщение Nov 10 2009, 07:13
Сообщение #3


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

Группа: Свой
Сообщений: 187
Регистрация: 22-06-05
Из: Минск, Беларусь
Пользователь №: 6 213



Я извиняюсь, за отсутствие в собственно созданной теме. Тема была перенесена модератором и я не сразу сообразил что произошло и куда перенеслось.

Теперь относитьно вопроса. Я сейчас работаю с LPC2366 поэтому этот вопрос касался именно его, понятно, что этого в самом сообщении не видно, поэтому так же извиняюсь.
unsure.gif

Не думал, что мой вопрос вызовет такой резонанс. Действительно проблема состояла в том, чтобы обезопасить код работающий в основном цикле, от возможных изменений, производимых в обработчике сообщений. Так как все это время, я думал что эта тема была удалена, я постарался решить вопрос теми средствами о которых знал. Вопрос с запретом прерываний решил на уровне контроллера прерывания с помощью модификаций регистров VICIntEnable и VICIntEnClear, вроде бы работает.

Что касается самой очереди, то тут не так все просто. Возможно ее и очередью то трудно назвать, просто это наиболее близкое по смыслу название, которое я смог придумать. Суть проще рассказать на примере.

Сейчас "очередь" используется при работе с CAN. ID CAN побитово разбит так, что в нем уживаются ID кому, ID от кого и индекс фрагмента сообщения (для сообщений с длиной более 8-ми байт). Передающее устройство разбивает большое сообщение на фрагменты по 8-м байт и передает. Приемное устройство принимает и ориентируясь на IDs и индексы собирает сообщение. Так как на шине могут быть несколько передатчиков, то для каждого из них создается свой минибуферчик в общем большом массиве, выделенном для приема сообщений по CAN. После окончания приема по прерываниям, основной цикл забирает сообщение, которое необязательно может находиться в начале "очереди", при этом весь остальной массив перестраивается. Так вот чтобы индексация не нарушалась и требовалось запретить прерывание на время пока будет массив перестраиваться.
Go to the top of the page
 
+Quote Post



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

 


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


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