Программирование STM32. Часть 5. “Bit Banding” - атомарный доступ к битам ОЗУ.. Раздел: STM32 Cortex M3.

Eugene's MCU

Суббота, 01.03.2014, 08:56

Главная | | Мой профиль | Выход | RSS
Меню сайта
Категории каталога
Рекламный блок



схемы новости электроники

Рекомендовать этот сайт:

Главная » Статьи » » STM32 Cortex M3


Программирование STM32. Часть 5. “Bit Banding” - атомарный доступ к битам ОЗУ.
§ > Битовый доступ Bit Banding
Традиционный способ сброса и установки битов переменных ОЗУ при помощи логических операций "И” и "ИЛИ” требует последовательного считывания переменной в РОН, модификации и сохранения изменённого значения в ОЗУ. Такой способ работы с битами, помимо большого объёма действий, не является атомарным, то есть, не гарантирует нормальную работу с переменной процессам, имеющим доступ к ней из обработчиков прерываний. Обращение таких процессов не даст нужного результата, если доступ к переменной произойдёт внутри цикла чтение – модификация - запись.
Для решения этой проблемы в архитектуре STM 32 предусмотрен механизм "Bit Banding”, обеспечивающий атомарный сброс и установку битов в ячейках RAM . Суть его заключается в том, что пространстве ОЗУ микроконтроллеров STM 32, помимо области хранения данных имеется дополнительная область регистров каждый из которых связан с отдельным битом в области хранения или в области регистров ввода-вывода. При этом запись в указанный регистр нулевого значения приводит к аппаратному сбросу соответствующего бита в области хранения переменных, а запись ненулевого значения устанавливает указанные биты.

Адреса регистров установки и сброса легко вычислить по номеру модифицируемого бита и адресу переменной или регистра, по формуле:

BB_ADR = SRAM_BB_BASE + ( ( ADR - SRAM_BASE) *32) + ( BIT * 4)
здесь: SRAM _ BASE - базовый адрес области хранения;
SRAM _ BB _ BASE - базовый адрес области доступа к битам;
ADR – адрес переменной, BIT – номер изменяемого бита переменной.
§ > Макросы Bit Banding
В приведённом примере макросы varSetBitBB, varClrBitBB и varGetBitBB осуществляют установку, сброс и проверку состояния битов переменной Flags через регистры Bit Banding:
#include "stm32F10x.h"

#define varClrBitBB(var, BitNumber)(*(vu32 *)\
(SRAM_BB_BASE | ((((u32)&var) - SRAM_BASE) << 5) | ((BitNumber) << 2)) = 0)
#define varSetBitBB(var, BitNumber)(*(vu32 *)\
(SRAM_BB_BASE | ((((u32)&var) - SRAM_BASE) << 5) | ((BitNumber) << 2)) = 1)
#define varGetBitBB(var, BitNumber)(*(vu32 *)\
(SRAM_BB_BASE | ((((u32)&var) - SRAM_BASE) << 5) | ((BitNumber) << 2)))

#define FLAG0     0 // Флаг 0.
#define FLAG1     1 // Флаг 1.
u32 Flags=(1<<FLAG1); // Битовое поле.
int main (void)
{
varSetBitBB (Flags,FLAG0); // Установить FLAG0.
// Если FLAG0 установлен, сбросить FLAG1.
if (varGetBitBB(Flags,FLAG0)) varClrBitBB(Flags,FLAG1);
}


При использовании материалов сайта ссылка на данный источник обязательна.

Категория: STM32 Cortex M3 | Добавил: eugenemcu (30.03.2011) | Автор:

Просмотров: 10224 | Комментарии: 6 | Рейтинг: 5.0 / 3 |
Всего комментариев: 6
* 1 (20.04.2011 18:28) [ Материал ]
Dtlm можно этот BB использовать с портам в/в ?

* 2 eugenemcu (20.04.2011 19:48) [ Материал ]
Можно - 2.3.7. Метод "Bit Banding" .
Но зачем, если есть регистры сброса/установки?!

* 3 (21.04.2011 16:30) [ Материал ]
А технику такого ББ возможно использовать применительно к STM8 ?

* 4 eugenemcu (21.04.2011 18:56) [ Материал ]
Это не техника, это особенность микроконтроллеров STM32. Ни в каких других подобного не встречал.

* 5 (21.07.2011 03:37) [ Материал ]
млжет так проще? так хотя бы читать и писать проще.
PORTC->PIN_4 = 1; //поднять ногу
PORTC->PIN_4 = 0; //опустить
а главное не нужно думать где этот пин, так же и ко всем регистрам можно стрктуры написать и использовать не попугайские биты, потом сидя в размышлениях думая что за такой бит 7 и почему он тут 1, а напрямую писать регистр такой то, ит тот то, равен тому то.

#define BB_GPIO(GPIO) ( PERIPH_BB_BASE + ( ((unsigned long)(&GPIO)-PERIPH_BASE)*32) )
typedef struct {
unsigned long PIN_0;
unsigned long PIN_1;
unsigned long PIN_2;
unsigned long PIN_3;
unsigned long PIN_4;
unsigned long PIN_5;
unsigned long PIN_6;
unsigned long PIN_7;
unsigned long PIN_8;
unsigned long PIN_9;
unsigned long PIN_10;
unsigned long PIN_11;
unsigned long PIN_12;
unsigned long PIN_13;
unsigned long PIN_14;
unsigned long PIN_15;
} PinSet_t;

PinSet_t *PORTC;
PORTC = (PinSet_t*) BB_GPIO(GPIOC->ODR);






















* 6 eugenemcu (21.07.2011 09:13) [ Материал ]
Вся соль регистров BB в обеспечении атомарного сброса/установки битов регистров, а это актуально, например, для битового поля, т.е. переменной, в которой биты, служат флагами для разных процессов, имеющих доступ к ней.
Зачем использовать BB для битов порта, что за необходимость? Для этого существуют регистр атомарного сброса/установки GPIOx->BSRR:

GPIOC->BSRR=GPIO_BSRR_BS4; // поднять ногу.
GPIOC->BSRR=GPIO_BSRR_BR4; //опустить.

и больше вообще ничего писать не нужно, никаких указателей, а если не нравятся IAR-овские названия масок, замените GPIO_BSRR_BS4 на SetPin_4 и т.д.
Тем более, что регистры BSRR позволяют в одну запись устанавливать и сбрасывать любое число битов порта, а через BB отображаемый на ODR только один.

А то, что биты управления портами STM32 раскиданы по соответствующим регистрам как будь-то после ядерного взрыва так это факт. Поэтому я написал себе макросы для работы с портами cpin, spin и т.д. см. статью “Часть 1. GPIO, порты ввода-вывода STM32”.

Статистика

Наш магазин




Какую среду разработки Вы используете?

[ Результаты · Архив опросов ]
Всего ответов: 1449



Им нужна Ваша помощь: