Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: swapb
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
evgen2
В примерах имеем такую конструкцию
(\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 - надо понимать так, что устарело....

Так вот - вопрос - как делать это по быстрому и кошерно ?
zltigo
Цитата(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 - и того проще.
evgen2
Цитата(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];
zltigo
Цитата(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.
evgen2
Цитата(zltigo @ Oct 20 2009, 13:10) *
1. Не может

Я тоже так думал.
Там еще было вот такое:
Код
char *pData;

  MsgIn1 = (unsigned char *) pData+1;
  MsgOut1 = &SendDataBuffer[1];


В итоге один из указателей был четный, а другой нечетный. т.е. невыравненный.

Цитата(zltigo @ Oct 20 2009, 13:10) *
2. Дуболомный код sad.gif.

этим и хорош. Далее идет долгий и нудный разбор принятого сообщения и конструирование ответа.
Только про то, что +1 - это плохо не надо мне рассказывать. На самом деле я тут делаю на lpc2378 эмулятор работы связки двух процессоров (атмега+lpc2148, первый из которых ловит сообщение сверху и оправляет дальше без первого байта, а потом добавляет к ответу один байт)
zltigo
Цитата(evgen2 @ Oct 20 2009, 13:02) *
этим и хорош.

Дуболомство хорошим не бывает. По поводу указателей - тут ветка есть соседняя.
evgen2
Цитата(zltigo @ Oct 20 2009, 14:12) *
Дуболомство хорошим не бывает. По поводу указателей - тут ветка есть соседняя.

бывает, бывает.
Когда нужна максимальная читабельность кода, а на эффективность наплевать,
и/или
когда нужна максимальная портабельность ака "безобразно, но единообразно".
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.