Цитата(scifi @ May 31 2018, 16:46)
Никогда не понимал вот эту тягу обязательно разместить объект средствами линкера, когда достаточно обращаться к нему через указатель:
Код
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 Надо попробовать...
Цитата(aaarrr @ May 31 2018, 16:54)
Простой заменой не обойтись. Как-то так:
Код
__attribute__ ((section(".memarr"))) s_mem ss_mem;
и в .ld:
Ооо вот так бы не хотелось конечно, там много таких юнионов, получится каша и в линкере и в программе..