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

Подскажите GCC аналог IARовской записи

Приветствую.

 

Возникли сложности с переводом проги с ИАРа на гцц

 

 

#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.

 

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


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

Никогда не понимал вот эту тягу обязательно разместить объект средствами линкера, когда достаточно обращаться к нему через указатель:

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. Но в эмбеддерском коде часто есть что-нибудь такое, что делает этот ключик обязательным.

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


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

Простой заменой не обойтись. Как-то так:

 

__attribute__ ((section(".memarr"))) s_mem ss_mem;

 

и в .ld:

 

MEMORY
{
    ...
    MEMARR (rw) : ORIGIN = 0x40000000, LENGTH = ???
}

SECTIONS
{
    ...
    .memarr (NOLOAD):
    {
        *(.memarr)
    } > MEMARR
}

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


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

Никогда не понимал вот эту тягу обязательно разместить объект средствами линкера, когда достаточно обращаться к нему через указатель:

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:

 

 

Ооо вот так бы не хотелось конечно, там много таких юнионов, получится каша и в линкере и в программе..

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


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

...там много таких юнионов

Прибитых к разным адресам, или все же к одной области?

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


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

А так?

#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];

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


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

Прибитых к разным адресам, или все же к одной области?

 

 

Да, конечно к разным.

 

Сделал вот так

 

#define mem ((uint16_t*)MEMARR_BASE)

#define memb ((uint8_t*)MEMARR_BASE)

#define memdw ((uint32_t*)MEMARR_BASE)

 

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

 

Всем спасибо B)

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

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


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

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

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

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

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

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

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

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

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

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