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

Как в IAR сделатькак в GCC?

делаю драйвер для русской ethernet микросхемы

микруха голая - может только отправлять/принимать

кадры ethernet. плюс broadcast /unicast и все.

есть микростек, написаный для GCC, но его прямое копирование

и простые замны вызывают hard fault из за чтения/записи

по адресам не выравненным на 4.

в GCC это как то обходится, не знаю правильно или нет.

 

вот что я хочу сделать в IAR как в GCC:

1)

#pragma pack(2)
typedef union {
   uint8_t u8[6];
   uint16_t u16[3];
}/* __attribute__ ((packed))*/ mac_addr_t;


#define MAC_ADDR( a, b, c, d, e, f )  { u8: { a, b, c, d, e, f }}

Это возможно?

 

2) даные , коорые пересылаются в сети, например ARP пакет

 

/**
*  Заголовок ARP
*/
#pragma pack(2)
typedef struct {
   uint16_t hw_type;
   uint16_t prot_type;

   uint8_t hw_len;
   uint8_t prot_len;
   uint16_t oper;

   mac_addr_t s_mac;
   ip_addr_t s_ip;
   mac_addr_t t_mac;

   ip_addr_t t_ip;
}/* __attribute__ ((packed))*/ arp_packet_t;

 

если я напрямую беру поля, как это сделано в GCC: например

	        p->oper = ARP_OPER_REPLY;
		p->t_mac = p->s_mac;
		p->s_mac = mac_addr[ ifc ];
		p->t_ip = p->s_ip;
		p->s_ip = ip_addr[ ifc ];

вызывает описанную ошибку.

я такие выборки элементов структуры сделал черем memcpy

но хотелось бы оставить как это сделано в GCC

возможно ли это?

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


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

возможно ли это?

Странно, если бы было не возможно. Надеюсь, тип вашего секретного процессора компилятору хоть правильно указали?

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


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

Странно, если бы было не возможно. Надеюсь, тип вашего секретного процессора компилятору хоть правильно указали?

ничего секретного

процессор cortex m1 от миландра

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


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

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

 

А вообще, компилятор должен сам корректно тип доступа определять, если ему насильно не пытаться указать.

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


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

Так, это, #pragma pack(2) на #pragma pack(1) замените. Или, еще лучше, перед объявлением структуры сделайте #pragma pack (push,1), а после объявления - #pragma pack(pop)

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


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

Так, это, #pragma pack(2) на #pragma pack(1) замените. Или, еще лучше, перед объявлением структуры сделайте #pragma pack (push,1), а после объявления - #pragma pack(pop)

наверное в описании пакета это не обязательно - там все уже упаковано хоть на 2 хоть на 1

 

 

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

 

А вообще, компилятор должен сам корректно тип доступа определять, если ему насильно не пытаться указать.

 

да, проходил пошагово

асм не смотрел - обрывается как раз на доступах к структуре

если бы было все правильно-там был бы вызов какой нить функции

типа мemcpy_unaligned

 

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


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

наверное в описании пакета это не обязательно - там все уже упаковано хоть на 2 хоть на 1
Тогда обеспечьте и для p выравнивание на размер наибольшего члена структуры. Если не можете обеспечить выровненный указатель - объявляйте структуру упакованной. Если указатель выровнен - тогда непонятно, чего вы хотите.

 

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


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

если бы было все правильно-там был бы вызов какой нить функции

типа мemcpy_unaligned

Скорее там было бы встроено побайтовое обращение и склейка в длинную переменную. Вызов функции требует больше накладных расходов.

 

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


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

Ваша ситуация выглядит очень странной, все структуры IP, ARP, UDP,TCP сделаны таким образом, что любое поле может быть выбрано без нарушения выравнивания, если пакет выравнен по границе 4 байт. Вы бы посмотрели всё-таки в дизассемблер.

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


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

Ваша ситуация выглядит очень странной, все структуры IP, ARP, UDP,TCP сделаны таким образом, что любое поле может быть выбрано без нарушения выравнивания, если пакет выравнен по границе 4 байт. Вы бы посмотрели всё-таки в дизассемблер.

пакеты выровнены по границе 2 байта

добавил #pragma pack(2)

и убрал memcpy - все работает

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


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

добавил #pragma pack(2)

Трижды перечитал первое сообщение. Дважды в нем встретил #pragma pack(2). Так не было никакого #pragma pack(2)?

 

Запомните, правильно заданный вопрос - половина ответа.

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


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

еще один вопрос: ест ли в IAR какая нибудь опция чтобы он работал

совместимо с GCC?

иначе прихордится очень много кода исправлять

или вот такой можно ли библиотеки созданные в GCC

с ними скомпилит в IAR

форматы сильно различаются?

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


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

Больше 20 лет контора компилятор делает (секту свою запилила) и вдруг к другой секте примкнёт?

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


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

Больше 20 лет контора компилятор делает (секту свою запилила) и вдруг к другой секте примкнёт?

GCC шная секта?

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


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

еще один вопрос: ест ли в IAR какая нибудь опция чтобы он работал

совместимо с GCC?

иначе прихордится очень много кода исправлять

или вот такой можно ли библиотеки созданные в GCC

с ними скомпилит в IAR

форматы сильно различаются?

Не вижу никакой проблемы.

Всего-то и нужно, что писать на языке "C", а не "GCC".

Придерживайтесь стандарта С и не используйте расширения языка без особой на то необходимости, для такого процессора как ARM это не составляет никакой сложности.

 

Как пример можете посмотреть файлы из CMSIS, в них в .h (но не в .c !) частенько встречается что-то вроде

#if   defined ( __CC_ARM )
...
#elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)
...
#elif defined ( __GNUC__ )
...
#elif defined ( __ICCARM__ )
...

Но это как правило касается нестандартных расширений или просто несоответствия стандарту в разных компиляторах.

Без некоторых из них в embedded мире, увы, не обойтись, но нужны они далеко не на каждой странице.

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


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

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

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

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

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

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

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

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

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

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