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

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


Начинающий профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648



Цитата(Oleg_IT @ Oct 15 2013, 16:33) *
Самому определять это понятно, а в компиляторе такой информации нет?

Есть. Для GCC есть предопределенные макро, например, для arm-none-eabi-gcc (arm-none-eabi-g++)
Код
#define __ORDER_LITTLE_ENDIAN__ 1234
#define __ORDER_BIG_ENDIAN__ 4321
#define __ORDER_PDP_ENDIAN__ 3412
#define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__
#define __FLOAT_WORD_ORDER__ __ORDER_LITTLE_ENDIAN__



--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post
DmitryM
сообщение Oct 15 2013, 13:36
Сообщение #32


Знающий
****

Группа: Свой
Сообщений: 583
Регистрация: 7-06-06
Из: Таганрог
Пользователь №: 17 840



Цитата(Oleg_IT @ Oct 15 2013, 16:33) *
Самому определять это понятно, а в компиляторе такой информации нет?


Цитата
The common predefined macros are GNU C extensions. They are available with the same meanings regardless of the machine or operating system on which you are using GNU C or GNU Fortran. Their names all start with double underscores

__BYTE_ORDER__
__ORDER_LITTLE_ENDIAN__
__ORDER_BIG_ENDIAN__
__ORDER_PDP_ENDIAN__
__BYTE_ORDER__ is defined to one of the values __ORDER_LITTLE_ENDIAN__, __ORDER_BIG_ENDIAN__, or __ORDER_PDP_ENDIAN__ to reflect the layout of multi-byte and multi-word quantities in memory. If __BYTE_ORDER__ is equal to __ORDER_LITTLE_ENDIAN__ or __ORDER_BIG_ENDIAN__, then multi-byte and multi-word quantities are laid out identically: the byte (word) at the lowest address is the least significant or most significant byte (word) of the quantity, respectively. If __BYTE_ORDER__ is equal to __ORDER_PDP_ENDIAN__, then bytes in 16-bit words are laid out in a little-endian fashion, whereas the 16-bit subwords of a 32-bit quantity are laid out in big-endian fashion.
You should use these macros for testing like this:

/* Test for a little-endian machine */
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__

Common-Predefined-Macros.html


Go to the top of the page
 
+Quote Post
Oleg_IT
сообщение Oct 15 2013, 16:26
Сообщение #33


Знающий
****

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



Спасибо
Go to the top of the page
 
+Quote Post
Oleg_IT
сообщение Oct 16 2013, 11:12
Сообщение #34


Знающий
****

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



Цитата(Oleg_IT @ Oct 15 2013, 12:32) *
Я вас сходу по флажкам не понял. Переделал, работает.

Поторопился я радоватся, что битовый массив, что
Код
#define FLAG_1     1

........................
Flags |= (1 << FLAG_1);

одно и тоже.
Go to the top of the page
 
+Quote Post
Dron_Gus
сообщение Oct 16 2013, 13:57
Сообщение #35


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

Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861



http://www.opennet.ru/man.shtml?topic=hton...3&russian=0
http://repo-genesis3.cbi.utsa.edu/crossref...tinet/in.h.html



--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post
Oleg_IT
сообщение Oct 16 2013, 18:13
Сообщение #36


Знающий
****

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



Цитата(Dron_Gus @ Oct 16 2013, 17:57) *

Интересно. Спасибо за ссылочки.
Go to the top of the page
 
+Quote Post
alx2
сообщение Oct 17 2013, 07:25
Сообщение #37


Местный
***

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



Цитата(Oleg_IT @ Oct 16 2013, 16:12) *
Поторопился я радоватся, что битовый массив,
Что такое "битовый массив"?

Цитата(Oleg_IT @ Oct 16 2013, 16:12) *
что
Код
#define FLAG_1     1

........................
Flags |= (1 << FLAG_1);

одно и тоже.

Что "одно и то же"? Опишите подробнее, что, как Вам кажется, неправильно с приведенным вариантом.
Например, если у Вас в переменной Flags лежат флаги TCP, то приведенный Вами код установит флаг SYN. И этот код (в отличие от битовых полей в объединении) уже не зависит от реализации компилятора...

Сообщение отредактировал alx2 - Oct 17 2013, 07:27


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


