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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Почему под отладчиком работает а без него не хочет?
zltigo
сообщение Jan 2 2008, 14:30
Сообщение #16


Гуру
******

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



Цитата(Сергей Борщ @ Jan 2 2008, 15:49) *
Не хочу затевать спор.

Я тоже sad.gif
Цитата
но компилятору такой анализ не под силу. Возможно именно поэтому предупреждение выдается всегда.

Это дело компилятора - пакованную структуру рожает именно он. Смещениями адресов занимается именно он, все нюансы достура к отдельным байтикам решает компилятор. При этом даже самый навороченый линкер гарантирует только линковку готовых сегментов содержащих готовые структуры по выровненным адресам (если, конечно не указать ему иначе). Просто IAR-овская недоработка sad.gif. Надо будет при случае проверить, может уже и подправили - у меня пик написания подобных вещей был где-то год назад.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Rst7
сообщение Jan 2 2008, 20:53
Сообщение #17


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

Группа: Модераторы
Сообщений: 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
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 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
Rst7
сообщение Jan 4 2008, 07:57
Сообщение #19


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

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



А покажите код, как и куда Вы вытаскиваете этот заголовок? Потому как странно...


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


Гуру
******

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



Цитата(Rst7 @ Jan 4 2008, 14:57) *
А покажите код, как и куда Вы вытаскиваете этот заголовок? Потому как странно...
Дак в первом моем посте я показал проблемный код - при переставлении байтов в 32-бит переменной код улетал.



По поводу хедеров при обработке пакетов - я их, в принципе вообще не вытаскиваю - обрабатываю прям в блоке буфера DMA EMAC


--------------------
Go to the top of the page
 
+Quote Post
Rst7
сообщение Jan 4 2008, 16:41
Сообщение #21


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

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



Цитата
обрабатываю прям в блоке буфера DMA EMAC


Так в этом буфере пакеты наверняка не выровнены до нужного. Лень искать и читать даташит, но что-то мне подсказывает, что алигн там 2 байта. Тогда, конечно, может выстрелить, а может и не выстрелить. Тут, видимо, спасет только #pragma pack(1).
Я то думал, что Вы к себе в структуру вынимаете, и потом с нею ковыряетесь.


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


Гуру
******

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



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

Установленный бит 0 - буфер заполнен

Установленный бит 1 - последний дескриптор в буфере DMA.

Таким образом все блоки выровнены с алигном в 4 байта


--------------------
Go to the top of the page
 
+Quote Post
Rst7
сообщение Jan 4 2008, 20:35
Сообщение #23


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

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



Цитата
Таким образом все блоки выровнены с алигном в 4 байта


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


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


Гуру
******

Группа: Свой
Сообщений: 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 разрядное) стало не нужным и из структуры выкидывается... Все, программа начинает падать в самых не предсказуемых местах, вернее в модуле, где используется данная структура, ну а модуль, соответсвенно, вешает весь остальной код. Поясните, плиз, где моя ошибка.


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

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

 


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


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