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

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

    
  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
0
* 1 (20.04.2011 18:28) [Материал]
Dtlm можно этот BB использовать с портам в/в ?

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

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

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

0
* 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);

0
* 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



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