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

Bit-banding

Bit-banding — механизм ядер ARM Cortex-M3 и M4, который позволяет менять один бит в памяти или регистре периферии одной командой записи. Это атомарная операция: её нельзя прервать посередине, как обычное чтение-изменение-запись.

Обновлено Редакция GAW

Bit-banding — механизм ядер ARM Cortex-M3 и Cortex-M4, при котором первый мегабайт SRAM и первый мегабайт периферии продублированы областями-алиасами, где каждому биту исходной области соответствует отдельное 32-битное слово. Запись в такое слово меняет ровно один бит, а чтение возвращает его значение.

Как устроено

РегионИсходная областьОбласть-алиас
SRAM0x2000 0000–0x200F FFFFс 0x2200 0000, 32 МБ
Периферия0x4000 0000–0x400F FFFFс 0x4200 0000, 32 МБ
адрес слова=база алиаса+смещение байта×32+номер бита×4\text{адрес слова} = \text{база алиаса} + \text{смещение байта} \times 32 + \text{номер бита} \times 4

Пример — бит 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, который устанавливает и сбрасывает отдельные биты выходного регистра одной записью.

Источники

  1. Arm. Cortex-M3 Processor Technical Reference Manual, revision r2p1 (ARM 100165), 2016 — разд. 3.7 — bit-banding: регионы, области-алиасы, формула адреса
  2. STMicroelectronics. PM0056: STM32F10xxx/20xxx/21xxx/L1xxxx Cortex-M3 programming manual, Rev 7, 2024 — карта памяти STM32F10x, регионы bit-band SRAM и периферии

Нашли ошибку?