mantech 38 31 мая, 2018 Опубликовано 31 мая, 2018 · Жалоба Приветствую. Возникли сложности с переводом проги с ИАРа на гцц #define MEMARR_BASE 0x40000000 //main array base adr typedef union {Uint32 mem_dw[MAXMEM/2];Uint16 mem_w[MAXMEM];unsigned char mem_b[MAXMEM*2];} s_mem; #pragma location = MEMARR_BASE __no_init s_mem ss_mem; #define mem ss_mem.mem_w #define memb ss_mem.mem_b #define memdw ss_mem.mem_dw Как это записать в виде понятном гцц? В особенности что данный массив должен быть расположен в памяти с адреса MEMARR_BASE. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 31 мая, 2018 Опубликовано 31 мая, 2018 · Жалоба Никогда не понимал вот эту тягу обязательно разместить объект средствами линкера, когда достаточно обращаться к нему через указатель: s_mem* const ss_mem = (s_mem*)MEMARR_BASE; #define mem ss_mem->mem_w #define memb ss_mem->mem_b #define memdw ss_mem->mem_dw Или даже так: #define mem ((uint16_t*)MEMARR_BASE) #define memb ((uint8_t*)MEMARR_BASE) #define memdw ((uint32_t*)MEMARR_BASE) Из недостатков, конечно, "breaks strict aliasing rules". Соответственно, к ключикам компилятора добавить -fno-strict-aliasing. Но в эмбеддерском коде часто есть что-нибудь такое, что делает этот ключик обязательным. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 31 мая, 2018 Опубликовано 31 мая, 2018 · Жалоба Простой заменой не обойтись. Как-то так: __attribute__ ((section(".memarr"))) s_mem ss_mem; и в .ld: MEMORY { ... MEMARR (rw) : ORIGIN = 0x40000000, LENGTH = ??? } SECTIONS { ... .memarr (NOLOAD): { *(.memarr) } > MEMARR } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 38 31 мая, 2018 Опубликовано 31 мая, 2018 · Жалоба Никогда не понимал вот эту тягу обязательно разместить объект средствами линкера, когда достаточно обращаться к нему через указатель: s_mem* const ss_mem = (s_mem*)MEMARR_BASE; #define mem ss_mem->mem_w #define memb ss_mem->mem_b #define memdw ss_mem->mem_dw Или даже так: #define mem ((uint16_t*)MEMARR_BASE) #define memb ((uint8_t*)MEMARR_BASE) #define memdw ((uint32_t*)MEMARR_BASE) Из недостатков, конечно, "breaks strict aliasing rules". Соответственно, к ключикам компилятора добавить -fno-strict-aliasing. Но в эмбеддерском коде часто есть что-нибудь такое, что делает этот ключик обязательным. В принципе можно и так, коли все равно можно обращаться как mem[n]=x Надо попробовать... Простой заменой не обойтись. Как-то так: __attribute__ ((section(".memarr"))) s_mem ss_mem; и в .ld: Ооо вот так бы не хотелось конечно, там много таких юнионов, получится каша и в линкере и в программе.. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 31 мая, 2018 Опубликовано 31 мая, 2018 · Жалоба ...там много таких юнионов Прибитых к разным адресам, или все же к одной области? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 31 мая, 2018 Опубликовано 31 мая, 2018 · Жалоба А так? #define MEMARR_BASE 0x40000000 typedef union { uint32_t mem_dw[MAXMEM / 2]; uint16_t mem_w[MAXMEM]; uint8_t mem_b[MAXMEM * 2]; } s_mem; volatile s_mem *ss_mem = (volatile s_mem *)MEMARR_BASE; ss_mem->mem_b[0]; ss_mem->mem_w[1]; ss_mem->mem_dw[2]; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 38 31 мая, 2018 Опубликовано 31 мая, 2018 (изменено) · Жалоба Прибитых к разным адресам, или все же к одной области? Да, конечно к разным. Сделал вот так #define mem ((uint16_t*)MEMARR_BASE) #define memb ((uint8_t*)MEMARR_BASE) #define memdw ((uint32_t*)MEMARR_BASE) Все завелось нормально, даже не ругнулось вроде, за исключением усб драйвера, там была какая-то сложная передача адреса массива периодического листа контроллера, пришлось повыкидывать все эти преобразования типов, адресов в указатели и пр. бреда, просто задал адрес в памяти и все... Всем спасибо B) Изменено 31 мая, 2018 пользователем mantech Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться