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

 
 
> swapb, переставить байты...
evgen2
сообщение Oct 19 2009, 13:48
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 236
Регистрация: 1-04-06
Пользователь №: 15 688



В примерах имеем такую конструкцию
(\Keil\ARM\Boards\Keil\MCB1700\EasyWEB\tcpip.h)
// macros
#define SWAPB(Word) ((unsigned short)((Word) << 8) | ((Word) >> 8))
// convert little <-> big endian

Какая-то она некузявая. И доставляет много, много радости, ежели Word - short int

В доке есть __swp:
This intrinsic inserts a SWP{size} instruction into the instruction stream generated by the compiler. It enables you to swap data between memory locations from your C or C++ code.

Note
The use of SWP and SWPB is deprecated in ARMv6 and above.

deprecated - надо понимать так, что устарело....

Так вот - вопрос - как делать это по быстрому и кошерно ?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
zltigo
сообщение Oct 19 2009, 15:09
Сообщение #2


Гуру
******

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



Цитата(evgen2 @ Oct 19 2009, 16:48) *
Так вот - вопрос - как делать это по быстрому и кошерно ?

Код
     20          __arm ulong htonl( ulong n )
     21          {
     22          ulong tmp;
     23          
     24                tmp = n ^ ( (n << 16) | (n >> 16) );
     25                tmp &= ~0x00FF0000;
     26               n = ( n << 24 )|( n >> 8 );
     27                n ^= ( tmp >> 8 );
     28          
     29              return( n );
   \                     htonl:
   \   00000000   601820E0           EOR      R1,R0,R0, ROR #+16
   \   00000004   FF18C1E3           BIC      R1,R1,#0xFF0000
   \   00000008   2114A0E1           LSR      R1,R1,#+8
   \   0000000C   600421E0           EOR      R0,R1,R0, ROR #+8
   \   00000010   0EF0A0E1           MOV      PC,LR          ;; return
     30          }

16bit - и того проще.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
evgen2
сообщение Oct 20 2009, 08:52
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 236
Регистрация: 1-04-06
Пользователь №: 15 688



Цитата(zltigo @ Oct 19 2009, 19:09) *
16bit - и того проще.

Т.е. как Keil в дефайне нарисовал - так и кузяво ? А некузявость только кажущаяся - главное не нахомутать с signed...

ЗЫ: редиски, перенесли в помощь начинающему. crying.gif

ЗЫЗЫ: а вот есть еще __packed. Толи он недавно появлся, толи не для всех процессоров, толи мне сильно везло...В факе и форумах оно если и упоминается, то вроде бы в основном в традиционном смысле pragma packed()

Вот такой кусок кода может вести себя весьма нетрадиционным способом:
Код
char *MsgOut1, *MsgIn1;
.....
MsgOut1[0] = MsgIn1[0];
MsgOut1[1] = MsgIn1[1];
MsgOut1[2] = MsgIn1[2];
MsgOut1[3] = MsgIn1[3];


Сообщение отредактировал evgen2 - Oct 20 2009, 09:04
Go to the top of the page
 
+Quote Post
zltigo
сообщение Oct 20 2009, 09:10
Сообщение #4


Гуру
******

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



Цитата(evgen2 @ Oct 20 2009, 11:52) *
Т.е. как Keil в дефайне нарисовал - так и кузяво ?

Зависит от контекста sad.gif. Если в отдельной функции (которую можно инлайнить), то есть нюансы по укладыванию в 3 команды. Можете потренироваться в понимании компилятора и ASM:)
Цитата
главное не нахомутать с signed...

Что-то у Вас паронаидальные мысли какие-то.... Не демонизируйте signed - не при делах он.
Цитата
ЗЫ: редиски, перенесли в помощь начинающему. crying.gif

На большее не тянет sad.gif


Цитата(evgen2 @ Oct 20 2009, 11:52) *
а вот есть еще __packed....

К чему это?
Цитата
Вот такой кусок кода может вести себя весьма нетрадиционным способом:
Код
char *MsgOut1, *MsgIn1;
.....
MsgOut1[0] = MsgIn1[0];
MsgOut1[1] = MsgIn1[1];
MsgOut1[2] = MsgIn1[2];
MsgOut1[3] = MsgIn1[3];

1. Не может
2. Дуболомный код sad.gif.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post



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

 


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


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