-
- Спасибо. - Nikolay_Po(03.05.2024 18:21)
- +1 - Oman(24.04.2024 22:37)
- Да, действительно любопытная тема. Поизучаю, спасибо! - ar-elec(24.04.2024 19:47)
- Ха, прикольное POV(1 знак., 24.04.2024 17:27, ссылка)
- Статья по ссылке оставила вопросы. Почитал руководство по
программированию ядра. Вот что выяснил: Nikolay_Po(937 знак., 03.05.2024 18:26)
- Оная функциональность на мелких кортексах (как и на SuperH, с
которого слизана) реализована примитивнее некуда. Там один триггер
на всю красоту, адрес вообще игнорится. LDREX взводит триггер,
STREX проверяет, взведён ли он, выполняет запись и сбрасывает
триггер. Любое прерывание триггер сбрасывает. Все. - LightElf(04.05.2024 02:19)
- Откуда информация про то, что адрес игнорируется? А если обращение
к памяти было от контроллера ПДП, без прерывания? Что, тоже адрес
игнорируется? - Nikolay_Po(04.05.2024 04:28)
- Адрес игнорируется, это описано в армовских доках на Cortex-M.
Вложенные ldrex/strex работать не будут (сработает только самая
глубокая пара). На STM32F4 отслеживания активности DMA я не
обнаружил, да и затруднительно оно в реализации, с учётом крайне
развесистого шинного хозяйства. На толстых многоядерных кортексах
может и есть что. - LightElf(12.05.2024 18:49)
- Насчёт вложений LDREX/STREX, разумеется, сработает лишь самая
глубокая пара. Остальные получат отказ (фиксацию вмешательства в
память). И это будет безопасно. В этом смысле оно "работает",
использование вложенных LDREX/STREX - не приведёт к
непредсказуемому поведению и не разрушит атомарность доступа,
предусмотренную циклом с LDREX/STREX. - Nikolay_Po(13.05.2024 10:22)
- Ну если "зациклится" == "сработает", то да ;-) - LightElf(13.05.2024 14:01)
- Когда самое глубоко вложенное сделает свои дела и перестанет
вызывать STREX, цикл у чуть менее глубокого успешно завершится. И
так до самого верхнего уровня. - Nikolay_Po(13.05.2024 15:27)
- У нас, похоже, разное понимание слова "вложенный". LightElf(314 знак., 13.05.2024 15:44 - 18:40)
- Да. Разное. Я имел ввиду вложение этой пары инструкции внутри прерывания уже исполняемой пары. Nikolay_Po(129 знак., 13.05.2024 15:49)
- Но зачем, Холмс? :-) - SciFi(13.05.2024 15:48)
- Да фиг его знает. Просто иллюстрация к термину "вложенный". - LightElf(13.05.2024 18:41)
- Предложите, как сделать обновление двух переменных, без
использования отдельного флага "занято". Там вложенность так и
просится AlexBi(264 знак., 13.05.2024 18:22)
- Никак, что логично. Сделай на две переменные - завтра попросят десять переменных атомарно обновить ;-) - LightElf(13.05.2024 21:48)
- Увы, так не заработает. Я прикидывал и не нашёл способа атомарно
обновить, при помощи этой пары инструкций, что-либо больше 32 бит.
Если у STM32F адрес не проверяется, то для обоих переменных
достаточно одной обёртки. Но это будет противоречить документации,
где явно указано, что нужно проверять сохранность эксклюзивности
доступа именно по указанному адресу и именно указанной ширины. А
это лишь один адрес с шириной данных до 32 бит. - Nikolay_Po(13.05.2024 19:54)
- Это не у STM32, это у Cortex-M3/4 вообще. LightElf(346 знак., 13.05.2024 20:46, ссылка)
- Именно. Не нужно доводить до абсурда. Жаль, иногда само получается. - Nikolay_Po(13.05.2024 15:50)
- У нас, похоже, разное понимание слова "вложенный". LightElf(314 знак., 13.05.2024 15:44 - 18:40)
- Когда самое глубоко вложенное сделает свои дела и перестанет
вызывать STREX, цикл у чуть менее глубокого успешно завершится. И
так до самого верхнего уровня. - Nikolay_Po(13.05.2024 15:27)
- Ну если "зациклится" == "сработает", то да ;-) - LightElf(13.05.2024 14:01)
- Насчёт вложений LDREX/STREX, разумеется, сработает лишь самая
глубокая пара. Остальные получат отказ (фиксацию вмешательства в
память). И это будет безопасно. В этом смысле оно "работает",
использование вложенных LDREX/STREX - не приведёт к
непредсказуемому поведению и не разрушит атомарность доступа,
предусмотренную циклом с LDREX/STREX. - Nikolay_Po(13.05.2024 10:22)
- Адрес игнорируется, это описано в армовских доках на Cortex-M.
Вложенные ldrex/strex работать не будут (сработает только самая
глубокая пара). На STM32F4 отслеживания активности DMA я не
обнаружил, да и затруднительно оно в реализации, с учётом крайне
развесистого шинного хозяйства. На толстых многоядерных кортексах
может и есть что. - LightElf(12.05.2024 18:49)
- Откуда информация про то, что адрес игнорируется? А если обращение
к памяти было от контроллера ПДП, без прерывания? Что, тоже адрес
игнорируется? - Nikolay_Po(04.05.2024 04:28)
- Оная функциональность на мелких кортексах (как и на SuperH, с
которого слизана) реализована примитивнее некуда. Там один триггер
на всю красоту, адрес вообще игнорится. LDREX взводит триггер,
STREX проверяет, взведён ли он, выполняет запись и сбрасывает
триггер. Любое прерывание триггер сбрасывает. Все. - LightElf(04.05.2024 02:19)
- Статья по ссылке оставила вопросы. Почитал руководство по
программированию ядра. Вот что выяснил: Nikolay_Po(937 знак., 03.05.2024 18:26)