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

 
 
> Почему под отладчиком работает а без него не хочет?
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
Ответов
Rst7
сообщение Jan 2 2008, 20:53
Сообщение #2


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



А давайте посмотрим на это дело с другой стороны. Наш автор портирует свой TCP стек. Если внимательно посмотреть, то в протоколе TCP выровнены заголовки с точностью 4 байта, в IP - тоже, фигня получается в Ethernet 6+6+2=14. Так я бы воткнул бы 2 пустых байта перед самой структурой пакета (начальный адрес структуры нет проблемы получить с нужным выравниванием) и в результате получил доступ к LONG в нормальном режиме, а не с побайтным чтением.

Я понимаю, что костыль, но зато кода гораздо меньше.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jan 3 2008, 09:46
Сообщение #3


Гуру
******

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



Цитата(Rst7 @ Jan 3 2008, 03:53) *
А давайте посмотрим на это дело с другой стороны. Наш автор портирует свой TCP стек. Если внимательно посмотреть, то в протоколе TCP выровнены заголовки с точностью 4 байта, в IP - тоже, фигня получается в Ethernet 6+6+2=14. Так я бы воткнул бы 2 пустых байта перед самой структурой пакета (начальный адрес структуры нет проблемы получить с нужным выравниванием) и в результате получил доступ к LONG в нормальном режиме, а не с побайтным чтением.

Я понимаю, что костыль, но зато кода гораздо меньше.
Я не вытаскиваю из буфера EMAC DMA весь пакет целиком, а как раз отдельными заголовками, и с ethernet-заголовком затыков не было. Проблема была с TCP-заголовком, а именно с 32-битными полями seqno и ackno, байты в которых надо было переставлять, что бы нормально с ними работать. Вообще, структура TCP заголовка как раз выровненная к 32-битам, так что для меня, пока, все равно загадка, почему ЭТО не работает под IAR 05.gif
Код
typedef struct __TCP_Header
{
/* dword 0 */
UINT16 src_port;    /* Source port     */
UINT16 dest_port;    /* Destination port    */

/* dword 1 */
UINT32 seqno;     /* Sequence number    */

/* dword 2 */
UINT32 ackno;     /* Acknowledgement number  */

/* dword 3 */
UINT8 hlen;     /* Header length an 32 bits oktets */
UINT8 flags;     /* Flags */
UINT16  window;     /* Size of window    */

/* dword 4 */
UINT16  checksum;    /* TCP packet checksum   */
UINT16  urgent;     /* Urgent pointer    */

} TCP_Header_t;


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

Сообщений в этой теме
- prottoss   Почему под отладчиком работает а без него не хочет?   Dec 31 2007, 13:52
- - prottoss   Такое очучение, что что-то с 32-бит переменными не...   Jan 1 2008, 11:47
- - zltigo   1. При всем обилии матрешек, лишних масок и преобр...   Jan 1 2008, 13:53
|- - prottoss   Цитата(zltigo @ Jan 1 2008, 20:53) 3. Для...   Jan 1 2008, 16:57
|- - 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 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 - 08:09
Рейтинг@Mail.ru


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