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

 
 
4 страниц V  < 1 2 3 4 >  
Reply to this topicStart new topic
> Нет прерываний от модуля Ethernet.
сарматъ
сообщение Oct 11 2013, 09:18
Сообщение #16


Частый гость
**

Группа: Участник
Сообщений: 153
Регистрация: 19-11-12
Пользователь №: 74 463



понял спасибо
Go to the top of the page
 
+Quote Post
Oleg_IT
сообщение Oct 11 2013, 09:25
Сообщение #17


Знающий
****

Группа: Свой
Сообщений: 922
Регистрация: 3-06-05
Из: Москва
Пользователь №: 5 709



Потому и нужны какие-то дефайны, по которым определяется нужно делать swap или нет.
Тут ещё сложность не только в порядке байт, но и в порядке бит в битовых полях.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Oct 11 2013, 09:58
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Цитата(Oleg_IT @ Oct 11 2013, 13:25) *
Потому и нужны какие-то дефайны, по которым определяется нужно делать swap или нет.
Тут ещё сложность не только в порядке байт, но и в порядке бит в битовых полях.


нет... Big и Litlle меняет только порядок байт. Битовые поля не могу разворачиваться. Возможно среда ставить какой то дефайн при выборе байт ордера, только вопрос, а вам то оно зачем? Вы пишите универсальный модуль или просто все время забываете какой порядок вы используетеsm.gif?

Если модуль универсальный - то сделайте свой дефайн, в случае которого вы переводите все в Big, а по умолчанию делайте в Little как более популярном...

П.С. повернутый порядок бит - это очень странно, у вас нет никаких рукописных UART на пути следования данных, потому что только они имеют тенденцию биты поворачивать. Если нет, остается проверить стандарты езернет, нет ли какого флажка в заголовках по этому поводу, но очень маловероятно, так как даже этот флажок фиг найдешь если он все время в разных местах... Вообщем про поворот порядка бит я озадачен...
Go to the top of the page
 
+Quote Post
Oleg_IT
сообщение Oct 11 2013, 10:29
Сообщение #19


Знающий
****

Группа: Свой
Сообщений: 922
Регистрация: 3-06-05
Из: Москва
Пользователь №: 5 709



Цитата(Golikov A. @ Oct 11 2013, 13:58) *
нет... Big и Litlle меняет только порядок байт. Битовые поля не могу разворачиваться. Возможно среда ставить какой то дефайн при выборе байт ордера, только вопрос, а вам то оно зачем? Вы пишите универсальный модуль или просто все время забываете какой порядок вы используетеsm.gif?

Если модуль универсальный - то сделайте свой дефайн, в случае которого вы переводите все в Big, а по умолчанию делайте в Little как более популярном...

П.С. повернутый порядок бит - это очень странно, у вас нет никаких рукописных UART на пути следования данных, потому что только они имеют тенденцию биты поворачивать. Если нет, остается проверить стандарты езернет, нет ли какого флажка в заголовках по этому поводу, но очень маловероятно, так как даже этот флажок фиг найдешь если он все время в разных местах... Вообщем про поворот порядка бит я озадачен...

Я теже озадачен, но по факту так
Код
typedef struct TCP_Head_tag {
    uint16_t SRC_Port;         // Порт отправителя
    uint16_t DST_Port;         // Порт получателя
    uint32_t SeqNum;           // Sequence Number
    uint32_t AckNum;           // Acknowledgment Number
    union {
        struct {
            uint16_t FIN        : 1;    // No more data from sender
            uint16_t SYN        : 1;    // Synchronize sequence numbers
            uint16_t RST        : 1;    // Reset the connection
            uint16_t PSH        : 1;    // Push Function
            uint16_t ACK        : 1;    // Acknowledgment field significant
            uint16_t URG        : 1;    // Urgent Pointer field significant
            uint16_t Res1       : 6;    //: 4;    // Reserved - 0
            uint16_t DOff       : 4;    // Data Offset - 5
        };
        uint16_t L1;
    };
/*
    union {
        struct {
            uint16_t DOff       : 4;    // Data Offset - 5
            uint16_t Res1       : 6;    //: 4;    // Reserved - 0
            uint16_t URG        : 1;    // Urgent Pointer field significant
            uint16_t ACK        : 1;    // Acknowledgment field significant
            uint16_t PSH        : 1;    // Push Function
            uint16_t RST        : 1;    // Reset the connection
            uint16_t SYN        : 1;    // Synchronize sequence numbers
            uint16_t FIN        : 1;    // No more data from sender
        };
        uint16_t L1;
    };
*/
    uint16_t Window;              // Window - -
    uint16_t Checksum;            // Checksum
    uint16_t UrgPoint;            // Urgent Pointer
} TCP_Head;

