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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Битовые поля - есть ли способ поменять Little Endian на Big Endian, расположение битов
sonycman
сообщение May 30 2009, 22:21
Сообщение #1


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Осваиваю тут карты памяти, и возникла нужда поработать со структурами их регистров.
К примеру:
Код
__packed    struct    CID
{
    byte        man_ID:            8;
    byte        oem_ID[2];
    byte        product_name[5];
    byte        revision:        8;
    dword        serial:            32;
    unsigned    :                4;
    word        man_date:        12;
    unsigned    crc:            7;
    unsigned    dummy:            1;
};

Вроде бы всё хорошо, да только данные в такой структуре должны идти линейно сверху вниз - байт 0 - биты 31...24, байт 1 - биты 23...16 и т.д. (big endian).
А компилятор (RealView) считает наоборот - сначала младшие биты (little endian).

То есть читаем слово revision, в регистре должны быть данные вида 0x08070605 [31...0], а на деле имеем 0x05060708...

Есть ли способ побороть такую досадную "однобокость"?
Иначе придётся ручками обрабатывать все битовые сдвиги и маски... crying.gif
Go to the top of the page
 
+Quote Post
sergeeff
сообщение May 30 2009, 23:59
Сообщение #2


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

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Это определяется используемым компилятором и возможности управления расположением битовых полей, насколько мне известно, нет. Это одна их проблем переносимости программ.
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 31 2009, 06:55
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(sonycman @ May 31 2009, 01:21) *
А компилятор (RealView) считает.....

Он 'считает', причем совершено обосновано, что у контроллера именно такая адресация. Причем, полагаю, Вам не скоро придется встретиться с big endian (они вообще померли, ну кроме одного легендарного и считающегося вечно живым динозавра smile.gif ), ибо для всего, что не является машинным словом получается чистой воды издевательтство ). И уж тем более не встретитесь с компилятором работающим 'наоборот' от архитектуры контроллера. Посему препешите структуру, "как положено", а не так, как кажется "правильным" в данный момент времени глядя с конкретной колоколенки и все.





Цитата(sergeeff @ May 31 2009, 02:59) *
Это одна их проблем переносимости программ.

Практически этой проблемы уже нет.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
sonycman
сообщение May 31 2009, 07:51
Сообщение #4


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



sergeeff
zltigo
Понятно, спасибо.
Так и думал, что "развернуть" компилятор не получится.
Тут нужно или "переворачивать" все поля вручную, по мере приёма от карты, или обрабатывать такую структуру ручками...

ЗЫ: жаль, ведь с битовыми полями компилер работает весьма красиво rolleyes.gif
Go to the top of the page
 
+Quote Post
AirDevil
сообщение May 31 2009, 07:54
Сообщение #5


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

Группа: Участник
Сообщений: 98
Регистрация: 3-03-09
Пользователь №: 45 590



Цитата(sonycman @ May 31 2009, 01:21) *
...
Вроде бы всё хорошо, да только данные в такой структуре должны идти линейно сверху вниз - байт 0 - биты 31...24, байт 1 - биты 23...16 и т.д. (big endian).
А компилятор (RealView) считает наоборот - сначала младшие биты (little endian).

Используйте преобразование типов и всё. Пусть они лежать как лежат.
Go to the top of the page
 
+Quote Post
sonycman
сообщение May 31 2009, 07:57
Сообщение #6


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Цитата(AirDevil @ May 31 2009, 11:54) *
Используйте преобразование типов и всё. Пусть они лежать как лежат.

Что-то не понял. А можно пример?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 31 2009, 08:13
Сообщение #7


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(sonycman @ May 31 2009, 10:57) *
Что-то не понял. А можно пример?
макросы htons(), ntohs()


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 31 2009, 08:18
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(sonycman @ May 31 2009, 10:51) *
Тут нужно или "переворачивать" все поля вручную, по мере приёма от карты, или обрабатывать такую структуру ручками...

Нафига, простите, ПРОСТО опишите стуктуру "правильно" - битовыми полями и байтами уже проблем не будет. Останется разворачивать то, что short и long, там где встречаются. Их через htons/htonl/...... В случае чего и опортируете без особых проблем smile.gif


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
sonycman
сообщение May 31 2009, 08:19
Сообщение #9


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Цитата(Сергей Борщ @ May 31 2009, 12:13) *
макросы htons(), ntohs()


Таких макросов даже нет в комплекте компилятора rolleyes.gif
Они меняют порядок следования битов?
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 31 2009, 08:20
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Сергей Борщ @ May 31 2009, 11:13) *
макросы htons(), ntohs()

