Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как в IAR сделатькак в GCC?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
inventor
делаю драйвер для русской ethernet микросхемы
микруха голая - может только отправлять/принимать
кадры ethernet. плюс broadcast /unicast и все.
есть микростек, написаный для GCC, но его прямое копирование
и простые замны вызывают hard fault из за чтения/записи
по адресам не выравненным на 4.
в GCC это как то обходится, не знаю правильно или нет.

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

#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 пакет

CODE
/**
* Заголовок 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: например
CODE

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
возможно ли это?
VladislavS
Цитата(inventor @ Sep 5 2017, 17:36) *
возможно ли это?

Странно, если бы было не возможно. Надеюсь, тип вашего секретного процессора компилятору хоть правильно указали?
inventor
Цитата(VladislavS @ Sep 5 2017, 19:57) *
Странно, если бы было не возможно. Надеюсь, тип вашего секретного процессора компилятору хоть правильно указали?

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

А вообще, компилятор должен сам корректно тип доступа определять, если ему насильно не пытаться указать.
Сергей Борщ
Так, это, #pragma pack(2) на #pragma pack(1) замените. Или, еще лучше, перед объявлением структуры сделайте #pragma pack (push,1), а после объявления - #pragma pack(pop)
inventor
Цитата(Сергей Борщ @ Sep 5 2017, 20:59) *
Так, это, #pragma pack(2) на #pragma pack(1) замените. Или, еще лучше, перед объявлением структуры сделайте #pragma pack (push,1), а после объявления - #pragma pack(pop)

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


Цитата(VladislavS @ Sep 5 2017, 20:53) *
Если вы уверены, что hard fault вызывает именно этот код, то пройдите его пошагово в режиме ассемблера. В десятке ассемблерных команд нетрудно найти причину.

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


да, проходил пошагово
асм не смотрел - обрывается как раз на доступах к структуре
если бы было все правильно-там был бы вызов какой нить функции
типа мemcpy_unaligned
Сергей Борщ
QUOTE (inventor @ Sep 5 2017, 23:39) *
наверное в описании пакета это не обязательно - там все уже упаковано хоть на 2 хоть на 1
Тогда обеспечьте и для p выравнивание на размер наибольшего члена структуры. Если не можете обеспечить выровненный указатель - объявляйте структуру упакованной. Если указатель выровнен - тогда непонятно, чего вы хотите.
Сергей Борщ
QUOTE (inventor @ Sep 5 2017, 23:39) *
если бы было все правильно-там был бы вызов какой нить функции
типа мemcpy_unaligned
Скорее там было бы встроено побайтовое обращение и склейка в длинную переменную. Вызов функции требует больше накладных расходов.
Timmy
Ваша ситуация выглядит очень странной, все структуры IP, ARP, UDP,TCP сделаны таким образом, что любое поле может быть выбрано без нарушения выравнивания, если пакет выравнен по границе 4 байт. Вы бы посмотрели всё-таки в дизассемблер.
inventor
Цитата(Timmy @ Sep 7 2017, 15:04) *
Ваша ситуация выглядит очень странной, все структуры IP, ARP, UDP,TCP сделаны таким образом, что любое поле может быть выбрано без нарушения выравнивания, если пакет выравнен по границе 4 байт. Вы бы посмотрели всё-таки в дизассемблер.

пакеты выровнены по границе 2 байта
добавил #pragma pack(2)
и убрал memcpy - все работает
VladislavS
Цитата(inventor @ Sep 7 2017, 19:50) *
добавил #pragma pack(2)

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

Запомните, правильно заданный вопрос - половина ответа.
inventor
еще один вопрос: ест ли в IAR какая нибудь опция чтобы он работал
совместимо с GCC?
иначе прихордится очень много кода исправлять
или вот такой можно ли библиотеки созданные в GCC
с ними скомпилит в IAR
форматы сильно различаются?
Obam
Больше 20 лет контора компилятор делает (секту свою запилила) и вдруг к другой секте примкнёт?
inventor
Цитата(Obam @ Sep 28 2017, 11:05) *
Больше 20 лет контора компилятор делает (секту свою запилила) и вдруг к другой секте примкнёт?

GCC шная секта?
SSerge
Цитата(inventor @ Sep 27 2017, 22:58) *
еще один вопрос: ест ли в 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 мире, увы, не обойтись, но нужны они далеко не на каждой странице.
scifi
Цитата(SSerge @ Sep 28 2017, 12:51) *
Не вижу никакой проблемы.
Всего-то и нужно, что писать на языке "C", а не "GCC".
Придерживайтесь стандарта С и не используйте расширения языка без особой на то необходимости, для такого процессора как ARM это не составляет никакой сложности.

Никто же не спорит, что лучше быть богатым и здоровым, чем бедным и больным. Но автор первым делом указал, что есть уже существующий код, заточенный под gcc. Вы будете смеяться, но это довольно распространённая ситуация.
Obam
Цитата(inventor @ Sep 28 2017, 12:48) *
GCC шная секта?

Ну кавычки мы с вами забыли (;
"Конкуренты", если вам так больше нравится.
inventor
Цитата(SSerge @ Sep 28 2017, 12:51) *
Не вижу никакой проблемы.
Всего-то и нужно, что писать на языке "C", а не "GCC".
Придерживайтесь стандарта С и не используйте расширения языка без особой на то необходимости, для такого процессора как ARM это не составляет никакой сложности.

Как пример можете посмотреть файлы из CMSIS, в них в .h (но не в .c !) частенько встречается что-то вроде
Код
#if   defined ( __CC_ARM )
...
#elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)
...
#elif defined ( __GNUC__ )
...
#elif defined ( __ICCARM__ )
...
Но это как правило касается нестандартных расширений или просто несоответствия стандарту в разных компиляторах.
Без некоторых из них в embedded мире, увы, не обойтись, но нужны они далеко не на каждой странице.


у меня задача такая - сделать в IAR (которые применяет контора)
то что ранее написано на GCC
но обычно все
эти пейсатели TCP/IP стеков
"надрачивающие"
на свободное программное обеспечение
просто считают что кроме GCC других компиляторов
просто не существует

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