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

 
 
> Почему под отладчиком работает а без него не хочет?
prottoss
сообщение Dec 31 2007, 13:52
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Всех с наступающим Новым Годом!



Проблема такова:



С ARM работаю недавно. Имеется код, который нормально работал с AVR и платформенно не зависим. Перенес сей код на ARM - все, затык. Кoд такой:

Код
В хедере:

#define MAKEUINT16(byte_h, byte_l) ((UINT16)(((UINT16)byte_h << 8)|(UINT16)byte_l))
#define HIBYTE(word)    ((UCHAR)((UINT16)word >> 8))
#define LOBYTE(word)    ((UCHAR)((UINT16)word & 0xff))

#define MAKEUINT32(word_h, word_l) ((UINT32)(((UINT32)word_h << 16)|(UINT32)word_l))
#define HIWORD(longv)    ((UINT16)((UINT32)longv >> 16))
#define LOWORD(longv)    ((UINT16)((UINT32)longv & 0xffff))

#define SWAP16(n16)     (MAKEUINT16(LOBYTE(n16), HIBYTE(n16)))
#define SWAP32(n32)     (MAKEUINT32(SWAP16(LOWORD(n32)), SWAP16(HIWORD(n32))))

в модуле:
Код
...
if(hTCP->flags & TCP_FLAG_ACK)
    {
  /* Jup, use it as our seq */
  socket->send_unacked = SWAP32(hTCP->ackno);
  socket->hTCP.flags = TCP_FLAG_RESET;
  socket->receive_next = SWAP32(hTCP->seqno);
}
    else
    {
  socket->send_unacked = 0;
  socket->hTCP.flags = TCP_FLAG_RESET | TCP_FLAG_ACK;
  socket->receive_next = SWAP32(hTCP->seqno) + 1;
}