Закомментированное по стандарту, а рабочее, что бы на стороне PC все правильно воспринималось, не закомментированное. И ещё swap на L1 нужен. Может я в чём-то ошибаюсь. Поправьте.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Oct 11 2013, 10:53
Сообщение #20


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



меня немного беспокоит слово заголовка в котором лежат флаги.

после 32 бит AckNum
должно идти 16 битное слово, в старших битах которого длина заголовка, а в младших биты - флаги. У вас наоборот. Может потому вам и надо инвертировать. То есть это просто совпадение. инвертированная длина попала в флаги, а инвертированные флаги в длину?

Опять же длина, L1 я так понимаю, не 16 бит.
6 бит флаги
6 бит пустое поле
остается 4 бита длинна вроде как...
Go to the top of the page
 
+Quote Post
Oleg_IT
сообщение Oct 11 2013, 11:11
Сообщение #21


Знающий
****

Группа: Свой
Сообщений: 922
Регистрация: 3-06-05
Из: Москва
Пользователь №: 5 709



По количеству бит там всё правильно 4 длина+6 пусто+6*1 флаги, итого 16.
А вот по порядку, правильно, по стандарту, закомментированный union ниже, а не правильный порядок оказывается правильным по факту. Я такие чудеса не понимаю, но в WireShark всё правильно отображается. Если swap на правильный по стандарту union сделать WireShark выдаёт ошибку.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Oct 11 2013, 11:42
Сообщение #22


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



union {
struct {
uint16_t FIN : 1; // No more data from sender
uint16_t SYN : 1; // Synchronize sequence numbers
uint16_t RST : 1; // Reset the connection
uint16_t PSH : 1; // Push Function
uint16_t ACK : 1; // Acknowledgment field significant
uint16_t URG : 1; // Urgent Pointer field significant
uint16_t Res1 : 6; //: 4; // Reserved - 0
uint16_t DOff : 4; // Data Offset - 5
};
uint16_t L1;
};


Л1 - 16 бит это че? Сразу после флагов же окно идет uint16_t Window;
а у вас оно идет через какие то 16 бит Л1. Плюс еще вопрос как структура с 1 битными полями в памяти раскладывается... Выравнивание может сыграть злую шутку...
Go to the top of the page
 
+Quote Post
alx2
сообщение Oct 12 2013, 11:05
Сообщение #23


Местный
***

Группа: Участник
Сообщений: 340
Регистрация: 25-10-05
Из: Пермь, Россия
Пользователь №: 10 091



Цитата(Oleg_IT @ Oct 11 2013, 15:29) *
Закомментированное по стандарту, а рабочее, что бы на стороне PC все правильно воспринималось, не закомментированное.

Расположение битовых полей в объединении определяется реализацией компилятора. Вы уверены, что ваш компилятор располагает битовые поля именно в порядке от старшего бита к младшему (как у Вас в закомментаренном фрагменте), а не наоборот (как в раскомментаренном)?

И, надеюсь, Вы понимаете, что из-за того что Вы закладываетесь на определенную реализацию компилятора, Ваш код становится непереносимым?


--------------------
Всего наилучшего,
Alex Mogilnikov
Go to the top of the page
 
+Quote Post
Oleg_IT
сообщение Oct 14 2013, 05:58
Сообщение #24


Знающий
****

Группа: Свой
Сообщений: 922
Регистрация: 3-06-05
Из: Москва
Пользователь №: 5 709



Цитата(alx2 @ Oct 12 2013, 15:05) *
Расположение битовых полей в объединении определяется реализацией компилятора. Вы уверены, что ваш компилятор располагает битовые поля именно в порядке от старшего бита к младшему (как у Вас в закомментаренном фрагменте), а не наоборот (как в раскомментаренном)?

