|
Как в IAR сделатькак в GCC? |
|
|
|
Sep 5 2017, 14:36
|
Знающий
   
Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748

|
делаю драйвер для русской 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 возможно ли это?
|
|
|
|
|
Sep 5 2017, 16:57
|
Местный
  
Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140

|
Цитата(inventor @ Sep 5 2017, 17:36)  возможно ли это? Странно, если бы было не возможно. Надеюсь, тип вашего секретного процессора компилятору хоть правильно указали?
|
|
|
|
|
Sep 5 2017, 16:59
|
Знающий
   
Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748

|
Цитата(VladislavS @ Sep 5 2017, 19:57)  Странно, если бы было не возможно. Надеюсь, тип вашего секретного процессора компилятору хоть правильно указали? ничего секретного процессор cortex m1 от миландра
|
|
|
|
|
Sep 5 2017, 20:39
|
Знающий
   
Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748

|
Цитата(Сергей Борщ @ 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
|
|
|
|
|
Sep 7 2017, 16:50
|
Знающий
   
Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748

|
Цитата(Timmy @ Sep 7 2017, 15:04)  Ваша ситуация выглядит очень странной, все структуры IP, ARP, UDP,TCP сделаны таким образом, что любое поле может быть выбрано без нарушения выравнивания, если пакет выравнен по границе 4 байт. Вы бы посмотрели всё-таки в дизассемблер. пакеты выровнены по границе 2 байта добавил #pragma pack(2) и убрал memcpy - все работает
|
|
|
|
|
Sep 7 2017, 18:03
|
Местный
  
Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140

|
Цитата(inventor @ Sep 7 2017, 19:50)  добавил #pragma pack(2) Трижды перечитал первое сообщение. Дважды в нем встретил #pragma pack(2). Так не было никакого #pragma pack(2)? Запомните, правильно заданный вопрос - половина ответа.
|
|
|
|
|
Sep 28 2017, 09:51
|
Профессионал
    
Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528

|
Цитата(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 мире, увы, не обойтись, но нужны они далеко не на каждой странице.
--------------------
Russia est omnis divisa in partes octo.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|