Перейти к содержанию
    

про endiannes

Приветствую.

 

Есть недопонимание big/little endian. Предположим я компилирую и линкую код, пусть в результате бинарник выглядит так на хосто-системе:

 

00000000  ea 00 00 12 e5 9f f0 14  e5 9f f0 14 e5 9f f0 14
00000010  e5 9f f0 14 e1 a0 00 00  e5 9f f0 10 e5 9f f0 10
.....

 

Означает ли, что если endiannes соблюдена правильно при компиляции, то именно так, как указано выше, бинариник и будет расположен на целевой система, причем как во флеш, так и в RAM?

 

Буду признателен за пояснения. Спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Означает ли, что если endiannes соблюдена правильно при компиляции, то именно так, как указано выше, бинариник и будет расположен на целевой система, причем как во флеш, так и в RAM?

Означает. Куда он денется-то?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Означает. Куда он денется-то?

спросил это потому, что jtag, которым я прошиваю чип, почему-то переворачивает байтики странным образом; если в образе вот так:

 

ea000012

 

то во флеш вот так:

 

0012ea00

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

спросил это потому, что jtag, которым я прошиваю чип, почему-то переворачивает байтики странным образом; если в образе вот так:

 

ea000012

 

то во флеш вот так:

 

0012ea00

А вы читаете словами или байтами?

для little endian

0xEA 0x00 = 0x00EA

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А вы читаете словами или байтами?

для little endian

0xEA 0x00 = 0x00EA

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

спросил это потому, что jtag, которым я прошиваю чип, почему-то переворачивает байтики странным образом; если в образе вот так:

ea000012

то во флеш вот так:

0012ea00

Ну, почему странным образом? Endian и определяет порядок байтов в многобайтном числе. Если не ошибаюсь, в данном случае - PDP-endian.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Приветствую.

 

Есть недопонимание big/little endian. Предположим я компилирую и линкую код, пусть в результате бинарник выглядит так на хосто-системе:

 

00000000  ea 00 00 12 e5 9f f0 14  e5 9f f0 14 e5 9f f0 14
00000010  e5 9f f0 14 e1 a0 00 00  e5 9f f0 10 e5 9f f0 10
.....

Судя по дампу вашего бинарника - это поток байтов, а он будет выглядеть одинаково и в LSB/MSB порядке.

 

 

Означает ли, что если endiannes соблюдена правильно при компиляции, то именно так, как указано выше, бинариник и будет расположен на целевой система, причем как во флеш, так и в RAM?
Судя по всему FLASH и RAM у вас НЕ байтовые, поэтому как в них будет располагаться ваша прошивка целиком зависит от того, как ваш JTAG прошивальшик будет трактовать исходный файл, если как LSB то получится

 

120000EA 14F09FE5  14F09FE5 14F09FE5

14F09FE5 0000A0E1  10F09FE5 10F09FE5

а если MSB то получится

 

EA000012 E59FF014 E59FF014 E59FF014

 

E59FF014 E1A00000 E59FF010 E59FF010

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Судя по дампу вашего бинарника - это поток байтов, а он будет выглядеть одинаково и в LSB/MSB порядке.

Это бинарник, полученный путем "objcopy -O binary image.elf image.bin"

 

Судя по всему FLASH и RAM у вас НЕ байтовые, поэтому как в них будет располагаться ваша прошивка целиком зависит от того, как ваш JTAG прошивальшик будет трактовать исходный файл, если как LSB то получится

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

 

 

Судя по всему FLASH и RAM у вас НЕ байтовые, поэтому как в них будет располагаться ваша прошивка целиком зависит от того, как ваш JTAG прошивальшик будет трактовать исходный файл

 

гм, интересно получается. Исходный big-endian образ:

 

00000000  ea 00 00 12 e5 9f f0 14  e5 9f f0 14 e5 9f f0 14
00000010  e5 9f f0 14 e1 a0 00 00  e5 9f f0 10 e5 9f f0 10
....

 

Смотрим после прошивания JTAG-ом:

 

00000000  0012EA00 F014E59F F014E59F F014E59F
00000010  F014E59F 0000E1A0 F010E59F F010E59F
.....

 

А теперь считываем содержимое флеша в файл:

