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

 
 
 
Reply to this topicStart new topic
> Shared std::list между обычным кодом и обработчиком прерывания
harmaa
сообщение Jul 17 2014, 11:07
Сообщение #1





Группа: Новичок
Сообщений: 3
Регистрация: 19-07-13
Пользователь №: 77 600



Здравствуйте.
Имеется список std::list<>
Код
  typedef std::list<TTransfer> TTransferQueue;
  volatile TTransferQueue mTransfers;

, в который могут добавляться и удаляться элементы из основного кода, и обработчик прерывания, который только читает элементы. Обычно таким переменным я ставлю volatile, но в этом случае компилятор ругается:

Код
error #1163: no instance of overloaded function
          "std::list<_Ty, _Ax>::end [with _Ty=TI2CController::TTransfer,
          _Ax=std::allocator<TI2CController::TTransfer>]" matches the argument
          list and object (the object has cv-qualifiers that prevent a match)
            object type is: volatile TI2CController::TTransferQueue
    : mNo(no), mBaseAddr(baseAddr), mTransfers(), mActiveTransfer(mTransfers.end()),
                                                                             ^


Если убрать volatile, то код компилируется. Подскажите пожалуйста, какие нужно предпринять дополнительные действия для "правильного" доступа к списку и из основного кода, и из прерывания. Я плохо представляю, когда нужен volatile, и ставлю его во всех сомнительных случаях. Буду благодарен, если подкинете литературу по теме.

Сообщение отредактировал harmaa - Jul 17 2014, 11:09
Go to the top of the page
 
+Quote Post
dxp
сообщение Jul 18 2014, 07:20
Сообщение #2


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



QUOTE (harmaa @ Jul 17 2014, 18:07) *
Если убрать volatile, то код компилируется. Подскажите пожалуйста, какие нужно предпринять дополнительные действия для "правильного" доступа к списку и из основного кода, и из прерывания. Я плохо представляю, когда нужен volatile, и ставлю его во всех сомнительных случаях. Буду благодарен, если подкинете литературу по теме.

volatile нужен всегда, когда есть асинхронное изменение объекта. Если вы в прерывании не меняете состояние объекта, то volatile не нужен. А вот помимо volatile вам обязательно нужно защищать доступ в основной программе от асинхронного доступа (прерывания) к этому объекту - сделать доступ атомарным. Например, с помощью запрещения этого прерывания на время работы с объектом.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
andrewlekar
сообщение Jul 18 2014, 07:21
Сообщение #3


Знающий
****

Группа: Участник
Сообщений: 837
Регистрация: 8-02-07
Пользователь №: 25 163



Однако вопрос вы задали...

Для начала убираем volatile. Для таких структур от него толку мало будет.
Потом делаем переменные:
Код
volatile bool busy_from_int, busy_from_main;

В обработчике прерывания делаем так:
Код
if(busy_from_main) return;
busy_from_int = true;
mTransfers.read();
busy_from_int = false;

В приложении делаем так:
Код
if(busy_from_int) continue;
ENTER_CRITICAL();
if(busy_from_int) { EXIT_CRITICAL(); continue; }
busy_from_main = true;
EXIT_CRITICAL();
mTransfers.write();
busy_from_main = false;


При этом считается, что если прерывание в какой-то момент времени ничего не смогла прочитать из очереди, то в ближайшее время она попробует это сделать снова. Ну и я бы подумал о том, чтобы поменять архитектуру на поллинг.
Go to the top of the page
 
+Quote Post
harmaa
сообщение Jul 18 2014, 11:52
Сообщение #4





Группа: Новичок
Сообщений: 3
Регистрация: 19-07-13
Пользователь №: 77 600



dxp, andrewlekar

Спасибо за ответы, пока вам отвечал, кучу материалов перерыл sm.gif. На время модификации у меня прерывания блокируются. Я почитал доку к компилятору (компилятор для TI C6000) и выяснил, что блокировка прерываний выключает оптимизацию и может использоваться для создания критических секций. Поллинг тоже собираюсь использовать для части операций.
Go to the top of the page
 
+Quote Post

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

 


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


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