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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Как в IAR сделатькак в GCC?
inventor
сообщение Sep 5 2017, 14:36
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 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
возможно ли это?
Go to the top of the page
 
+Quote Post
VladislavS
сообщение Sep 5 2017, 16:57
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140



Цитата(inventor @ Sep 5 2017, 17:36) *
возможно ли это?

Странно, если бы было не возможно. Надеюсь, тип вашего секретного процессора компилятору хоть правильно указали?
Go to the top of the page
 
+Quote Post
inventor
сообщение Sep 5 2017, 16:59
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748



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

ничего секретного
процессор cortex m1 от миландра
Go to the top of the page
 
+Quote Post
VladislavS
сообщение Sep 5 2017, 17:53
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140



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

А вообще, компилятор должен сам корректно тип доступа определять, если ему насильно не пытаться указать.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 5 2017, 17:59
Сообщение #5


Гуру
******

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



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


--------------------
На любой вопрос даю любой ответ
"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
inventor
сообщение Sep 5 2017, 20:39
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 5 2017, 23:09
Сообщение #7


Гуру
******

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



QUOTE (inventor @ Sep 5 2017, 23:39) *
наверное в описании пакета это не обязательно - там все уже упаковано хоть на 2 хоть на 1
Тогда обеспечьте и для p выравнивание на размер наибольшего члена структуры. Если не можете обеспечить выровненный указатель - объявляйте структуру упакованной. Если указатель выровнен - тогда непонятно, чего вы хотите.


--------------------
На любой вопрос даю любой ответ
"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
Сергей Борщ
сообщение Sep 6 2017, 06:13
Сообщение #8


Гуру
******

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



QUOTE (inventor @ Sep 5 2017, 23:39) *
если бы было все правильно-там был бы вызов какой нить функции
типа мemcpy_unaligned
Скорее там было бы встроено побайтовое обращение и склейка в длинную переменную. Вызов функции требует больше накладных расходов.


--------------------
На любой вопрос даю любой ответ
"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
Timmy
сообщение Sep 7 2017, 12:04
Сообщение #9


Знающий
****

Группа: Участник
Сообщений: 835
Регистрация: 9-08-08
Из: Санкт-Петербург
Пользователь №: 39 515



Ваша ситуация выглядит очень странной, все структуры IP, ARP, UDP,TCP сделаны таким образом, что любое поле может быть выбрано без нарушения выравнивания, если пакет выравнен по границе 4 байт. Вы бы посмотрели всё-таки в дизассемблер.
Go to the top of the page
 
+Quote Post
inventor
сообщение Sep 7 2017, 16:50
Сообщение #10


Знающий
****

Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748



Цитата(Timmy @ Sep 7 2017, 15:04) *
Ваша ситуация выглядит очень странной, все структуры IP, ARP, UDP,TCP сделаны таким образом, что любое поле может быть выбрано без нарушения выравнивания, если пакет выравнен по границе 4 байт. Вы бы посмотрели всё-таки в дизассемблер.

пакеты выровнены по границе 2 байта
добавил #pragma pack(2)
и убрал memcpy - все работает
Go to the top of the page
 
+Quote Post
VladislavS
сообщение Sep 7 2017, 18:03
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140



Цитата(inventor @ Sep 7 2017, 19:50) *
добавил #pragma pack(2)

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

Запомните, правильно заданный вопрос - половина ответа.
Go to the top of the page
 
+Quote Post
inventor
сообщение Sep 27 2017, 15:58
Сообщение #12


Знающий
****

Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748



еще один вопрос: ест ли в IAR какая нибудь опция чтобы он работал
совместимо с GCC?
иначе прихордится очень много кода исправлять
или вот такой можно ли библиотеки созданные в GCC
с ними скомпилит в IAR
форматы сильно различаются?
Go to the top of the page
 
+Quote Post
Obam
сообщение Sep 28 2017, 08:05
Сообщение #13


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



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


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
inventor
сообщение Sep 28 2017, 08:48
Сообщение #14


Знающий
****

Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748



Цитата(Obam @ Sep 28 2017, 11:05) *
Больше 20 лет контора компилятор делает (секту свою запилила) и вдруг к другой секте примкнёт?

GCC шная секта?
Go to the top of the page
 
+Quote Post
SSerge
сообщение Sep 28 2017, 09:51
Сообщение #15


Профессионал
*****

Группа: Свой
Сообщений: 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.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 22nd June 2025 - 11:02
Рейтинг@Mail.ru


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