К ним, правда, еще нужны такие-же, но по указателям для комплекта.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
sonycman
сообщение May 31 2009, 08:23
Сообщение #11


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Цитата(zltigo @ May 31 2009, 12:18) *
Нафига, простите, ПРОСТО опишите стуктуру "правильно" - битовыми полями и байтами уже проблем не будет. Останется разворачивать то, что short и long, там где встречаются. Их через htons/htonl/...... В случае чего и опортируете без особых проблем smile.gif

А как правильно?
Вот другая структура:
Код
__packed    struct    CSDv1
{
    unsigned    ver:            2;
    unsigned    :                6;
    unsigned    TAAC:            8;
    unsigned    NSAC:            8;
    unsigned    tran_speed:        8;
    unsigned    ccc:            12;
    unsigned    read_bl_len:    4;
    unsigned    read_bl_part:    1;
    unsigned    write_bl_misal:    1;
    unsigned    read_bl_misal:    1;
    unsigned    dsr_imp:        1;
    unsigned    :                2;
    unsigned    c_size:            12;
    unsigned    vdd_r_curr_min:    3;
    unsigned    vdd_r_curr_max:    3;
    unsigned    vdd_w_curr_min:    3;
    unsigned    vdd_w_curr_max:    3;
    unsigned    c_size_mult:    3;
    unsigned    erase_bl_en:    1;
    unsigned    sector_size:    7;
    unsigned    wp_grp_size:    7;
    unsigned    wp_grp_enable:    1;
    unsigned    :                2;
    unsigned    r2w_factor:        3;
    unsigned    write_bl_len:    4;
    unsigned    write_bl_part:    1;
    unsigned    :                5;
    unsigned    file_form_grp:    1;
    unsigned    copy:            1;
    unsigned    perm_wr_prot:    1;
    unsigned    tmp_wr_prot:    1;
    unsigned    file_format:    2;
    unsigned    :                2;
    unsigned    crc:            7;
    unsigned    dummy:            1;
};

Проблемы с полями точно такие-же: 12 битное поле c_size воспринимается наоборот...
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 31 2009, 08:25
Сообщение #12


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(zltigo @ May 31 2009, 09:55) *
(они вообще померли, ну кроме одного легендарного и считающегося вечно живым динозавра smile.gif ),
"Огласите весь список, пожалуйста" (с). В смысле, кто остался. Согласно википедии, большие индейцы (из более-менее популярных) у PowerPC, SPARK. Самсунговские ARMы S3Cxxxx, заточенные на коммуникации, работают в больших индейцах.
Цитата(zltigo @ May 31 2009, 09:55) *
Практически этой проблемы уже нет.
"Как же так? Ж... - есть, а слова - нет?" wink.gif Сетевые протоколы используют больших индейцев, и с этим тяжелым наследием приходится бороться на остальных процессорах.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 31 2009, 08:29
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(sonycman @ May 31 2009, 11:19) *
Таких макросов даже нет в комплекте компилятора rolleyes.gif

Ужас.
Код
#define htons_ptr(p)  *(p) = (*(p) << 8) | (*(p) >> 8))
#define ntohs( sh ) ( (unsigned short)(( (sh)>>8 )|( (sh)<<8 )) )
#define htons( sh )    ntohs( (sh) )


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 31 2009, 08:31
Сообщение #14


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(sonycman @ May 31 2009, 11:19) *
Они меняют порядок следования битов?
Это подколка такая? Ссылку на описание прикрепил ведь. "to and from the network byte order". О порядке битов речь не шла. Порядок битов надо (если надо) менять в точке приема.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
sonycman
сообщение May 31 2009, 08:34
Сообщение #15


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Цитата(zltigo @ May 31 2009, 12:29) *
Ужас.
Код
#define htons_ptr(p)  *(p) = (*(p) << 8) | (*(p) >> 8))
#define ntohs( sh ) ( (unsigned short)(( (sh)>>8 )|( (sh)<<8 )) )
#define htons( sh )    ntohs( (sh) )

Спасибо. laughing.gif

Цитата(Сергей Борщ @ May 31 2009, 12:31) *
Это подколка такая? Ссылку на описание прикрепил ведь. "to and from the network byte order". О порядке битов речь не шла. Порядок битов надо (если надо) менять в точке приема.

Да я там с наскоку не понял ничего. Какие то network и host byte order мне ничего не говорят.
Теперь знаю! Спасибо!
Go to the top of the page
 
+Quote Post

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

 


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


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