Bit-banding
Bit-banding — механизм ядер ARM Cortex-M3 и M4, который позволяет менять один бит в памяти или регистре периферии одной командой записи. Это атомарная операция: её нельзя прервать посередине, как обычное чтение-изменение-запись.
Обновлено Редакция GAW
Bit-banding — механизм ядер ARM Cortex-M3 и Cortex-M4, при котором первый мегабайт SRAM и первый мегабайт периферии продублированы областями-алиасами, где каждому биту исходной области соответствует отдельное 32-битное слово. Запись в такое слово меняет ровно один бит, а чтение возвращает его значение.
Как устроено
| Регион | Исходная область | Область-алиас |
|---|---|---|
| SRAM | 0x2000 0000–0x200F FFFF | с 0x2200 0000, 32 МБ |
| Периферия | 0x4000 0000–0x400F FFFF | с 0x4200 0000, 32 МБ |
Пример — бит 13 регистра GPIOC_ODR, который управляет выводом PC13 на плате Blue Pill. Регистр лежит по адресу 0x4001 100C, смещение от начала региона — 0x1100C, и адрес слова-алиаса: 0x4200 0000 + 0x1100C × 32 + 13 × 4 = 0x4222 01B4. Записав туда 1 или 0, программа включает или выключает вывод.
Зачем нужен
Запись в слово-алиас атомарна: шина сама выполняет чтение, изменение и запись, и прерывание не может вклиниться между ними. Это решает проблему, знакомую по флагам, общим для основной программы и прерываний: обычная установка бита — три команды, и изменение, сделанное прерыванием между ними, теряется. Переменные, к которым обращаются и прерывание, и основная программа, всё равно объявляют volatile. Карта памяти, шины и пример макроса на C — в статье об архитектуре Cortex-M3, другие способы атомарной работы с битами, включая регистр BSRR портов STM32, — в статье о битовых операциях и о GPIO STM32.
Частые вопросы
Как вычислить адрес бита в области bit-band?
Адрес слова = база алиаса + смещение байта × 32 + номер бита × 4. База — 0x2200 0000 для SRAM и 0x4200 0000 для периферии, смещение отсчитывается от 0x2000 0000 или 0x4000 0000. Для бита 13 регистра GPIOC_ODR STM32F103 по адресу 0x4001 100C получается 0x4222 01B4.
Чем bit-banding лучше обычной установки бита?
Обычная запись бита — это чтение регистра, изменение и запись, три команды. Если между ними сработает прерывание и изменит другой бит того же регистра, его изменение потеряется. Запись в слово-алиас меняет один бит, а чтение-изменение-запись выполняет шина, и прервать её нельзя.
У каких ядер есть bit-banding?
У Cortex-M3 и Cortex-M4 (в ревизии r2p1 и у M4 — как опция производителя кристалла). В ядрах Cortex-M0, M0+ и M7 его нет. Для выводов STM32 есть и другой атомарный способ — регистр BSRR, который устанавливает и сбрасывает отдельные биты выходного регистра одной записью.
Источники
- Arm. Cortex-M3 Processor Technical Reference Manual, revision r2p1 (ARM 100165), 2016 — разд. 3.7 — bit-banding: регионы, области-алиасы, формула адреса
- STMicroelectronics. PM0056: STM32F10xxx/20xxx/21xxx/L1xxxx Cortex-M3 programming manual, Rev 7, 2024 — карта памяти STM32F10x, регионы bit-band SRAM и периферии
Нашли ошибку?