Знающий
****

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



Цитата(alx2 @ Oct 17 2013, 11:25) *
Что такое "битовый массив"?

Ошибся, битовое поле.

Цитата(alx2 @ Oct 17 2013, 11:25) *
Что "одно и то же"? Опишите подробнее, что, как Вам кажется, неправильно с приведенным вариантом.
Например, если у Вас в переменной Flags лежат флаги TCP, то приведенный Вами код установит флаг SYN. И этот код (в отличие от битовых полей в объединении) уже не зависит от реализации компилятора...

Если я битовом поле
Код
   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;
    };

бит SYN, первый бит, ставлю в 1, то это будет тоже сомое, что
Код
L1 |= (1 << 1)

Проверено.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Oct 17 2013, 17:42
Сообщение #39


Гуру
******

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



Цитата(Oleg_IT @ Oct 17 2013, 12:18) *
Проверено.


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

Сообщение отредактировал IgorKossak - Oct 17 2013, 18:16
Причина редактирования: избыточное цитирование
Go to the top of the page
 
+Quote Post
Oleg_IT
сообщение Oct 18 2013, 05:20
Сообщение #40


Знающий
****

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



Так ни битовые поля, ни работа с флагами задачу не решают. Функции по ссылке http://www.opennet.ru/man.shtml?topic=hton...3&russian=0 только помогут, они специально для этого сделаны.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Oct 18 2013, 06:34
Сообщение #41


Гуру
******

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



что - то я видать не понимаю.

Я утверждаю что во всех сетях нашей планеты флаг сигнала SYN стоит в одном и том же месте 16 битного поля размера и флагов. Не зависимо от того на каком процессоре и каким компилятором сделана программа. Значит всегда можно сделать константу равную 1 в этом месте, и иметь четко определенный флаг в нужном месте на любой системе.

Что не так то?
Go to the top of the page
 
+Quote Post
Oleg_IT
сообщение Oct 18 2013, 06:56
Сообщение #42


Знающий
****

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



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

Скорей всего мы друг друга недопонимаемsm.gif
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Oct 18 2013, 10:18
Сообщение #43


Гуру
******

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



да.

порядок байт в интернете биг ендиан.
порядок бит как у всех младший бит нулевой.

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

порядок байт из за того что у вас АРМ наверняка Litle endian, и потому он тоже другой. Но сменив процессор на тот в котором Big, такие бывают... у вас опять все навернется от того вам советовали сделать дефайн...
Go to the top of the page
 
+Quote Post
alx2
сообщение Oct 18 2013, 11:40
Сообщение #44


Местный
***

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



Цитата(Oleg_IT @ Oct 18 2013, 10:20) *
Так ни битовые поля, ни работа с флагами задачу не решают.

Вы по-моему не понимаете, что имеете дело с двумя разными проблемами:
1. Проблема порядка байт с ловах (Big/Little endianness). Она решается использованием стандартных функций htonl/ntohl/htons/ntohs.
2. Проблема порядка расплоложения битовых полей в структуре/объединении. Она решается отказом от использования битовых полей в данном случае.
Я говорил исключительно о второй проблеме. И обратил Ваше внимание на то, что код Flags |= TCP_FLAG_SYN; переносим, а код Flags.SYN = 1; - нет, так как порядок следования битовых полей может быть разным в разных компиляторах.
Цитата(Golikov A. @ Oct 18 2013, 15:18) *
порядок байт из за того что у вас АРМ наверняка Litle endian, и потому он тоже другой. Но сменив процессор на тот в котором Big, такие бывают... у вас опять все навернется от того вам советовали сделать дефайн...

Вот поэтому и надо по возможности использовать htnl/nthl для преборазования из формата слов. Если хост little-endian, эти функции будут менять порядок байт в слове. Если хост big-endian - вернут свой аргумент в неизменном виде. Тогда при смене хоста ничего не навернется...

Сообщение отредактировал alx2 - Oct 18 2013, 11:51


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


Знающий
****

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



Кажется начинаю понимать обстановку. Без дефайнов не обойтись. Но всё равно не понятности остались, например в протоколе есть поле размером 13 бит, это байт и ещё немножко. Как в этом случае работает htnl/nthl?
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 - 09:50
Рейтинг@Mail.ru


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