реклама на сайте
подробности

 
 
4 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> реализация булевых переменных в bit-band, кто до чего дошел
_Pasha
сообщение Oct 16 2015, 07:00
Сообщение #1


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Привет
Вижу для родного 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 - Oct 16 2015, 07:12
Go to the top of the page
 
+Quote Post
AVI-crak
сообщение Oct 16 2015, 08:28
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 182
Регистрация: 16-10-15
Пользователь №: 88 894



Цитата(_Pasha @ Oct 16 2015, 14:00) *
а как мне на этапе компиляции назначить адрес этой области?

CODE

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;
Go to the top of the page
 
+Quote Post
jcxz
сообщение Oct 16 2015, 08:50
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Например так (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};
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Oct 16 2015, 08:59
Сообщение #4


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



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

rolleyes.gif
гарантированно сидел бы фтыкал sm.gif
--
а, ну и по _FLAG - все-таки bit через typedef uint32_t итд правильнее.

Сообщение отредактировал _Pasha - Oct 16 2015, 09:18
Go to the top of the page
 
+Quote Post
AVI-crak
сообщение Oct 16 2015, 16:05
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 182
Регистрация: 16-10-15
Пользователь №: 88 894



Код
typedef uint32_t __attribute__((section(".bitmap"))) bit;


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

Go to the top of the page
 
+Quote Post
copov
сообщение Oct 19 2015, 09:05
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 118
Регистрация: 2-03-05
Из: Санкт-Петербург
Пользователь №: 3 012



Можно обычным дифайном обойтись. Например у меня в одном из проектов.
Код
#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 в ноль

Go to the top of the page
 
+Quote Post
jcxz
сообщение Oct 19 2015, 09:31
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(copov @ Oct 19 2015, 15:05) *
Можно обычным дифайном обойтись. Например у меня в одном из проектов.
...

Только как память выделить в Вашем случае?
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Oct 19 2015, 18:53
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



а зачем память выделять, разве это не зарезирвированное адресное пространство?
Go to the top of the page
 
+Quote Post
jcxz
сообщение Oct 21 2015, 05:23
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Golikov A. @ Oct 20 2015, 00:53) *
а зачем память выделять, разве это не зарезирвированное адресное пространство?

Это обычная память. Для которой есть область - алиас. Человек пишет в алиас-область, при этом опущено выделение этой памяти по настоящим адресам.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Oct 21 2015, 05:25
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



это типа чтобы через удобные переменные работать что ли? Почему по прямым адресам нельзя писать?
Go to the top of the page
 
+Quote Post
jcxz
сообщение Oct 21 2015, 06:59
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Golikov A. @ Oct 21 2015, 11:25) *
это типа чтобы через удобные переменные работать что ли? Почему по прямым адресам нельзя писать?

Блин! прочитайте про bit-banding.
Go to the top of the page
 
+Quote Post
scifi
сообщение Oct 21 2015, 07:30
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Какой ужас. Зачем идти на все эти извращения? Чтобы сэкономить несколько байтов? Или у вас в программе 100500 флагов? Не стоит оно всей этой возни, ИМХО...
Go to the top of the page
 
+Quote Post
copov
сообщение Oct 21 2015, 07:50
Сообщение #13


Частый гость
**

Группа: Свой
Сообщений: 118
Регистрация: 2-03-05
Из: Санкт-Петербург
Пользователь №: 3 012



Цитата(jcxz @ Oct 21 2015, 08:23) *
Это обычная память. Для которой есть область - алиас. Человек пишет в алиас-область, при этом опущено выделение этой памяти по настоящим адресам.

По настоящим адресам и есть обращение. Например:
(*((volatile unsigned long *) 0x43D00000))
И не надо ничего выдумывать, такой вариант работает в компиляторах для ARM и для любых других.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Oct 21 2015, 07:59
Сообщение #14


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(scifi @ Oct 21 2015, 10:30) *
Какой ужас.

biggrin.gif
правильный ответ уже содержится в сообщ. №2
Go to the top of the page
 
+Quote Post
scifi
сообщение Oct 21 2015, 08:04
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(_Pasha @ Oct 21 2015, 10:59) *
правильный ответ уже содержится в сообщ. №2

Дык там тоже ужас laughing.gif
Вопрос-то был "зачем?"
Сказали бы "из любви к искусству" - я бы понял. Куда же без этого rolleyes.gif
Go to the top of the page
 
+Quote Post

4 страниц V   1 2 3 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 15:01
Рейтинг@Mail.ru


Страница сгенерированна за 0.01478 секунд с 7
ELECTRONIX ©2004-2016