00000000  00EA1200 9FE514F0 9FE514F0 9FE514F0
00000010  9FE514F0  A0E10000 .....

 

Я окончательно запутался :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А теперь считываем содержимое флеша в файл:

00000000  00EA1200 9FE514F0 9FE514F0 9FE514F0
00000010  9FE514F0  A0E10000 .....

 

Я окончательно запутался :(

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это бинарник, полученный путем "objcopy -O binary image.elf image.bin"
Objcopy от native платформы или от toolchain'а, которым собирали elf? Могут быть разногласия :)

 

выше по треду я уже пояснял, как в моем случае располагаются байты во флеш и памяти, LSB/MSB там не пахнет.
Вам уже писали, что порядок похож на PDP - 16ти битные слова внутри 32х битного слова - в LSB, байты внутри 16ти битного слова - MSB

 

гм, интересно получается. Исходный big-endian образ:

 

00000000  ea 00 00 12 e5 9f f0 14  e5 9f f0 14 e5 9f f0 14
00000010  e5 9f f0 14 e1 a0 00 00  e5 9f f0 10 e5 9f f0 10
....

 

Смотрим после прошивания JTAG-ом:

 

00000000  0012EA00 F014E59F F014E59F F014E59F
00000010  F014E59F 0000E1A0 F010E59F F010E59F
.....

EA 00 00 12 -> EA00 0012 -> 0012EA00

 

 

 

А теперь считываем содержимое флеша в файл:

00000000  00EA1200 9FE514F0 9FE514F0 9FE514F0
00000010  9FE514F0  A0E10000 .....

Типичная LSB <-> MSB конверсия

 

 

У JTAG прошивальщика нет опций для указания трактовки endianess'а файла?

 

Кстати, он шьет именно бинарник, а не hex? В hex есть опция для упаковки по 16ти битным словам, может получится именно это

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Objcopy от native платформы или от toolchain'а, которым собирали elf? Могут быть разногласия :)

конечно, objcopy от тулчейна.

 

Типичная LSB <-> MSB конверсия

Гм... флеш на таргете 16-битная, т.е. при прошивке данные берутся словами, как я понимаю - это приводит к конверсии в MSB, так? А считывая с флеш на little-endian компьютер, конверсия обратно в LSB?

 

У JTAG прошивальщика нет опций для указания трактовки endianess'а файла?

Кстати, он шьет именно бинарник, а не hex? В hex есть опция для упаковки по 16ти битным словам, может получится именно это

 

Да, в JTAG выставляю порядок байт на таргете, подсовываю именно бинарник. Могут ли быть какие-то особенности сборки GNU-тым тулчейном? Хотя все вроде бы прозрачно - компилятору и линкеру указал сборку и линовку big-endian образа и, собственно все.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гм... флеш на таргете 16-битная, т.е. при прошивке данные берутся словами, как я понимаю - это приводит к конверсии в MSB, так? А считывая с флеш на little-endian компьютер, конверсия обратно в LSB?
Похоже, что FLASH шьется 16ти битными big endian словами. Возможно что где то нестыковка при формировании из них 32х битного слова. Где именно нестыковка непонятно, возможно просто при показе, а FLASH на самом деле прошит правильно :rolleyes:

Могут ли быть какие-то особенности сборки GNU-тым тулчейном?
Могут, но мне они неизвестны :(

 

Хотя все вроде бы прозрачно - компилятору и линкеру указал сборку и линовку big-endian образа и, собственно все.
Могут быть баги и фичи big endian тулчейна на little endian хосте :wacko:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вам уже писали, что порядок похож на PDP - 16ти битные слова внутри 32х битного слова - в LSB, байты внутри 16ти битного слова - MSB

 

Порядок байт в PDP был little endian, т.е. младший байт слова располагался по меньшему адресу, старший - по большему. Говорить же о расположении слов в 32-х разрядном слове нет смысла применительно к PDP, так как эта машина 16-разрядная.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Порядок байт в PDP был little endian, т.е. младший байт слова располагался по меньшему адресу, старший - по большему. Говорить же о расположении слов в 32-х разрядном слове нет смысла применительно к PDP, так как эта машина 16-разрядная.
Пардон, имелся в виду их потомок - VAX (кажется у него было нечто похожее)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...