Перейти к содержанию
    

Присмотритесь повнимательнее в пространство SFR - GPR0 итд - меняются легко флаги, это если не хочется в регистре переменную держать.

Грязный хак:)

Не люблю такие заходы...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Грязный хак:)

Не люблю такие заходы...

Если Вы о портабельности, то ее здесь нет. А если не о портабельности, то о чем?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А я тоже без стеснений юзал битовые поля в неиспользуемых регистрах вместо переменных. Иногда байтовые, типа TWAR,TWDR.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если Вы о портабельности, то ее здесь нет. А если не о портабельности, то о чем?

 

Я о том, что этот заюзаный не по своему назначению регистр может быть неожиданно востребован.

Не Вами так наследниками Вашего хозяйства (а мужики то не знали...)

Чтобы даже гипотетически не закладывать проблемы, я всегда воздерживаюсь от таких вот выкрутасов.

Ибо почити всегда есть более прямое решение, как например не использовать битовые переменные вовсе (для AVR - это отличный способ избавиться от геморроя).

Таков мой подход и я его не навязываю. Вольному - воля!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 

Попутно ещё вопросик:

Например есть код

 

ISR()

{

adc_flags |= PROCESS_I_NEG;

}

 

loop()

{

...................

if ( adc_flags & PROCESS_UOUT_POS )

{

cli();

adc_flags &= ~PROCESS_UOUT_POS;

sei();

}

else

{

}

..........

}

 

 

Компилятор превратит во чтото следующее

 

;if ( adc_flags & PROCESS_UOUT_POS )

 

R24,adc_flags

 

;/////////////////////////////////

; ТУТ ВОЗНИКАЕТ ВДРУГ ПРЕРЫВАНИЕ

;(где сохраняется регистр R24, затем добавляется бит PROCESS_I_NEG к adc_flags

;и воосстанавливается R24)

;/////////////////////////////////

 

;далее продолжается выполнение if

SBRS R24,1<<PROCESS_UOUT_POS

RJMP m1

 

;adc_flags &= ~PROCESS_UOUT_POS;

 

А вот тут вопрос:

будет ли компилиться так (т.е. в R24 снова считывается adc_flag)

CLI

LDS R24,adc_flags

ANDI R24,~PROCESS_UOUT_POS

STS adc_flags,R24

SEI

 

или же возможна ситуация когда компилер

не будет считывать в R24 переменную adc_flags, а посчитает что она ранее была считана

в R24 и таким образом не учтёт изменение её в прерывании

 

Т.е. другими словами, необходимо ли и для if тоже использовать атомарность например в виде

 

cli()

rez=adc_flags & PROCESS_UOUT_POS;

sei()

 

if(rez)

{

.......

}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Т.е. другими словами, необходимо ли и для if тоже использовать атомарность например в виде

Если переменная волатильная, то компилер обязан её считывать каждый раз оттуда, где она лежит, и никак иначе. Т.о. перед IF не нужно запрещать прерывания.

Изменено пользователем GetSmart

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

При том... Читайте стандарт там всё подробно описано.

 

Переменная однобайтовая. Какая атомарность?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Переменная однобайтовая. Какая атомарность?

Да байтовая но в ней 8 бит-флагов:

как происходит изменение бита в ОЗУ, а вот так:

1 load

2 modify

3 store

 

так если произойдёт прерывание между пунктами 1-3 изменяющее этот же байт, то все изменения сделанные в прерывании будут похерены пунктом 3.

 

И напоследок:

volatile нужен для любой переменной хоть битовой хоть байтовой, хоть QWORD , если эта переменная используется (пишется или только читается) в прерываниях или является частью SFR.

 

Всё! Учим наизусть и повторяем вместо мантры:-)

 

Не хотите читать стандарт - поищите по форуму, тема про volatile уже неоднократно всплывала.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Переменная однобайтовая. Какая атомарность?

 

Код посмотри:

 

Си:

adc_flags &= ~PROCESS_UOUT_POS;

 

Асма:

LDS R24,adc_flags

ANDI R24,~PROCESS_UOUT_POS

STS adc_flags,R24

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

если эта переменная используется (пишется или только читается) в прерываниях или является частью SFR.
Если эта переменная используется и в прерываниях и в основном цикле (или в нескольких потоках при использовании ОС).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да байтовая но в ней 8 бит-флагов:

как происходит изменение бита в ОЗУ, а вот так:

1 load

2 modify

3 store

 

так если произойдёт прерывание между пунктами 1-3 изменяющее этот же байт, то все изменения сделанные в прерывании будут похерены пунктом 3.

Да volatile к этой проблеме никакого отношения не имеет, и никак не поможет! Тут единственное что поможет, так это запрет прерываний на время доступа!

 

Если эта переменная используется и в прерываниях и в основном цикле (или в нескольких потоках при использовании ОС).

Да ради бога, только если у вас разграничение доступа не организвано должным образом, работать не будет все равно, volatile или нет. Иными словами, от критических секций вы все равно не избавитесь.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да ради бога, только если у вас разграничение доступа не организвано должным образом, работать не будет все равно, volatile или нет. Иными словами, от критических секций вы все равно не избавитесь.
Для байтовой переменной на AVR избавлюсь от критической секции. И работать будет только если volatile.

Я Вас не пойму. Вы что-то из пустого в порожнее всё переливаете и переливаете. К чему это?

Перечитайте Ваши сообщения в этой ветке. Либо странные утверждения либо повторение за кем-то прописных истин после доходчивого разъяснения...

 

Если эта переменная используется и в прерываниях и в основном цикле (или в нескольких потоках при использовании ОС).
Ваша формулировка как всегда более точная:-)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...