Мне тут кто-то отвечал, что не на всех ядрах он есть
даже не во всех М3 и М4 он есть, В М0 и М7 его нет
А как его реализуют, чтоб оно не за три операции работало? Это аппаратная фишка у кортексов должна быть?
Это расширение Cortex, которое отображает биты регистров и оперативной памяти на байты в адресном пространстве. Вместо чтение-модификация-запись можно писать или читать напрямую. HAL на Bitbanding'е никто не делает потому что львиная доля битовых полей в регистрах многобитовые, а атомарность может быть реализована другими механизмами.
Ещё раз, отображение битов на байты аппаратная штука?
Да. Есть формулы, которые позволяют пересчитать "адрес" бита в RAM и Flash в адрес байта с 32-битной адресацией.
А, ок. т.е. все кортексы это теоретически умеют. А всякие risc-v процы тоже?
Не все. Это фишка ARM v7m и новее. Младшие камешки (типа F0/G0) насколько я помню таким не располагают. За RISC V не скажу.
А, ну ок, вот это и пытался понять, что не все такую магию умеют.
Да. Насколько я помню реализация зависит от вендора. В RISC V есть рабочая группа по битовым манипуляциям, там есть что-то похожее без ненужной магии с адресами.
Непонятно, зачем? большинство значимых регистров идут парами, отдельно на чтение и отдельно на запись. Я имею ввиду младшие кортексы и V7
Из потенциальных кейсов я видел только простую возможность атомарно опрашивать/устанавливать флажки в оперативной памяти, адреса которых жестко залинкованы. А при настройке периферии скорость как правило значения не имеет. И да, регистры отсылки/приема данных периферии как правило дополнены до машинного слова и вынесены отдельно - чтобы не химичить с битовыми полями.
да, наверное. но как-то слишком узко, для того чтобы впиливать в ядро. видимо что-то есть еще
Какие ещё механизмы позволяют сделать потокобезопасный атомарный RMW?
запрет прерываний
ну вот да, разве что
А как же LDREX/STREX? Да, у реализации свои ограничения, но иногда он прям спасает: бывают ситуации в которых запрет прерываний ну прям совсем не вариант.
одна проблема этого подхода в том, что если ты LDREX сделал, а потом в другом месте еще раз LDREX то STREX только для второй отработает, насколько я помню. Да и в Cortex-M0 их нет в системе команд.
Да, это так, но AFAIK проблема сильно преувеличена: прерывания автоматически делают CLREX, поэтому если из пары LDREX / STREX нас посередине выдернули в прерывание, которое к примеру переключило контекст, потом там в новом контексте случился тоже LDREX, и нас опять перекинуло к первому STREX, то он завершиться ошибочно. Поскольку типичный паттерн использования этого хозяйства - это цикл, то проблем не будет, просто случится еще одна итерация. https://stackoverflow.com/questions/51043489/ldrex-strex-with-cortex-m3-and-m4
Именно, я к тому, что нужно понимать что есть нюансы и когда и как можно использовать, а когда не стоит
Это правило неплохо применять и в других, не связанных с этим, случаях)))
Обсуждают сегодня