2.3.7. Метод "Bit Banding"
У предшествующих ЦПУ ARM7 и ARM9 битовые операции в статическом ОЗУ можно было выполнять только с помощью инструкций AND и OR. Для этого необходимо выполнить последовательность ЧТЕНИЕ - МОДИФИКАЦИЯ - ЗАПИСЬ. Однако использование этого метода приводит к чрезмерному расходованию количества циклов на выполнение установки и сброса отдельных бит и увеличению результирующего кода программы.
Метод bit banding позволяет выполнять битовые операции при сохранении логических вентилей ЦПУ Cortex-M3 на минимальном уровне
Преодолеть данное ограничение можно, если предусмотреть отдельные инструкции сброса и установки бит или интегрировать полнофункциональный процессор битовой обработки, однако это приведет к увеличению размеров и сложности ЦПУ. Вместо этого, способ, называемый bit banding, позволяет напрямую воздействовать на биты в памяти из областей УВВ и статического ОЗУ, не используя при этом каких-либо специальных инструкций. Битноадресуемые области карты памяти Cortex разделены на две части: область хранения бит (в нее входят до 1 Мбайт физической памяти или регистров УВВ) и область доступа к битам, которая занимает до 32 Мбайт карты памяти. Получить доступ к каждому отдельному биту из области хранения бит можно по соответствующему адресу слова из области доступа к битам. Таким образом, если выполнять запись по адресу в области доступа к битам на самом деле мы будем воздействовать на значение определенного бита в физической памяти.
Метод Bit Banding поддерживается в областях статического ОЗУ и УВВ (первые 1 Мбайт), охватывая все ресурсы STM32
В итоге, мы можем воздействовать на значение отдельных бит, не прибегая, при этом, к использованию специальных инструкций и сохраняя результирующие размеры ядра Cortex на минимально возможном уровне. Чтобы использовать этот метод на практике, необходимо вычислить адрес слова в области доступа к битам, который соответствует заданной ячейки памяти из области УВВ или статического ОЗУ. Выполняется это по следующей формуле:
Адрес в области доступа к битам = Базовый адрес области доступа к битам + Смещение адреса слова доступа к биту,
где Смещение адреса слова доступа к биту = Смещение в байтах по отношению базовому адресу области хранения бит х 0x20 + номер бита х 4
На самом деле все обстоит гораздо проще, чем может показаться на первый взгляд. Рассмотрим практический пример. Необходимо выполнить запись в выходной регистр порта ввода-вывода (ПВВ) для установки или сброса отдельных линий ввода-вывода. Физический адрес выходного регистра порта В - 0x40010C0C. Предположим, что нужно устанавливать и сбрасывать бит 8 этого регистра. Воспользуемся приведенной выше формулой:
Адрес слова = 0x40010C0C
Базовый адрес области хранения бит УВВ = 0x40000000
Базовый адрес области доступа к битам УВВ = 0x42000000
Смещение в байтах по отношению базовому адресу области хранения бит = 0x40010C0C - 0x40000000 = 10C0C
Смещение адреса слова доступа к биту = (0x10С0С x 0x20) +(8x4) = 0x2181A0
Адрес в области доступа к битам = 0x42000000 + 0x2181A0 = 0x422181A0
Теперь мы можем создать указатель на этот адрес с помощью следующей Си-строки:
#define PortBbit8 (*((volatile unsigned long *) 0x422181A0 ))
|
После этого, этот указатель можно использовать для установки и сброса бит ПВВ:
PB8 = 1; //включаем светодиод
|
После компиляции будут сгенерированы следующие ассемблерные инструкции:
MOVS r0,#0x01
LDR r1,[pc,#104]
STR r0,[r1,#0x00]
|
Для отключения светодиода используем строку:
PB8 = 0; // отключаем светодиод
|
Ей соответствуют следующие ассемблерные инструкции:
MOVS r0,#0x00
LDR r1,[pc,#88]
STR r0,[r1,#0x00]
|
Таким образом, для установки или сброса бита необходимо выполнить три 16-битных инструкции. Микроконтроллер STM32, работающий на частоте 72 МГц, выполнит их за 80 нс. Альтернативно установку или сброс бита можно выполнить, если применить логическую операцию "ИЛИ" или "И" ко всему слову из области хранения бит УВВ или статического ОЗУ:
GPIOB->ODR |= 0x00000100; //Включение светодиода
LDR r0,[pc,#68]
ADDS r0,r0,#0x08
LDR r0,[r0,#0x00]
ORR r0,r0,#0x100
LDR r1,[pc,#64]
STR r0,[r1,#0xC0C]
GPIOB->ODR &=!0x00000100; //Отключение светодиода
LDR r0,[pc,#40]
ADDS r0,r0,#0x08
LDR r0,[r0,#0x00]
MOVS r0,#0x00
LDR r1,[pc,#40]
STR r0,[r1,#0xC0C]
|
Но в таком случае, одна операция установки/сброса потребует выполнения смеси 16- и 32-битных инструкций, которые займут минимум 14 байт и на той же тактовой частоте будут выполняться как минимум 180 нс. Таким образом, в программе, где используется установка/сброс множества бит в регистрах УВВ, а также применяются семафоры и флаги в статическом ОЗУ, использование метода bit banding позволит существенно сэкономить, как размер кода программы, так и время его выполнения.
|