|
Обычная переменная для ISR и volatile для всех остальных, как лучше реализовать? |
|
|
|
Jan 24 2009, 15:32
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Что-то вот задумался над одной мелочью, в принципе. Есть переменная таймера, которая объявлена как volatile, так как модифицируется в обработчике прерывания. Всё бы хорошо, да только хотелось бы, чтобы эта переменная была volatile для всех, кроме самого обработчика прерываний, так как лишние сохранения/загрузки в нём - это совершенно лишнее.  Есть мысля сделать так: Код union { dword isr_timer; volatile dword timer; } и в ISR юзать isr_timer, а в других местах - просто timer. Что скажете?
|
|
|
|
|
 |
Ответов
|
Jan 25 2009, 11:43
|
Участник

Группа: Свой
Сообщений: 46
Регистрация: 4-02-05
Из: Москва
Пользователь №: 2 430

|
Я стараюсь union реже использовать - это одна из самых непереносимых и компилерозависимых вещей. Не все компилеры понимают безымяный union. Длинные бестолковые имена. Куча не всегда понятных переменных. А то что в хедер для проверки не вставить объявления - это цена вопроса. Вы же сами просили решения(хака)? Значит вам за него и отвечать.
|
|
|
|
|
Jan 26 2009, 08:20
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(777777 @ Jan 26 2009, 09:51)  А ты не пробовал объявлять ее вообще без volatile? Шикарный совет. "Как, вы еще не получали граблями в этом месте? Вот вам!  " Цитата(777777 @ Jan 26 2009, 09:51)  Вообще-то это требуется крайне редко, Вообще-то это требуется всегда, когда переменная изменяется неизвестным компилятору образом, например в прерывании, другом потоке или аппаратно отражает состояние внешних по отношению к ядру устройств. Цитата(777777 @ Jan 26 2009, 09:51)  Компилятор не может сделать никаких предположений о содержимом переменной и будет вынужден ее прочитать. Зато _вы_ можете сделать предположение за компилятор.  . Может он. Чтобы не мог - существует volatile. Если в конкретном случае без volatile вдруг не сделал, то при малейшем изменении исходника или версии компилятора сможет сделать и вот вам граблями в лоб - получите. Даже если чтения разнесены в разные функции и файлы - все больше компиляторов поддерживают многофайловую компиляцию. Хотите приключений - делайте, но не советуйте этого другим. Это примерно как "лазил я однажды в телевизор и нифига меня током не ударило. Так что незачем при ремонте его отключать от сети".
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jan 26 2009, 17:45
|

Профессионал
    
Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357

