Байт поръчка (endianness), DSP, програмиране

Забележка: ARM процесор може да бъде всеки архитектура голям къс, или малко по-къс, в зависимост от вида на чип, но най-често това е голям къс. PowerPC архитектура може да бъде конфигуриран да работи и в двата големи режим къс, или малко по-къс, но Linux се използва само голям къс.

[Защо трябва да се тревожи за endianness]

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

Например, ако не може да се предскаже предварително типа на системата, в някакъв момент в края на мрежова връзка, мрежови протоколи трябва да бъдат използвани, за да се определи предварително реда на байтове, използвани за съхранение на многобайтови ценности в пакетните глави. В този случай, по реда байт се нарича реда мрежа байт (мрежа байт ред), и TCP / IP, той ще бъде голям къс. По този начин, системата конвертира пакети с произход от местната байт, за съхранение на данни в мрежата. След това, получаващата система преобразува данните от мрежата на байт на местен. На практика, когато има строги изисквания за скорост и е известно, че на местния ред байт е същото като мрежа, работата на преобразуване се изхвърля, за да се оптимизира.

Друг добър пример - USB протокол. в която байт заповедта за многобайтовите количества малко къс.

[Как да се определи по програмен endianness]

Можете да напишете проста програма, която ще определи реда на байтове в системата се използва.

Линии 1..4 определят променлива Foo, които могат да бъдат достъпни нито по отношение на броя на тип Int (тип Int почти винаги се състои от няколко байта), или като масив от знаци знаци. На линия 6, променливата се инициализира с стойност цяло число от 1, така че най-малко един байт в броя на многобайтов ще бъде равно на 1 (най-маловажния байт), и всички други значими байт ще бъде нули. Ако байт 0-малко значима масив, той ще бъде равен на 1, което означава, че малко по-къс система. Ако байт 0 най-значителен масив от байтове, той ще бъде нула, а това означава, че голяма система къс.

Ядрото определя различни видове променливи и макроси за обработка на ценностите, които зависят от порядъка байт, който се различава от сегашната система, използвана от процесора.

Следните идентификатори съответстват на U16 тип. u32 и u64. освен когато те са определени с малко (побитовото) атрибут, който се използва, за да се ограничи използването им като цели числа. Побитова-атрибут полезност използва рядко, за да се гарантира, че променливата се превръща в местен тип процесор преди извършване на друга върху променлива (несигурни, опасни) операция.

Следните видове могат да бъдат използвани за къс зависими променливи, след свързване Linux / kernel.h глава-файл.

[Макроси за трансформации]

Има множество макроси за преобразуване на поръчката за байт се използва от текущата процесор, за всеки голям или малък къс. Освен това, за всеки тип реализация да има отделни макроси за 16-, 32- и 64-битови стойности. имената на макросите кодират стойността на източника и целта байт ред, така че името веднага ясно какво всеки макро прави.

За да напишете преносим код, винаги трябва да се използват тези макроси да конвертирате от един целеви байт поръчка на друг, дори и да знае предварително, че не се изисква за процесора, който се използва в момента. Ако поръчката за изходен и целеви байт е един и същ, макро няма да изпълнява никакви действия, така че използването на макроси няма да се отрази на работата.

Следващите макроси връщат стойност, след като реализация. Забележете, че заглавната Linux / kernel.h файлът е заглавието, което трябва да бъде свързан към файлове с код източника, когато се използват макроси, но това не е файла с удар с глава, където макроси всъщност са определени.

Следващите макроси са същите като предишните, като единствената разлика е, че параметър макро - указател към преобразуваните стойности. Моля, имайте предвид, че имената на тези макроси са едни и същи, но добавя суфикса "р" (от показалеца дума) в края на всяко име.

Следващите макроси са правят същото като предишните, но тук мястото на първоначалната стойност и преобразуваната стойност на един и същ. Моля, имайте предвид, че имената на тези макроси са едни и същи, но добавят наставката "S" (от латинската фраза на място, което означава, на същото място) в края на всяко име.

Следващите макроси предоставят псевдоними за Имер, които обикновено се използват за преобразуване на реда байт в кода на мрежови приложения. Първите две се използват за конвертиране на макрос от местна мрежова поръчка байт. Другите две осигури обратна трансформация. Буквите "S" и "L" в края на имена в този случай означава кратко (16-битова стойност) и дългосрочен (32-битова стойност) на.

Както беше отбелязано по-рано, по реда байт мрежа винаги е голям къс, а изпълнението на тези макроси гарантира правилното използване на байт ред на мрежа домакин.

1. Байт сайт Поръчка: bruceblinn.com.