AHTOXA 15 21 февраля, 2020 Опубликовано 21 февраля, 2020 · Жалоба 6 часов назад, Rst7 сказал: Я не об этом. Обычная запись в память (или чтение) между LDREX/STREX не сбрасывает флаг. Вернусь к этому. Помню, что когда я читал про эти LDREX/STREX, то однозначности не было. Вот и сейчас, скачал доку ARM synchronization primitives, и вижу там, например, такое: Цитата The following events reset the global monitor entry for processor N to open state: • processor N performs an exclusive load from a different location • a different processor successfully performs a store, or a Store-Exclusive, to the location tagged for exclusive use by processor N. Other events can clear a global exclusive monitor, but they are implementation defined and portable code must not rely on them. Здесь речь о глобальном мониторе, но не суть. Что мы видим. Во-первых, в качестве события, сбрасывающего монитор, указаны как STREX, так и просто STR. И во-вторых, написано, что другие события тоже могут сбрасывать монитор, по желанию воплотителя устройства. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rst7 5 21 февраля, 2020 Опубликовано 21 февраля, 2020 · Жалоба 2 hours ago, lamer0k said: при каждом входе и выходе из прерывания выполняется CLREX. С чего бы? Просто в C-M таки эксепшн сбрасывает монитор. Но только в -M 1 hour ago, AHTOXA said: речь о глобальном мониторе, но не суть. Суть. Глобальный - он для многопроцессорной системы. Кроме того, все равно запись в тот же адрес нужна, а не произвольный STR. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lamer0k 0 22 февраля, 2020 Опубликовано 22 февраля, 2020 · Жалоба 8 часов назад, Rst7 сказал: С чего бы? Просто в C-M таки эксепшн сбрасывает монитор. Но только в -M Потому что он сбрасывается как при входе в прерывание, так и при выходе. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 15 22 февраля, 2020 Опубликовано 22 февраля, 2020 · Жалоба 12 часов назад, Rst7 сказал: Суть. Глобальный - он для многопроцессорной системы. Ну и что? С точки зрения применения LDREX/STREX нам какая разница? Ну хорошо. Вот что там сказано про локальный монитор: Цитата A local monitor can be implemented to tag an address for exclusive use, or it can contain a state machine that only tracks the issuing of Load-Exclusive and Store-Exclusive instructions. Локальный монитор тоже может быть реализован разными способами. В том числе и путём отслеживания конкретного адреса. В этом случае любая запись в этот адрес будет сбрасывать монитор. Понятно, что так никто не делает (затратно), но возможность такая имеется. 3 часа назад, lamer0k сказал: Потому что он сбрасывается как при входе в прерывание, так и при выходе. Как уже несколько раз указано выше, это далеко не всегда так. В разных реализациях ARM-контроллеров может быть по-разному. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rst7 5 22 февраля, 2020 Опубликовано 22 февраля, 2020 · Жалоба 14 hours ago, AHTOXA said: Ну хорошо. Вот что там сказано про локальный монитор: Ну? Про локальный сказано, что он может либо адрес отслеживать, либо только выполнение LDREX/STREX. Т.е. STR в произвольный адрес не приведет к сбросу монитора. В общем произвольный STR не в мониторящийся адрес безопасен между LDREX/STREX. А вот зачем этот идиотизм со сбросом монитора при эксепшне - мне нифига непонятно. От него только хуже. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 15 22 февраля, 2020 Опубликовано 22 февраля, 2020 · Жалоба 32 минуты назад, Rst7 сказал: В общем произвольный STR не в мониторящийся адрес безопасен между LDREX/STREX. А, вон вы о чём. С этим я и не спорил :-) Я делаю акцент на том, что у ARM всё очень расплывчато формулируется, и многое отдано на откуп производителю. Монитор гарантированно сбрасывается при LDREX, CLREX и при STREX. Но производитель может добавить дополнительные события для сброса, например, исключения или обычную запись в тот же адрес (вернее, не в адрес, а в область размером от 8 до 2048 байтов). Но закладываться на это нельзя, если есть желание писать переносимый софт. Ну и просто полезно это знать, чтобы потом, при переходе, скажем, с Cortex-M4 на Cortex-A не удивляться тому, что прерывание не сбрасывает мониторы или наоборот, монитор сбрасывается при записи в соседнюю ячейку памяти. 32 минуты назад, Rst7 сказал: А вот зачем этот идиотизм со сбросом монитора при эксепшне - мне нифига непонятно. От него только хуже. Согласен. Лучше бы сделали, чтобы всегда нужно было явно сбрасывать. ---- Гм. Написал, что не спорю, а потом выписал опровержение :-) Ведь "произвольный STR не в мониторящийся адрес" таки может сбрасывать монитор! Цитата When an exclusive monitor tags an address, the minimum region that can be tagged for exclusive access is called the Exclusives Reservation Granule (ERG). The ERG is implementation defined, in the range 8-2048 bytes, in multiples of two bytes. Portable code must not assume anything about ERG size. То есть, если монитор отслеживает адрес, то он может делать это областями до 2К размером. И запись в любой адрес в такой области таки сбросит монитор. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lamer0k 0 22 февраля, 2020 Опубликовано 22 февраля, 2020 (изменено) · Жалоба 1 час назад, AHTOXA сказал: Как уже несколько раз указано выше, это далеко не всегда так. В разных реализациях ARM-контроллеров может быть по-разному. Но ведь тут указанное выше, не является первоисточником, поэтому может быть тоже далеко не всегда так. ARM architecture refence manual, говорит не так, как указано выше, а чётко регламентирует этот момент. Цитата It is necessary to ensure that the local monitor is in the Open Access state after a context switch. In ARMv7-M, the local monitor is changed to Open Access automatically as part of an exception entry or exit sequence. Изменено 22 февраля, 2020 пользователем lamer0k Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lamer0k 0 22 февраля, 2020 Опубликовано 22 февраля, 2020 (изменено) · Жалоба Самое то главное, монитор может скидываться "хоть как" , и это не зависит от вашего приложения. А зависит только от реализации монитора, которая может быть "любая", в рамках правил, обозначенных ARM. Цитата ARM recommends that the Store-Exclusive instruction always follows within a few instructions of its associated Load-Exclusive instructions. In order to support different implementations of these functions, software must follow the notes and restrictions given here. An implementation might clear an exclusive monitor between the LDREX and the STREX, without any application-related cause. For example, this might happen because of cache evictions. Code written for such an implementation must avoid having any explicit memory accesses or cache maintenance operations between the LDREX and STREX instructions. Поэтому предлагаю не париться, а просто использовать как рекомендуют, меньше инструкций между ними, не более 2048 байт и так далее. Изменено 22 февраля, 2020 пользователем lamer0k Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rst7 5 22 февраля, 2020 Опубликовано 22 февраля, 2020 · Жалоба 58 minutes ago, AHTOXA said: он может делать это областями до 2К размером. И вот это они зря на откуп реализации отдали, да. Вот, например, я приводил пример кода, который дергает блок из списка, а добавить блок в этот список малость усложняется - сначала надо обычным чтением прочитать указатель на голову, заполнить им поле next в блоке, а затем уже после LDREX указателя на голову проверить, что он не изменился (и если изменился, то сделать CLREX и начинать сначала), и только после этого сохранить указатель на новый блок. Походу, и доставание блока из списка тоже должно выглядеть по другому. Сначала берем p, и p->next, а уже потом LDREX/STREX. Некрасиво, но действительно portable. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 15 22 февраля, 2020 Опубликовано 22 февраля, 2020 · Жалоба 2 часа назад, lamer0k сказал: ARM architecture refence manual, говорит не так, как указано выше, а чётко регламентирует этот момент. Это для ARMv7-M. А тот документ, на который я давал ссылку - более общий. 1 час назад, Rst7 сказал: Походу, и доставание блока из списка тоже должно выглядеть по другому. Угу. Ну или делать два варианта, и какими-то дефайнами огораживать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться