Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: warning: 'io' attribute directive ignored [-Wattributes]
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > GNU/OpenSource средства разработки
E_V_S
Доброго дня.

Подскажите пожалуйста как понимать 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) );

klen
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
E_V_S
контроллер 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 надобно будет указывать перечисленные секции в скрипте линкера, так?
doublekey
Делаю как-то так:
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
E_V_S
Спасибо за пояснение.

На данный момент, чтобы минимально вносить изменения в код который справедлив для 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 ) )
Сергей Борщ
QUOTE (E_V_S @ Dec 21 2012, 08:12) *
заменил макросы типа
Достаточно было заменить определение __IO_REG32_STRUCT, чтобы в результате разворачивания первого получался второй.

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


Это как? внутри одного дефайна вкладывать другой?
Не понял Вас...
Сергей Борщ
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))

Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.