делаю драйвер для русской 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
возможно ли это?