И, надеюсь, Вы понимаете, что из-за того что Вы закладываетесь на определенную реализацию компилятора, Ваш код становится непереносимым?

Догадываюсь, потому и хочу разграничить версии соответствующими дефайнами.

Цитата(Golikov A. @ Oct 11 2013, 15:42) *
union {
struct {
uint16_t FIN : 1; // No more data from sender
uint16_t SYN : 1; // Synchronize sequence numbers
uint16_t RST : 1; // Reset the connection
uint16_t PSH : 1; // Push Function
uint16_t ACK : 1; // Acknowledgment field significant
uint16_t URG : 1; // Urgent Pointer field significant
uint16_t Res1 : 6; //: 4; // Reserved - 0
uint16_t DOff : 4; // Data Offset - 5
};
uint16_t L1;
};


Л1 - 16 бит это че? Сразу после флагов же окно идет uint16_t Window;
а у вас оно идет через какие то 16 бит Л1. Плюс еще вопрос как структура с 1 битными полями в памяти раскладывается... Выравнивание может сыграть злую шутку...

Так это же юнион, struct и L1 это два инени оного и того же куска пямяти размером два байта.
А про выравнивание я не сказал, пользуюсь
Код
#pragma push
#pragma pack(1)
……………………
#pragma pop
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Oct 14 2013, 18:43
Сообщение #25


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



ИМХО лучше сделать поле 16 бит,
и дефайны с флагами, чем структуру...

Цитата(Oleg_IT @ Oct 14 2013, 09:58) *
Так это же юнион, struct и L1 это два инени оного и того же куска пямяти размером два байта.


да,... это я чего то объединение не разглядел....
Go to the top of the page
 
+Quote Post
Oleg_IT
сообщение Oct 15 2013, 04:41
Сообщение #26


Знающий
****

Группа: Свой
Сообщений: 922
Регистрация: 3-06-05
Из: Москва
Пользователь №: 5 709



Цитата(Golikov A. @ Oct 14 2013, 22:43) *
ИМХО лучше сделать поле 16 бит,
и дефайны с флагами, чем структуру...

Так порядок бит, задаваемый этими дефайнами всё равно как-то учитывать нужно.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Oct 15 2013, 06:24
Сообщение #27


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



да тут вроде как мы все ходим вокруг одного и того же.
порядок бит НЕ МЕНЯЕТСЯ, иначе во всем мире во всем интернете что на езернете построен был бы полный АД!

у вас все изменилось из-за представлений вашего компилятора о том как надо раскладывать битовые поля, потому и рекомендую избавится от зависимости компилятора, и не использовать потенциально опасные конструкции в виде битовых полей.
Go to the top of the page
 
+Quote Post
Oleg_IT
сообщение Oct 15 2013, 08:32
Сообщение #28


Знающий
****

Группа: Свой
Сообщений: 922
Регистрация: 3-06-05
Из: Москва
Пользователь №: 5 709



Я вас сходу по флажкам не понял. Переделал, работает.
Но вопрос нужен swap или нет остался. Может я опять простого решения не вижуsm.gif
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Oct 15 2013, 11:16
Сообщение #29


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



во всех системах Big Enadian не нужен
во всех системах Litle Endian нужен.

потому делаете дефайн


Код
#define LITTLE_ENDIAN_MODE 1


и везде в вашем коде пишете
Код
#ifdef LITTLE_ENDIAN_MODE
  swap
#elseif
  not_swap
#endif


определять этот дефайн или нет оставляете тому кто пользуется написанным вами софтом, так как только этот человек знает какой у него режим работы...


причем этот дефайн можно тянуть не по всему тексту а сделать функцию swap_if_need, и в ней дефайн проверить, и сваповать если надо.
Go to the top of the page
 
+Quote Post
Oleg_IT
сообщение Oct 15 2013, 12:33
Сообщение #30


Знающий
****

Группа: Свой
Сообщений: 922
Регистрация: 3-06-05
Из: Москва
Пользователь №: 5 709



Самому определять это понятно, а в компиляторе такой информации нет?
Go to the top of the page
 
+Quote Post

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

 


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


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