|
Nios II /e vs Nios II /f (проект Ethernet) |
|
|
|
Mar 11 2014, 03:55
|
Местный
  
Группа: Свой
Сообщений: 247
Регистрация: 4-10-10
Из: г. Екатеринбург
Пользователь №: 59 925

|
Добрый день всем. На демоплате BeMicro (Cyclone IV E) делаю проект работы с Ethernet (UDP). При использовании проца Nios II /f все нормально работает. Но для этого проца нужна лицензия (которой у меня нет  ). Попробовал перейти в этом же проекте на Nios II /e, при отправке (из платы) пакетов расчитывается кривая CRC для UDP-заголовка. Для самого тела UDP-пакета можно ставить CRC=0, что я и делаю, а вот для заголовка нужна корректная CRC, иначе прога на ПК вообще не принимает пакет. Код расчета CRC: Код unsigned short checksum(void *b, int len) { unsigned short *buf = b, result; unsigned int sum=0; for ( sum = 0; len > 1; len -= 2 ) /* Sum all 16b words */ { // printf("*buf = 0x%x\n", *buf); sum += *buf++; } if ( len == 1 ) /* If any stray bytes, */ sum += *(unsigned char*)buf; /* add to sum */ sum = (sum >> 16) + (sum & 0xFFFF); /* Add the carry */ sum += (sum >> 16); /* (again) */ result = ~sum; /* Take the one's complement */ return result; /* Return 16b value */ } В чем может быть секрет?? Кэшей никаких не использую, поэтому переход на Экономный проц должен вроде пройти без проблем, кроме замедления работы.
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 24)
|
Mar 12 2014, 01:52
|
Местный
  
Группа: Свой
Сообщений: 247
Регистрация: 4-10-10
Из: г. Екатеринбург
Пользователь №: 59 925

|
Цитата считать в плисе ? Вы имеете в виду вынести формирование пакета за пределы НИОСа во внешний модуль ПЛИС, который наберет все нужные данные из НИОСа и сформирует отправной пакет? Это конечно интересно, и не будет зависеть от НИОСа и его типа, НО большая проблема в том, что кристалл забит почти на 90%. Проект компилится несколько часов с несколькими заходами в фиттеровщик. В настройках НИОСа кэш данных отключен, с ним даже Фаст проц чота глючил при формировании пакетов. Могу выложить исходники проекта НИОСа, если будет желание в нем покопаться.
|
|
|
|
|
Mar 12 2014, 03:53
|
Местный
  
Группа: Свой
Сообщений: 247
Регистрация: 4-10-10
Из: г. Екатеринбург
Пользователь №: 59 925

|
Цитата Вычисляйте Ниосом только контрольную сумму для одного и того же массива по каждому из вариантов и сравнивайте между собой. В этом то и загвоздка получилась, работа функции расчета CRC корректная, а вот данные для расчета получились неверные при Эконом. процессоре. Очень затрудняет процесс отладки то, что при использовании Эконом. НИОСа нельзя ставить брейкпойнты, и приходится через printf() все контролировать, а это та еще песня. При выдачи больших объемов вывод ч/з LTAG может зависнуть (несколько раз на такое натыкался) в то время как программа уже ускокала далеко вперед.
|
|
|
|
|
Mar 13 2014, 07:29
|
Местный
  
Группа: Свой
Сообщений: 247
Регистрация: 4-10-10
Из: г. Екатеринбург
Пользователь №: 59 925

|
Вот моя структура пакета в .h-файле Код typedef struct UDP_str { char macDst[6]; char macSrc[6]; char type[2]; char ver_lenIP; char all00; char len_28plus[2]; char id_pack[2]; char fl_4000[2]; char time_l_80; char type_UDP_11; char crc16_IPhead[2]; char ipSrc[4]; char ipDst[4]; char portSrc[2]; char portDst[2]; char lenUDP_8plus[2]; char crc16_UDP[2]; // до этого ... длина равна 42 байта char data[UDP_DATA_MAX_SIZE]; } __attribute__((__packed__)) UDP_str; Вот код в .c-файле Код volatile UDP_str udp_send_s __attribute__ ((aligned (1))); volatile UDP_str udp_take_s __attribute__ ((aligned (1))); После этого я считаю, что обе структуры выровнено по-байтово и без "дырок" между полями. Расчет CRC для IP-заголовка должен начинаться с поля ver_lenIP, и просчитывать 20 байт, а я указал (ошибочно), чтобы начинался расчет с поля all00, т.е. сдвинул на один байт вправо. При этом НИОС/Фаст все нормально расчитывал, а вот НИОС/Эконом выдавал кривую CRC, из-за чего я и обнаружил свой косяк в указании начального адреса расчета CRC. Поэтому и началось обсуждение типов НИОСов и их обращение к памяти.
|
|
|
|
|
Mar 13 2014, 10:14
|
Знающий
   
Группа: Свой
Сообщений: 721
Регистрация: 23-10-08
Из: next to Odessa
Пользователь №: 41 112

|
Цитата(billidean @ Mar 13 2014, 11:29)  Вот моя структура пакета в .h-файле У меня структура UDP-пакетов несколько схожая, но отличается служебными словами PACKED, у них тоже была своя роль... //------------------- UDPFRAME typedef struct udphdr { //8 bytes u_short uh_sport PACKED; /*!< \brief Source port */ u_short uh_dport PACKED; /*!< \brief Destination port */ u_short uh_ulen PACKED; /*!< \brief UDP length */ u_short uh_sum PACKED; /*!< \brief UDP checksum */ } UDPHDR; struct UDPFRAME { ETHERHDR eth_hdr PACKED; //14 bytes IPHDR ip_hdr PACKED; //20 bytes UDPHDR udp_hdr PACKED; // 8 bytes u_char md[1472] PACKED; // + (22..1476) bytes };
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|