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

реализация булевых переменных в bit-band

Привет

Вижу для родного gcc - самое правильное

typedef uint32_t __attribute__((section(".bitmap"))) bit;

Какбы вопросы, возникающие в связи с этим:

1. Как избежать использование области памяти в не bit-band в линкер скрипте?

2. Как наоборот, - проще получить параметры этой области или ее части для быстрого обнуления?

 

Спасибо.

ps

вот увидел такое http://stackoverflow.com/questions/1655271...ection-in-c-gcc

/**
* Assuming you've tagged some stuff earlier with:
* __attribute((__section__("my_custom_section")))
*/

struct thing *iter = &__start_my_custom_section;

for (; iter < &__stop_my_custom_section; ++iter) {
    /* do something with *iter */
}

т.е. получается, что я могу выделить под битмап что-то

и его размер будет

extern char bitmap[((uint) __stop_my_custom_section - __start_my_custom_section)/32];

а как мне на этапе компиляции назначить адрес этой области?

Изменено пользователем _Pasha

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а как мне на этапе компиляции назначить адрес этой области?

Bit-band - via a linker.
Код для GCC - линкер.
xxx_sram/flash.ld

MEMORY
{
   ROM  (rx) : ORIGIN = 0x08000000, LENGTH = __
   RAM (rwx) : ORIGIN = 0x20000000, LENGTH = __
   BITRAM (rw) : ORIGIN = 0x22000000, LENGTH = 2048K // - LENGTH(RAM) * 128
}
----
/* SRAM base address in the bit-band region*/
  _sramflag = .;
  sflagadres =  ((_sramflag - ORIGIN(RAM)) << 5 );
   .flag  (NOLOAD):
   {
      . += sflagadres;
      . = ALIGN(4);
      _sflag = .;
      KEEP(*(.flag))
      . = ALIGN(128);
      _eflag = .;
   } > BITRAM
   _eramflag = ((_eflag - _sflag) >> 5);
/* SRAM base address in the bit-band region*/
  .bss (NOLOAD):
  {
     __bss_start__ = .;
       . += _eramflag;
     *(.bss*)
     *(COMMON)
     __bss_end__ = .;
  } > RAM

С код.
#define _FLAG __attribute__ ((section(".flag")))

Далее по коду С.
volatile uint32_t temp_name_flag  _FLAG;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Например так (IAR):

распредление памяти: u8 noSleepDMA @ ".BITBAND_RAM" = 0;

объявления бит: enum {DMA_CH_lcd_RX, DMA_CH_lcd_TX};

Операция присваивания (через макрос): *BITBAND_RAM(&noSleepDMA, DMA_CH_lcd_RX) = ...

icf-файл линкёра:

define region RAM_regionB = mem:[from 0x20000000 size 0x8000]; //peripheral RAM

place in RAM_regionB {section .BITBAND_RAM, section .dma, section .ethernet};

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

гран мерси.

т.е. суть приема в том, что назначаем область битовых флагов в начале доступной области SRAM и корректируем начало .bss в соответствии с использованием секции флагов

отдельное спасибо за

 . = ALIGN(128);

:rolleyes:

гарантированно сидел бы фтыкал :)

--

а, ну и по _FLAG - все-таки bit через typedef uint32_t итд правильнее.

Изменено пользователем _Pasha

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

typedef uint32_t __attribute__((section(".bitmap"))) bit;

 

Вы уверенны что смена названия типа переменной лучше макроса? У меня GCC матерится на смену типа.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Можно обычным дифайном обойтись. Например у меня в одном из проектов.

#define PortF_Bit0 (*((volatile unsigned long *) 0x43D00000))
//PortF_Bit0 = 1;//установить бит 0 в единицу
//PortF_Bit0 = 0;//установить бит 0 в ноль

#define PortF_Bit1 (*((volatile unsigned long *) 0x43D00004))
//PortF_Bit1 = 1;//установить бит 1 в единицу
//PortF_Bit1 = 0;//установить бит 1 в ноль

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Можно обычным дифайном обойтись. Например у меня в одном из проектов.

...

Только как память выделить в Вашем случае?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а зачем память выделять, разве это не зарезирвированное адресное пространство?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а зачем память выделять, разве это не зарезирвированное адресное пространство?

Это обычная память. Для которой есть область - алиас. Человек пишет в алиас-область, при этом опущено выделение этой памяти по настоящим адресам.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

это типа чтобы через удобные переменные работать что ли? Почему по прямым адресам нельзя писать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

это типа чтобы через удобные переменные работать что ли? Почему по прямым адресам нельзя писать?

Блин! прочитайте про bit-banding.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Какой ужас. Зачем идти на все эти извращения? Чтобы сэкономить несколько байтов? Или у вас в программе 100500 флагов? Не стоит оно всей этой возни, ИМХО...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это обычная память. Для которой есть область - алиас. Человек пишет в алиас-область, при этом опущено выделение этой памяти по настоящим адресам.

По настоящим адресам и есть обращение. Например:

(*((volatile unsigned long *) 0x43D00000))

И не надо ничего выдумывать, такой вариант работает в компиляторах для ARM и для любых других.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

правильный ответ уже содержится в сообщ. №2

Дык там тоже ужас :laughing:

Вопрос-то был "зачем?"

Сказали бы "из любви к искусству" - я бы понял. Куда же без этого :rolleyes:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...