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

При чем тут 32-бита?

При том, что крайне редко используются переменные больше 32 бит. А для восьмибитника любое обрещение к переменной больше 8 бит сразу неатомарное.

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


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

Да не любое. Банальная передача флага от одного "процесса" другому не требует атомарности. Ну опросит второй процесс флаг после чтения переменной из памяти первым процессом ? - ничего не изменится.

А вот инкремент переменной - требует. Поэтому разрядность влияет.

Проблемы начнутся, когда эти "процессы" начнут взаимно синхронизироваться через этот флаг.

Про разрядность так и не понял. У любой RMW архитектуры существует подобная проблема, вне зависимости от разрядности.

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


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

Про разрядность так и не понял. У любой RMW архитектуры существует подобная проблема, вне зависимости от разрядности.

Но ведь всё просто.

К примеру, имеется ISR таймера с единственной инструкцией - counter++;

Если проц восьмибитный и counter имеет разрядность больше байта - перед чтением значения (в основном цикле) надо заходить в critical section, иначе, после чтения первого байта, может проскочить прерывание и второй байт будет изменён. Таким образом мы получим один байт от предыдущего значения счётчика, а второй и последующие - от нового.

Если разрядность проца 32 бита (а переменная counter в большинстве случаев не будет превышать такую разрядность), то считывать можно без всяких секций - проц в любом случае прочитает её целиком.

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


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

Но ведь всё просто.
А если эта переменная - структура? А если система команд не имеет команды "установить бит" для ячейки памяти (как AVR) - тогда для взведения флага один процесс (а) считывает переменную, накладывает маску, хочет записать результат назад и в это время возникает перепланировка или прерывание и другой участок кода (б) тоже считывает-модифицирует-записывает переменную, возвращая управление коду (а), который заканчивая RMW затирает изменение, только что внесенное кодом (б).

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


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

Извините если не в тему но мне всегда казалось что когда говорят Атомарная операция относительно АРМ архитектуры то подразумевают SWP(SWPB) и только. Только ета инструкция покрытая HLOCK на AHB будет гарантированно атомарная.

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


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

А если эта переменная - структура? А если система команд не имеет команды "установить бит" для ячейки памяти (как AVR) - тогда для взведения флага один процесс (а) считывает переменную, накладывает маску, хочет записать результат назад и в это время возникает перепланировка или прерывание и другой участок кода (б) тоже считывает-модифицирует-записывает переменную, возвращая управление коду (а), который заканчивая RMW затирает изменение, только что внесенное кодом (б).

Тогда тоже всё просто - critical section :)

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


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

Тогда тоже всё просто - critical section :)

 

Так вот именно про это выше по-русски и сказано : критическая секция, а не просто запрет/разрешение прерываний.

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


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

Так вот именно про это выше по-русски и сказано : критическая секция, а не просто запрет/разрешение прерываний.

А кто спорит? Если задача не совсем простенькая, и прерывания в процессе динамически запрещаются/разрешаются в нескольких потоках, то нужно восстанавливать сохранённое значение PRIMASK/FAULMASK перед выходом из CS, а не просто тупо их разрешать.

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


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

а какая атомарная операция вам нужна?

у кортекса есть еще LDREX STREX (их можно и прямо из С использовать) и прерывания запрещать не понадобится

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


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

а какая атомарная операция вам нужна?

у кортекса есть еще LDREX STREX (их можно и прямо из С использовать) и прерывания запрещать не понадобится

только толку от этих инстуркций мало

Cortex-M3 Device Generic User Guide:

The result of executing a Store-Exclusive instruction to an address that is different from that used in the preceding Load-Exclusive instruction is unpredictable.

ARM®v7-M ArchitectureReference Manual

If the local monitor is in its Exclusive Access state and a processor performs a Store-Exclusive to any address other than the last one from which it has performed a Load-Exclusive, it is IMPLEMENTATION DEFINED whether the store succeeds, but in all cases the local monitor is reset to its Open Access state. In ARMv7-M, the store must be treated as a software programming error.

 

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


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

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

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

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

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

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

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

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

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

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