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

 
 
 
Reply to this topicStart new topic
> Подскажите GCC аналог IARовской записи
mantech
сообщение May 31 2018, 13:32
Сообщение #1


Гуру
******

Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



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

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


#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.
Go to the top of the page
 
+Quote Post
scifi
сообщение May 31 2018, 13:46
Сообщение #2


Гуру
******

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



Никогда не понимал вот эту тягу обязательно разместить объект средствами линкера, когда достаточно обращаться к нему через указатель:
Код
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. Но в эмбеддерском коде часто есть что-нибудь такое, что делает этот ключик обязательным.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 31 2018, 13:54
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



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

Код
__attribute__ ((section(".memarr"))) s_mem ss_mem;


и в .ld:

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

SECTIONS
{
    ...
    .memarr (NOLOAD):
    {
        *(.memarr)
    } > MEMARR
}
Go to the top of the page
 
+Quote Post
mantech
сообщение May 31 2018, 14:11
Сообщение #4


Гуру
******

Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



Цитата(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:



Ооо вот так бы не хотелось конечно, там много таких юнионов, получится каша и в линкере и в программе..
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 31 2018, 15:10
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(mantech @ May 31 2018, 17:11) *
...там много таких юнионов

Прибитых к разным адресам, или все же к одной области?
Go to the top of the page
 
+Quote Post
adnega
сообщение May 31 2018, 15:27
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



А так?
Код
#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];
Go to the top of the page
 
+Quote Post
mantech
сообщение May 31 2018, 18:39
Сообщение #7


Гуру
******

Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



Цитата(aaarrr @ May 31 2018, 18:10) *
Прибитых к разным адресам, или все же к одной области?



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

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

#define mem ((uint16_t*)MEMARR_BASE)
#define memb ((uint8_t*)MEMARR_BASE)
#define memdw ((uint32_t*)MEMARR_BASE)

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

Всем спасибо cool.gif

Сообщение отредактировал mantech - May 31 2018, 18:40
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 18th April 2024 - 11:21
Рейтинг@Mail.ru


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