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

Битовые поля, кто ж вас выдумал?

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.

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

 

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


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

2 hours ago, lamer0k said:

при каждом входе и выходе из прерывания выполняется CLREX.

С чего бы? Просто в C-M таки эксепшн сбрасывает монитор. Но только в -M

1 hour ago, AHTOXA said:

речь о глобальном мониторе, но не суть. 

Суть. Глобальный - он для многопроцессорной системы.

Кроме того, все равно запись в тот же адрес нужна, а не произвольный STR.

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


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

8 часов назад, Rst7 сказал:

С чего бы? Просто в C-M таки эксепшн сбрасывает монитор. Но только в -M

Потому что он сбрасывается как при входе в прерывание, так и при выходе. 

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


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

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-контроллеров может быть по-разному.

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


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

14 hours ago, AHTOXA said:

Ну хорошо. Вот что там сказано про локальный монитор:

 

Ну? Про локальный сказано, что он может либо адрес отслеживать, либо только выполнение LDREX/STREX. Т.е. STR в произвольный адрес не приведет к сбросу монитора.

В общем произвольный STR не в мониторящийся адрес безопасен между LDREX/STREX.

 

А вот зачем этот идиотизм со сбросом монитора при эксепшне - мне нифига непонятно. От него только хуже.

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


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

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К размером. И запись в любой адрес в такой области таки сбросит монитор.

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


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

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. 

 

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

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


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

Самое то главное, монитор может скидываться "хоть как" , и это не зависит от вашего приложения. А зависит только от реализации монитора, которая может быть "любая", в рамках правил, обозначенных 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 байт и так далее. 

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

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


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

58 minutes ago, AHTOXA said:

он может делать это областями до 2К размером.

И вот это они зря на откуп реализации отдали, да. Вот, например, я приводил пример кода, который дергает блок из списка, а добавить блок в этот список малость усложняется - сначала надо обычным чтением прочитать указатель на голову, заполнить им поле next в блоке, а затем уже после LDREX указателя на голову проверить, что он не изменился (и если изменился, то сделать CLREX и начинать сначала), и только после этого сохранить указатель на новый блок.

Походу, и доставание блока из списка тоже должно выглядеть по другому. Сначала берем p, и p->next, а уже потом LDREX/STREX. Некрасиво, но действительно portable.

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


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

2 часа назад, lamer0k сказал:

ARM architecture refence manual, говорит не так, как указано выше, а чётко регламентирует этот момент. 

Это для ARMv7-M. А тот документ, на который я давал ссылку - более общий.

1 час назад, Rst7 сказал:

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

Угу. Ну или делать два варианта, и какими-то дефайнами огораживать.

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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