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

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


Любитель
*****

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



Что-то вот задумался над одной мелочью, в принципе.
Есть переменная таймера, которая объявлена как volatile, так как модифицируется в обработчике прерывания.

Всё бы хорошо, да только хотелось бы, чтобы эта переменная была volatile для всех, кроме самого обработчика прерываний, так как лишние сохранения/загрузки в нём - это совершенно лишнее. smile.gif

Есть мысля сделать так:
Код
union {
dword isr_timer;
volatile dword timer;
}

и в ISR юзать isr_timer, а в других местах - просто timer.

Что скажете?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
kimstik
сообщение Jan 25 2009, 11:43
Сообщение #2


Участник
*

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



Я стараюсь union реже использовать - это одна из самых непереносимых и компилерозависимых вещей.
Не все компилеры понимают безымяный union. Длинные бестолковые имена. Куча не всегда понятных переменных.
А то что в хедер для проверки не вставить объявления - это цена вопроса.
Вы же сами просили решения(хака)? Значит вам за него и отвечать. smile.gif
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 25 2009, 13:21
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(kimstik @ Jan 25 2009, 14:43) *
Длинные бестолковые имена. Куча не всегда понятных переменных.

С точностью до наоборот - позволяет создавать толковые имена и понятные переменные.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
777777
сообщение Jan 26 2009, 07:51
Сообщение #4


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

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



А ты не пробовал объявлять ее вообще без volatile? Вообще-то это требуется крайне редко, например, в подобном коде:

int n = 10;
while(n--)
{}

Здесь компилятор просто присвоит переменной -1 и больше никакого кода создавать не будет. Если же у тебя в обработчике таймера переменная инкрементируется, а в основной программе только читается, то обычно никаких проблем не возникает - нет для этого почвы. Компилятор не может сделать никаких предположений о содержимом переменной и будет вынужден ее прочитать.
Go to the top of the page
 
+Quote Post
sonycman
сообщение Jan 26 2009, 11:38
Сообщение #5


Любитель
*****

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



Цитата(777777 @ Jan 26 2009, 11:51) *
А ты не пробовал объявлять ее вообще без volatile?
Но ведь это сразу создаст проблемы.
Допустим, я захочу подождать, пока таймер не "протикает" несколько раз:
Код
extern dword sys_tick;

Wait(dword mksec) {
dword new_value, old_value = sys_tick;
do{
new_value = sys_tick;
}while ((new_value - old_value) < mksec);
}

Без volatile цикл while просто повиснет, так как new_value просто не будет считываться - компилер, будучи уверенным, что она не изменяется (нет присваивания), выкинул операцию считывания из кода...
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Jan 26 2009, 11:55
Сообщение #6


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(sonycman @ Jan 26 2009, 14:38) *
Код
do

{


ATOMIC_BLOCK(ATOMIC_RESTORESTATE) new_value = sys_tick;
}

while ((new_value - old_value) < mksec);


Пусть sys_tick volatile, проехали предыдущий вопрос. Если мы говорим конкретно об AVR, то дороговатая операция получается. Я бы для такого случая завел бы какой-нить байтовый кеш таймерок. Тогда не надо атомарного доступа.
Портируемость AVR->ARM стремится к нулю sad.gif
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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
|- - Сергей Борщ   Цитата(777777 @ Jan 26 2009, 09:51) А ты ...   Jan 26 2009, 08:20
||- - 777777   Цитата(Сергей Борщ @ Jan 26 2009, 11:20) ...   Jan 26 2009, 17:45
||- - sonycman   Цитата(777777 @ Jan 26 2009, 21:45) Но с ...   Jan 26 2009, 18:56
||- - Сергей Борщ   Цитата(777777 @ Jan 26 2009, 19:45) А так...   Jan 26 2009, 19:18
|- - Сергей Борщ   Цитата(_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


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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 09:42
Рейтинг@Mail.ru


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