|
Цитата(Сергей Борщ @ Jan 26 2009, 11:20)  Вообще-то это требуется всегда, когда переменная изменяется неизвестным компилятору образом, например в прерывании, другом потоке или аппаратно отражает состояние внешних по отношению к ядру устройств. А также если глобальная переменная используется в нескольких функциях. Транслируя каждую функцию по отдельности, компилятор не знает, как изменяется такая переменная. Однако вы же не делаете ее volatile. Такое объявление приводит лишь к тому, что если например она используется в функции дважды, то ее значение будет считываться из памяти каждый раз, а при отсутствии volatile (и наличии оптимизатора) - только раз. Цитата(Сергей Борщ @ Jan 26 2009, 11:20)  Зато _вы_ можете сделать предположение за компилятор.  . Может он. Чтобы не мог - существует volatile. Если в конкретном случае без volatile вдруг не сделал, то при малейшем изменении исходника или версии компилятора сможет сделать и вот вам граблями в лоб - получите. Ну например, в прерывании таймера инкрементируется некая переменная, а в прерывании какого-нибудь передатчика ее значение куда-то передается. Что может знать компилятор о ее содержимом? И "малейшего" изменения исходников (а тем более версии компилятора) недостаточно для изменения ее поведения. Нужно "существенное" изменение, например, если мы попытаемся ввести какую-нибудь паузу, как написал ниже sonycman - но паузы и задержки это и есть то, для чего придуман volatile. Но с другой стороны, введение задержек в микропроцессорной системе таким способом - явный признак дурного стиля, это снижает производительность системы. Для задержек как раз и существуют таймеры.
|
|
|
|
|
Jan 26 2009, 19:18
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(777777 @ Jan 26 2009, 19:45)  А также если глобальная переменная используется в нескольких функциях. Транслируя каждую функцию по отдельности, компилятор не знает, как изменяется такая переменная. Знает. Почитайте что такое точки последовательности, побочные эффекты. Функция исполняется от начала и до конца. Одна. Компилятор ничего не знает ни о прерываниях, ни о многопоточности. Задача прерывания - обеспечить неизменность состояния среды исполнения (state of the execution environment). Все, что изменяет это состояние является побочными эффектами (side-effects). Одним из побочных эффектов является обращение к volatile-переменной. Прочтите стандарт, чтобы не писать глупости. И компилятор имеет право встроить функцию. Так что "Транслируя каждую функцию по отдельности" бывает далеко не всегда.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
Сообщений в этой теме
sonycman Обычная переменная для ISR и volatile для всех остальных Jan 24 2009, 15:32 kimstik ISR сделай в отдельном файле и используй как
dword... Jan 24 2009, 16:43 sonycman Цитата(kimstik @ Jan 24 2009, 20:43) ISR ... Jan 24 2009, 17:47  ReAl Цитата(sonycman @ Jan 24 2009, 19:47) А я... Jan 24 2009, 20:39 Сергей Борщ Цитата(sonycman @ Jan 24 2009, 17:32) Что... Jan 24 2009, 18:33 sonycman Цитата(Сергей Борщ @ Jan 24 2009, 22:33) ... Jan 24 2009, 19:51 singlskv А я вот чего-то совсем не припоминаю из стандарта ... Jan 24 2009, 18:55 Сергей Борщ Цитата(singlskv @ Jan 24 2009, 20:55) А я... Jan 24 2009, 19:39  singlskv Цитата(Сергей Борщ @ Jan 24 2009, 22:39) ... Jan 24 2009, 19:53   sonycman Цитата(singlskv @ Jan 24 2009, 23:53) Без... Jan 24 2009, 19:55 zltigo Цитата(sonycman @ Jan 24 2009, 18:32) Что... Jan 24 2009, 19:04 sonycman Хм, спасибо!
Если будут проблемы с extern, то ... Jan 24 2009, 22:12 sonycman Цитата(kimstik @ Jan 25 2009, 15:43) Я ст... Jan 25 2009, 12:42     sonycman Цитата(777777 @ Jan 26 2009, 21:45) Но с ... Jan 26 2009, 18:56   sonycman Цитата(777777 @ Jan 26 2009, 11:51) А ты ... Jan 26 2009, 11:38    _Pasha Цитата(sonycman @ Jan 26 2009, 14:38) Код... Jan 26 2009, 11:55     Сергей Борщ Цитата(_Pasha @ Jan 26 2009, 13:55) Порти... Jan 26 2009, 13:24     sonycman Цитата(_Pasha @ Jan 26 2009, 15:55) Пусть... Jan 26 2009, 14:02      _Pasha Цитата(sonycman @ Jan 26 2009, 18:02) Тог... Jan 26 2009, 14:40       Сергей Борщ Цитата(_Pasha @ Jan 26 2009, 16:40) Согла... Jan 26 2009, 15:20        _Pasha Цитата(Сергей Борщ @ Jan 26 2009, 18:20) ... Jan 26 2009, 15:40 kimstik точно не помню но нарывался уже на непонимание ан... Jan 25 2009, 17:31 sonycman Цитата(kimstik @ Jan 25 2009, 21:31) точн... Jan 25 2009, 18:48  singlskv Цитата(sonycman @ Jan 25 2009, 21:48) Но ... Jan 25 2009, 19:50   singlskv И раз уж зашла речь о безымянных обединениях и стр... Jan 25 2009, 21:08    zltigo Цитата(singlskv @ Jan 26 2009, 00:08) Чем... Jan 25 2009, 21:19     singlskv Цитата(zltigo @ Jan 26 2009, 00:19) Для н... Jan 25 2009, 21:40      zltigo Цитата(singlskv @ Jan 26 2009, 00:40) тол... Jan 25 2009, 21:51       singlskv Цитата(zltigo @ Jan 26 2009, 00:51) Что б... Jan 25 2009, 22:10        zltigo Цитата(singlskv @ Jan 26 2009, 01:10) Vis... Jan 25 2009, 22:33         singlskv Цитата(zltigo @ Jan 26 2009, 01:33) Ну фи... Jan 25 2009, 22:39          zltigo Цитата(singlskv @ Jan 26 2009, 01:39) Стр... Jan 25 2009, 22:42 kimstik живодеры!!
вот увидете - перестанет компил... Jan 25 2009, 21:53
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|