HARMHARM 0 31 декабря, 2008 Опубликовано 31 декабря, 2008 · Жалоба При чем тут 32-бита? При том, что крайне редко используются переменные больше 32 бит. А для восьмибитника любое обрещение к переменной больше 8 бит сразу неатомарное. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex B._ 0 1 января, 2009 Опубликовано 1 января, 2009 · Жалоба Да не любое. Банальная передача флага от одного "процесса" другому не требует атомарности. Ну опросит второй процесс флаг после чтения переменной из памяти первым процессом ? - ничего не изменится. А вот инкремент переменной - требует. Поэтому разрядность влияет. Проблемы начнутся, когда эти "процессы" начнут взаимно синхронизироваться через этот флаг. Про разрядность так и не понял. У любой RMW архитектуры существует подобная проблема, вне зависимости от разрядности. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sonycman 0 1 января, 2009 Опубликовано 1 января, 2009 · Жалоба Про разрядность так и не понял. У любой RMW архитектуры существует подобная проблема, вне зависимости от разрядности. Но ведь всё просто. К примеру, имеется ISR таймера с единственной инструкцией - counter++; Если проц восьмибитный и counter имеет разрядность больше байта - перед чтением значения (в основном цикле) надо заходить в critical section, иначе, после чтения первого байта, может проскочить прерывание и второй байт будет изменён. Таким образом мы получим один байт от предыдущего значения счётчика, а второй и последующие - от нового. Если разрядность проца 32 бита (а переменная counter в большинстве случаев не будет превышать такую разрядность), то считывать можно без всяких секций - проц в любом случае прочитает её целиком. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 134 1 января, 2009 Опубликовано 1 января, 2009 · Жалоба Но ведь всё просто.А если эта переменная - структура? А если система команд не имеет команды "установить бит" для ячейки памяти (как AVR) - тогда для взведения флага один процесс (а) считывает переменную, накладывает маску, хочет записать результат назад и в это время возникает перепланировка или прерывание и другой участок кода (б) тоже считывает-модифицирует-записывает переменную, возвращая управление коду (а), который заканчивая RMW затирает изменение, только что внесенное кодом (б). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
klop 0 2 января, 2009 Опубликовано 2 января, 2009 · Жалоба Извините если не в тему но мне всегда казалось что когда говорят Атомарная операция относительно АРМ архитектуры то подразумевают SWP(SWPB) и только. Только ета инструкция покрытая HLOCK на AHB будет гарантированно атомарная. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sonycman 0 2 января, 2009 Опубликовано 2 января, 2009 · Жалоба А если эта переменная - структура? А если система команд не имеет команды "установить бит" для ячейки памяти (как AVR) - тогда для взведения флага один процесс (а) считывает переменную, накладывает маску, хочет записать результат назад и в это время возникает перепланировка или прерывание и другой участок кода (б) тоже считывает-модифицирует-записывает переменную, возвращая управление коду (а), который заканчивая RMW затирает изменение, только что внесенное кодом (б). Тогда тоже всё просто - critical section :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sergeeff 1 2 января, 2009 Опубликовано 2 января, 2009 · Жалоба Тогда тоже всё просто - critical section :) Так вот именно про это выше по-русски и сказано : критическая секция, а не просто запрет/разрешение прерываний. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sonycman 0 2 января, 2009 Опубликовано 2 января, 2009 · Жалоба Так вот именно про это выше по-русски и сказано : критическая секция, а не просто запрет/разрешение прерываний. А кто спорит? Если задача не совсем простенькая, и прерывания в процессе динамически запрещаются/разрешаются в нескольких потоках, то нужно восстанавливать сохранённое значение PRIMASK/FAULMASK перед выходом из CS, а не просто тупо их разрешать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 1 2 января, 2009 Опубликовано 2 января, 2009 · Жалоба а какая атомарная операция вам нужна? у кортекса есть еще LDREX STREX (их можно и прямо из С использовать) и прерывания запрещать не понадобится Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
brag 0 14 мая, 2011 Опубликовано 14 мая, 2011 · Жалоба а какая атомарная операция вам нужна? у кортекса есть еще 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться