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

 
 
> Nios II 7.2 IDE, Структуры в С/С++ и их объединения. Вопросы
Волощенко
сообщение Nov 4 2008, 12:44
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 347
Регистрация: 16-02-06
Из: г.Николаев, Украина
Пользователь №: 14 377



Всем привет.
Есть вопрос к структуре, которая сама объединяет другие структуры. А точнее, к выравниванию полей между структурами, при таком объединении.
Вот, например, две структуры, Ethernet-заголовок и ARP-заголовок:
typedef struct ether_header { //14 bytes
u_char ether_dhost[6];
u_char ether_shost[6];
u_short ether_type;
} ETHERHDR;


typedef struct ether_arp { //28 bytes
u_short arp_hrd;
u_short arp_pro;
u_char arp_hln;
u_char arp_pln;
u_short arp_op;
u_char arp_sha[6];
u_long arp_spa;
u_char arp_tha[6];
u_long arp_tpa;
} ETHERARP;


Эти структуры объединяются в структуре, условно названной sss:

struct ARPFRAME {
ETHERHDR eth_hdr;
ETHERARP eth_arp;
}sss;


Я ожидаю, что поля в sss идут без вставок, но на границе между eth_hdr и eth_arp появилась ненужная вставка из 2-х байт. Это видно, если прогнать следующий короткий тест:

ps= (u_char*) &sss; printf("ffm=%04x\n", ps-pd); pd=ps;
ps= (u_char*) &sss.eth_hdr.ether_dhost; printf("ether_dhost=%04x\n", ps-pd);
ps= (u_char*) &sss.eth_hdr.ether_shost; printf("ether_shost=%04x\n", ps-pd);
ps= (u_char*) &sss.eth_hdr.ether_type; printf("ether_type =%04x\n", ps-pd);

ps= (u_char*) &sss.eth_arp.arp_hrd; printf("arp_hrd =%04x\n", ps-pd);
ps= (u_char*) &sss.eth_arp.arp_pro; printf("arp_pro =%04x\n", ps-pd);
ps= (u_char*) &sss.eth_arp.arp_hln; printf("arp_hln =%04x\n", ps-pd);
ps= (u_char*) &sss.eth_arp.arp_pln; printf("arp_pln =%04x\n", ps-pd);
ps= (u_char*) &sss.eth_arp.arp_op; printf("arp_op =%04x\n", ps-pd);
ps= (u_char*) &sss.eth_arp.arp_sha; printf("arp_sha =%04x\n", ps-pd);
ps= (u_char*) &sss.eth_arp.arp_spa; printf("arp_spa =%04x\n", ps-pd);
ps= (u_char*) &sss.eth_arp.arp_tha; printf("arp_tha =%04x\n", ps-pd);
ps= (u_char*) &sss.eth_arp.arp_tpa; printf("arp_pln =%04x\n", ps-pd);

В результате на консоль выводится:
ffm=05cc
ether_dhost=0000
ether_shost=0006
ether_type =000c
arp_hrd =0010

arp_pro =0012
arp_hln =0014
arp_pln =0015
arp_op =0016
arp_sha =0018
arp_spa =0020
arp_tha =0024
arp_pln =002c

Где явно видно, что на стыке между полями ether_type и arp_hrd четыре байта, а должно быть два, т.к. u_short ether_type имеет 2 байта.

Теперь вопрос: Как от этого избавиться, наверное, нужны дополнительные опции? Где их ставить?
В общем пока ступор

Если кто-то интересуется, то в атаче коды с подобными структурами и функциями для Ethernet-приложений для NiosII под LAN91C111 из далекой Германии, а точнее из Ethernut_de.
Прикрепленные файлы
Прикрепленный файл  apploadbin.zip ( 92.65 килобайт ) Кол-во скачиваний: 22
 
Go to the top of the page
 
+Quote Post



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

 


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


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