|
Обычная переменная для 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, 11:38
|

Любитель
    
Группа: Свой
Сообщений: 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 просто не будет считываться - компилер, будучи уверенным, что она не изменяется (нет присваивания), выкинул операцию считывания из кода...
|
|
|
|
|
Jan 26 2009, 11:55
|
;
     
Группа: Участник
Сообщений: 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 стремится к нулю
|
|
|
|
|
Jan 26 2009, 14:40
|
;
     
Группа: Участник
Сообщений: 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; }
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|