Если ставлю точку останова на строку с SWAP32 и потом, при попадании программы в эту точку, стартую программу - все нормально, код выполняется. Если точку останова не ставлю - программа виснет:-(
Если строки с SWAP32 удаляю - программа работает нормально...
Переменные send_unacked и receive_next 32-битные.


IAR C/C++ Compiler for ARM 4.42A Evaluation (4.42.1.201)


Помогите разобраться, в чем прикол...


--------------------
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
zltigo
сообщение Jan 1 2008, 13:53
Сообщение #2


Гуру
******

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



1. При всем обилии матрешек, лишних масок и преобразований типов завешивать и не работать там нечему, особенно, если все параметры макросов в скобочки заключить (а делать это всегда обязательно!!!):
Код
#define MAKEUINT16( byte_h, byte_l ) ( ( (UINT16)(byte_h) << 8) | (byte_l) )
#define HIBYTE(word)    ( (UCHAR)((word) >> 8) )
#define LOBYTE(word)    ( (UCHAR)(word) )
#define MAKEUINT32( word_h, word_l ) ( ( (UINT32)(word_h) << 16) | (word_l) )
#define HIWORD(longv)    ( (UINT16)((longv) >> 16) )
#define LOWORD(longv)    ( (UINT16)(longv) )

Ищите ошибку в другом месте.

2. Функции выполняющие вышеописанное "правильно" называются htonl() / ntohl() Network-TO-Host-Long /
Host-TO-Network-Long сответственно и встречаются в большинстве библиотек.

3. Для ARM достаточно приличный код получается:
Код
#define ntohl(x)    htonl(x)
#pragma inline=forced
__arm ulong htonl( ulong n );
__arm ulong htonl( ulong n )
{
ulong tmp;

      tmp = n ^ ( (n << 16) | (n >> 16) );
      tmp &= ~0x00FF0000;
    n = ( n << 24 )|( n >> 8 );
      n ^= ( tmp >> 8 );

  return( n );
}


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jan 1 2008, 16:57
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(zltigo @ Jan 1 2008, 20:53) *
3. Для ARM достаточно приличный код получается:
Код
#define ntohl(x)    htonl(x)
#pragma inline=forced
__arm ulong htonl( ulong n );
__arm ulong htonl( ulong n )
{
ulong tmp;

      tmp = n ^ ( (n << 16) | (n >> 16) );
      tmp &= ~0x00FF0000;
    n = ( n << 24 )|( n >> 8 );
      n ^= ( tmp >> 8 );

  return( n );
}


Если смотреть с точки зрения меньших затрат на понятие кода smile.gif проще вот так

Код
UINT32 swap32(UINT32 n32)
{
   UINT8 *dest = (UINT8 *)&n32;
UINT8 src[sizeof(UINT32)/sizeof(UINT8)];
  
src[0] = dest[3];
src[1] = dest[2];
src[2] = dest[1];
src[3] = dest[0];

return (*(UINT32 *)&src);
}


...но подставив ЭТО вместо SWAP32 имею ту же проблему....

в Ассемблерном виде выгдядит вот так:

Код
\                                 In segment CODE, align 4, keep-with-next
     18          UINT32 swap32(UINT32 n32)
     19          {
   \                     swap32:
   \   00000000   01B4               PUSH     {R0}
   \   00000002   81B0               SUB      SP,SP,#+4
     20             UINT8 *dest = (UINT8 *)&n32;
   \   00000004   01A8               ADD      R0,SP,#+4
   \   00000006   0100               MOVS     R1,R0
     21           UINT8 src[sizeof(UINT32)/sizeof(UINT8)];
     22            
     23           src[0] = dest[3];
   \   00000008   6846               MOV      R0,SP
   \   0000000A   CA78               LDRB     R2,[R1, #+3]
   \   0000000C   0270               STRB     R2,[R0, #+0]
     24           src[1] = dest[2];
   \   0000000E   6846               MOV      R0,SP
   \   00000010   8A78               LDRB     R2,[R1, #+2]
   \   00000012   4270               STRB     R2,[R0, #+1]
     25           src[2] = dest[1];
   \   00000014   6846               MOV      R0,SP
   \   00000016   4A78               LDRB     R2,[R1, #+1]
   \   00000018   8270               STRB     R2,[R0, #+2]
     26           src[3] = dest[0];
   \   0000001A   6846               MOV      R0,SP
   \   0000001C   0A78               LDRB     R2,[R1, #+0]
   \   0000001E   C270               STRB     R2,[R0, #+3]
     27          
     28           return (*(UINT32 *)&src);
   \   00000020   6846               MOV      R0,SP
   \   00000022   0068               LDR      R0,[R0, #+0]
   \   00000024   02B0               ADD      SP,SP,#+8
   \   00000026   7047               BX       LR              ;; return


Забыл добавить smile.gif Код пишется под ucOS-II. Самое интересное, что остальные задачи не зависают, только TCPIP, имеющая вышеприведенный код



Цитата(zltigo @ Jan 1 2008, 20:53) *
2. Функции выполняющие вышеописанное "правильно" называются htonl() / ntohl() Network-TO-Host-Long /
Host-TO-Network-Long сответственно и встречаются в большинстве библиотек.
А что, мои функции выполняют ЭТО не правильно???


--------------------
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- prottoss   Почему под отладчиком работает а без него не хочет?   Dec 31 2007, 13:52
- - prottoss   Такое очучение, что что-то с 32-бит переменными не...   Jan 1 2008, 11:47
|- - zltigo   Цитата(prottoss @ Jan 1 2008, 18:57) Если...   Jan 1 2008, 17:18
|- - prottoss   Цитата(zltigo @ Jan 2 2008, 00:18) ОК,...   Jan 1 2008, 18:06
|- - zltigo   Цитата(prottoss @ Jan 1 2008, 20:06) ... ...   Jan 1 2008, 18:25
|- - prottoss   Цитата(zltigo @ Jan 2 2008, 01:25) При по...   Jan 1 2008, 18:59
|- - zltigo   Цитата(prottoss @ Jan 1 2008, 20:59) И ин...   Jan 1 2008, 19:22
|- - prottoss   Цитата(zltigo @ Jan 2 2008, 02:22) Наскол...   Jan 1 2008, 19:58
||- - zltigo   Цитата(prottoss @ Jan 1 2008, 21:58) наде...   Jan 1 2008, 20:21
|- - Сергей Борщ   Цитата(zltigo @ Jan 1 2008, 21:22) Это IA...   Jan 2 2008, 12:05
|- - prottoss   Цитата(Сергей Борщ @ Jan 2 2008, 19:05) Н...   Jan 2 2008, 12:17
|- - zltigo   Цитата(Сергей Борщ @ Jan 2 2008, 14:05) Н...   Jan 2 2008, 12:54
|- - Сергей Борщ   Цитата(zltigo @ Jan 2 2008, 14:54) Может ...   Jan 2 2008, 13:49
|- - zltigo   Цитата(Сергей Борщ @ Jan 2 2008, 15:49) Н...   Jan 2 2008, 14:30
- - Rst7   А давайте посмотрим на это дело с другой стороны. ...   Jan 2 2008, 20:53
|- - prottoss   Цитата(Rst7 @ Jan 3 2008, 03:53) А давайт...   Jan 3 2008, 09:46
- - Rst7   А покажите код, как и куда Вы вытаскиваете этот за...   Jan 4 2008, 07:57
|- - prottoss   Цитата(Rst7 @ Jan 4 2008, 14:57) А покажи...   Jan 4 2008, 11:30
- - Rst7   Цитатаобрабатываю прям в блоке буфера DMA EMAC Т...   Jan 4 2008, 16:41
|- - prottoss   Цитата(Rst7 @ Jan 4 2008, 23:41) Так в эт...   Jan 4 2008, 16:56
- - Rst7   ЦитатаТаким образом все блоки выровнены с алигном ...   Jan 4 2008, 20:35
- - prottoss   Опять наступаю на те жн грабли, и опять мне не пон...   Jan 12 2008, 22:18


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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 11:32
Рейтинг@Mail.ru


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