_Pasha 0 16 октября, 2015 Опубликовано 16 октября, 2015 (изменено) · Жалоба Привет Вижу для родного 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]; а как мне на этапе компиляции назначить адрес этой области? Изменено 16 октября, 2015 пользователем _Pasha Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AVI-crak 0 16 октября, 2015 Опубликовано 16 октября, 2015 · Жалоба а как мне на этапе компиляции назначить адрес этой области? 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; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 16 октября, 2015 Опубликовано 16 октября, 2015 · Жалоба Например так (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}; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 16 октября, 2015 Опубликовано 16 октября, 2015 (изменено) · Жалоба гран мерси. т.е. суть приема в том, что назначаем область битовых флагов в начале доступной области SRAM и корректируем начало .bss в соответствии с использованием секции флагов отдельное спасибо за . = ALIGN(128); :rolleyes: гарантированно сидел бы фтыкал :) -- а, ну и по _FLAG - все-таки bit через typedef uint32_t итд правильнее. Изменено 16 октября, 2015 пользователем _Pasha Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AVI-crak 0 16 октября, 2015 Опубликовано 16 октября, 2015 · Жалоба typedef uint32_t __attribute__((section(".bitmap"))) bit; Вы уверенны что смена названия типа переменной лучше макроса? У меня GCC матерится на смену типа. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
copov 2 19 октября, 2015 Опубликовано 19 октября, 2015 · Жалоба Можно обычным дифайном обойтись. Например у меня в одном из проектов. #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 в ноль Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 19 октября, 2015 Опубликовано 19 октября, 2015 · Жалоба Можно обычным дифайном обойтись. Например у меня в одном из проектов. ... Только как память выделить в Вашем случае? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 19 октября, 2015 Опубликовано 19 октября, 2015 · Жалоба а зачем память выделять, разве это не зарезирвированное адресное пространство? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 21 октября, 2015 Опубликовано 21 октября, 2015 · Жалоба а зачем память выделять, разве это не зарезирвированное адресное пространство? Это обычная память. Для которой есть область - алиас. Человек пишет в алиас-область, при этом опущено выделение этой памяти по настоящим адресам. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 21 октября, 2015 Опубликовано 21 октября, 2015 · Жалоба это типа чтобы через удобные переменные работать что ли? Почему по прямым адресам нельзя писать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 21 октября, 2015 Опубликовано 21 октября, 2015 · Жалоба это типа чтобы через удобные переменные работать что ли? Почему по прямым адресам нельзя писать? Блин! прочитайте про bit-banding. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 21 октября, 2015 Опубликовано 21 октября, 2015 · Жалоба Какой ужас. Зачем идти на все эти извращения? Чтобы сэкономить несколько байтов? Или у вас в программе 100500 флагов? Не стоит оно всей этой возни, ИМХО... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
copov 2 21 октября, 2015 Опубликовано 21 октября, 2015 · Жалоба Это обычная память. Для которой есть область - алиас. Человек пишет в алиас-область, при этом опущено выделение этой памяти по настоящим адресам. По настоящим адресам и есть обращение. Например: (*((volatile unsigned long *) 0x43D00000)) И не надо ничего выдумывать, такой вариант работает в компиляторах для ARM и для любых других. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 21 октября, 2015 Опубликовано 21 октября, 2015 · Жалоба Какой ужас. правильный ответ уже содержится в сообщ. №2 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 21 октября, 2015 Опубликовано 21 октября, 2015 · Жалоба правильный ответ уже содержится в сообщ. №2 Дык там тоже ужас :laughing: Вопрос-то был "зачем?" Сказали бы "из любви к искусству" - я бы понял. Куда же без этого :rolleyes: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться