|
Почему под отладчиком работает а без него не хочет? |
|
|
|
Jan 2 2008, 14:30
|

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

|
Цитата(Сергей Борщ @ Jan 2 2008, 15:49)  Не хочу затевать спор. Я тоже  Цитата но компилятору такой анализ не под силу. Возможно именно поэтому предупреждение выдается всегда. Это дело компилятора - пакованную структуру рожает именно он. Смещениями адресов занимается именно он, все нюансы достура к отдельным байтикам решает компилятор. При этом даже самый навороченый линкер гарантирует только линковку готовых сегментов содержащих готовые структуры по выровненным адресам (если, конечно не указать ему иначе). Просто IAR-овская недоработка  . Надо будет при случае проверить, может уже и подправили - у меня пик написания подобных вещей был где-то год назад.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jan 3 2008, 09:46
|

Гуру
     
Группа: Свой
Сообщений: 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 Код 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;
--------------------
|
|
|
|
|
Jan 4 2008, 16:41
|

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

|
Цитата обрабатываю прям в блоке буфера DMA EMAC Так в этом буфере пакеты наверняка не выровнены до нужного. Лень искать и читать даташит, но что-то мне подсказывает, что алигн там 2 байта. Тогда, конечно, может выстрелить, а может и не выстрелить. Тут, видимо, спасет только #pragma pack(1). Я то думал, что Вы к себе в структуру вынимаете, и потом с нею ковыряетесь.
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Jan 4 2008, 16:56
|

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

|
Цитата(Rst7 @ Jan 4 2008, 23:41)  Так в этом буфере пакеты наверняка не выровнены до нужного. Лень искать и читать даташит, но что-то мне подсказывает, что алигн там 2 байта. Тогда, конечно, может выстрелить, а может и не выстрелить. Тут, видимо, спасет только #pragma pack(1). Я то думал, что Вы к себе в структуру вынимаете, и потом с нею ковыряетесь. По даташиту: Буфер состоит из блоков по 128 байт каждый. Каждому блоку соответсвует дескриптор блока, по которому DMA нюхает и заполняет блок. Первое двойное слово дескриптора есть адрес блока. В этом адресе первые два бита флаги: Установленный бит 0 - буфер заполнен Установленный бит 1 - последний дескриптор в буфере DMA. Таким образом все блоки выровнены с алигном в 4 байта
--------------------
|
|
|
|
|
Jan 12 2008, 22:18
|

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

|
Опять наступаю на те жн грабли, и опять мне не понятно, почему. IAR 4.42A for ARM. Объявлена некая структура, в которой поля имеют разную разрядность, т.е и 8 и 16 и 32 бита. Запаковал ее директивой #pragma Код #pragma pack(1)
typedef struct __MyStruct
{
....
} MyStruct_t
#pragma pack() Все прекрасно работает. На этапе отладки одно из полей (8 разрядное) стало не нужным и из структуры выкидывается... Все, программа начинает падать в самых не предсказуемых местах, вернее в модуле, где используется данная структура, ну а модуль, соответсвенно, вешает весь остальной код. Поясните, плиз, где моя ошибка.
--------------------
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|