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

 
 
> Обычная переменная для 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
сообщение Jan 26 2009, 14:02
Сообщение #7


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

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



Цитата(_Pasha @ Jan 26 2009, 15:55) *
Пусть sys_tick volatile, проехали предыдущий вопрос. Если мы говорим конкретно об AVR, то дороговатая операция получается. Я бы для такого случая завел бы какой-нить байтовый кеш таймерок. Тогда не надо атомарного доступа.

Тогда страдает или разрешение таймера, или величина макс. выдержки.
На AVR приходилось делать на двух байтах.
На ARM вообще без проблем smile.gif
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Jan 26 2009, 14:40
Сообщение #8


;
******

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



Цитата(sonycman @ Jan 26 2009, 18:02) *
Тогда страдает или разрешение таймера, или величина макс. выдержки.


Я применял это там, где тик был медленный = 1мс. В таких условиях в мониторе событий крутился опрос "быстрого" однобайтового таймера  и этот тик (в предельном случае-вместе с вызовом обработчика) генерился там же. Т.е. преследовались цели: разгрузить прерывание, минимизировать джиттер прерывания от таймера из-за частых запретов/разрешений, разделить быстрые и медленные процессы. Понятно, что на  ARM "мельчить" объектами меньше чем 32 бита не только не полезно, но и вредно. И никаких извратов там не надо.
И, следуя вполне нормальному желанию портировать код, завел тип timer_t - размерностью какой надо в конкретном случае. Извиняюсь если написал много банальщины.

Цитата(Сергей Борщ @ Jan 26 2009, 17:24) *
В варианте для AVR считывать sys_tick в цикле и сравнивать с предыдущим значением.

По остальным тезисам - согласен, а тут - слишком искусственная ситуация, ибо такие циклы встречаются довольно редко. Согласитесь, чаще встречается  конструкция типа 

Код
void action (void)

{
static timer_t local_timer =0;
timer_t tmp;
tmp = get_tick();
if ((local_timer - tmp) < My_Time_To_DO) return;
local_timer = tmp;
Do_Be_Do_Be_Do();

**********

return;
}
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
|- - Сергей Борщ   Цитата(_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 - 22:12
Рейтинг@Mail.ru


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