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

 
 
 
Reply to this topicStart new topic
> warning: 'io' attribute directive ignored [-Wattributes], __attribute__((io(0xXXXXXXXX)))
E_V_S
сообщение Dec 19 2012, 11:45
Сообщение #1





Группа: Участник
Сообщений: 12
Регистрация: 23-07-12
Пользователь №: 72 873



Доброго дня.

Подскажите пожалуйста как понимать warning: 'io' attribute directive ignored [-Wattributes] и как его победить?

Задача была "отмапировать" набор/структуру регистров по заданным адресам. C IAR все впорядке (и все уже работает), а вот GCC пишет многие WARNINGи

#ifdef __GNUC__
#define __IO_MAP(ADR) __attribute__((io(ADR)))
#else
#ifdef __IAR_SYSTEMS_ICC__
#define __IO_MAP(ADR) @ ADR
...

#define __IO_REG32_STRUCT(TYPE, NAME, MAP_TAG)\
volatile TYPE NAME MAP_TAG


получаю warning например тут:

__IO_REG32_STRUCT(t_adc, ADC_M, __IO_MAP(BASE_ADR_M_ADC) );

Go to the top of the page
 
+Quote Post
klen
сообщение Dec 19 2012, 20:43
Сообщение #2


бессмертным стать можно тремя способами
*****

Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912



1. Вы не указали архитектуру проца, а это ключевой момент. атрибут io имеет смысл (http://gcc.gnu.org/onlinedocs/gcc/Variable-Attributes.html) вродебы только для архитектуры MeP
2. не совсем понял что куда отмапить нада, но нутром чувствую что Вам нужно следующкее:


typedef struct
{
volatile uint32_t reg0;
volataile uint32_t reg1
.....
}PeriferialRegs ;


#define PERIFERIAL_ADDR (0x123456)
#define PERIFERIAL ((PeriferialRegs*) PERIFERIAL_ADDR)

вкоде

PERIFERIAL->reg0 = 12

запишет 12 по адресу 0x123456
Go to the top of the page
 
+Quote Post
E_V_S
сообщение Dec 20 2012, 05:29
Сообщение #3





Группа: Участник
Сообщений: 12
Регистрация: 23-07-12
Пользователь №: 72 873



контроллер ARM 926ej-s.

Спасибо за ссылку.

Видимо придется использовать вариант предложенный Вами.

А что за архитектура MeP?

Еще на сколько я понял можно использовать атрибут section:

section ("section-name")
Normally, the compiler places the objects it generates in sections like data and bss. Sometimes, however, you need additional sections, or you need certain particular variables to appear in special sections, for example to map to special hardware. The section attribute specifies that a variable (or function) lives in a particular section. For example, this small program uses several specific section names:

struct duart a __attribute__ ((section ("DUART_A"))) = { 0 };
struct duart b __attribute__ ((section ("DUART_B"))) = { 0 };


но в случае с section надобно будет указывать перечисленные секции в скрипте линкера, так?
Go to the top of the page
 
+Quote Post
doublekey
сообщение Dec 20 2012, 14:51
Сообщение #4


Участник
*

Группа: Свой
Сообщений: 71
Регистрация: 28-01-08
Из: Zelenograd
Пользователь №: 34 503



Делаю как-то так:
fpga.h:
Код
/// Структура регистров ПЛИС.
struct fpga_regs_s
{
  union ctrl_regs ctrl; ///< Регистры управления.
  union led_regs  leds; ///< Регистр управления светодиодов.
};

extern volatile struct fpga_regs_s FPGARegs; // Регистры управления ПЛИС.

fpga.c
Код
#include "fpga.h"

__attribute__ ((section(".FPGARegsFile")))
volatile struct fpga_regs_s FPGARegs;

В файле линкера headers.ld прописываю
Код
/* Расположение периферии в памяти */
MEMORY
{
  FPGA_CNTRL      : ORIGIN = 0x40050000, LENGTH = 0x000B0000
}

SECTIONS
{
  .FPGARegsFile       (NOLOAD) : {KEEP(*(.FPGARegsFile))}        > FPGA_CNTRL
}

Ну и также есть расположение другой периферии. Остальные секции генерируемые компилятором и карта памяти в другом файле.
Линкеру потом подсовываю этот файл -Theaders.ld

Сообщение отредактировал doublekey - Dec 20 2012, 14:52
Go to the top of the page
 
+Quote Post
E_V_S
сообщение Dec 21 2012, 06:12
Сообщение #5





Группа: Участник
Сообщений: 12
Регистрация: 23-07-12
Пользователь №: 72 873



Спасибо за пояснение.

На данный момент, чтобы минимально вносить изменения в код который справедлив для IAR и должен быть доступен для GCC, заменил макросы

типа:
__IO_REG32_STRUCT(t_adc, ADC_M, __IO_MAP(BASE_ADR_M_ADC) );

на макросы типа:
#define ADC_M ( *((volatile t_adc* ) BASE_ADR_M_ADC ) )
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 21 2012, 07:18
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (E_V_S @ Dec 21 2012, 08:12) *
заменил макросы типа
Достаточно было заменить определение __IO_REG32_STRUCT, чтобы в результате разворачивания первого получался второй.

Добавлено: фигню сморозил. Чтобы в результате его разворачивания получился эквивалент второго.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
E_V_S
сообщение Dec 21 2012, 07:23
Сообщение #7





Группа: Участник
Сообщений: 12
Регистрация: 23-07-12
Пользователь №: 72 873



Цитата(Сергей Борщ @ Dec 21 2012, 10:18) *
Достаточно было заменить определение __IO_REG32_STRUCT, чтобы в результате разворачивания первого получался второй.


Это как? внутри одного дефайна вкладывать другой?
Не понял Вас...
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 21 2012, 08:06
Сообщение #8


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (E_V_S @ Dec 21 2012, 09:23) *
Это как? внутри одного дефайна вкладывать другой?
Я там уже дописал, что фигню сморозил. Что-то типа такого:
CODE
#undef __IO_REG32_STRUCT
#undef __IO_MAP
#define __IO_MAP(addr)   addr
#define __IO_REG32_STRUCT(type, name, addr)        static type volatile name = (*((volatile type *)addr))



--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 20th July 2025 - 16:30
Рейтинг@Mail.ru


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