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

 
 
 
Reply to this topicStart new topic
> Zynq - ошибка при передаче пакета Ethernet, Не обновляются данные в передающем буфере
Nivovod
сообщение Feb 15 2016, 15:06
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 38
Регистрация: 16-06-10
Пользователь №: 57 971



Есть массив в который я пишу данные для передачи, добавляю в его начало TCP, IP заголовки, Ethernet фреймы. Затем ссылку на этот массив указываю в дескрипторе и включаю данный дескриптор на передачу. И пакет нормально уходит в сеть. Но изредка (с периодом от 1 секунды до 3-х минут) в сеть уходит пакет, содержащий первые 68 байт предыдущего пакета, а остальную часть пакета текущую. А так как в этих первых 68 байтах содержатся все заголовки TCP, IP, то TCP сессия нарушается. Не понимаю почему так происходит. Специально проверяю содержимое массива перед командой запуска на передачу. Все данные в массиве правильные! И почему все время портятся именно первые и именно 68 байт?
Может кто сталкивался? Может у кого есть безошибочный код приема/передачи по ethernet для zynq?
Go to the top of the page
 
+Quote Post
Nivovod
сообщение Feb 16 2016, 08:25
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 38
Регистрация: 16-06-10
Пользователь №: 57 971



Добавлю функцию, которой отправляю данные
TxFrame - тот самый массив char на 1500 байт. К слову - пакетов длиной более 300 байт у меня не бывает
FramesTx - увеличивается на 1 в момент прерывания по завершению отправки пакета
FrameSize - размер данных в массиве TxFrame
EmacPsInstancePtr - указатель на MAC контроллер

Сообщения об ошибках не воозникают, но тем не менее первые 68 байт в TxFrame почему-то остаются от предыдущего пакета и уходят в сеть.

Код
EthernetFrame TxFrame;        /* Transmit buffer */
volatile int FramesTx;        /* Frames have been sent */

int Ethernet_FrameSend(XEmacPs *EmacPsInstancePtr, u16 FrameSize)
{
    int Status;
    XEmacPs_Bd *Bd1Ptr;

    Xil_DCacheFlushRange((u32)&TxFrame, FrameSize);        

    Status = XEmacPs_BdRingAlloc(&(XEmacPs_GetTxRing(EmacPsInstancePtr)),1, &Bd1Ptr);    
                if (Status != XST_SUCCESS) {
        EmacPsUtilErrorTrap("Error allocating TxBD");
        return XST_FAILURE;}

    XEmacPs_BdSetAddressTx(Bd1Ptr, &TxFrame);    
    XEmacPs_BdSetLength(Bd1Ptr, FrameSize);            
        XEmacPs_BdClearTxUsed(Bd1Ptr);                    
        XEmacPs_BdSetLast(Bd1Ptr);                    

    Status = XEmacPs_BdRingToHw(&(XEmacPs_GetTxRing(EmacPsInstancePtr)),1, Bd1Ptr);                
                if (Status != XST_SUCCESS) {
        EmacPsUtilErrorTrap("Error committing TxBD to HW");
        return XST_FAILURE;}

    FramesTx = 0;        

    XEmacPs_Transmit(EmacPsInstancePtr);

    while (FramesTx == 0);                    

    if (XEmacPs_BdRingFromHwTx(&(XEmacPs_GetTxRing(EmacPsInstancePtr)),1, &Bd1Ptr) == 0)
           {
        EmacPsUtilErrorTrap ("TxBDs were not ready for post processing");
        return XST_FAILURE;}


    Status = XEmacPs_BdRingFree(&(XEmacPs_GetTxRing(EmacPsInstancePtr)), 1, Bd1Ptr);            
                if (Status != XST_SUCCESS) {
        EmacPsUtilErrorTrap("Error freeing up TxBDs");
        return XST_FAILURE;}

    return XST_SUCCESS;
}
Go to the top of the page
 
+Quote Post
Nivovod
сообщение Feb 17 2016, 16:58
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 38
Регистрация: 16-06-10
Пользователь №: 57 971



Проблема решилась путём запрета прерывания при приеме ethernet пакета во время формирования пакета для передачи. Не представляю как прерывание при приеме пакета, которое просто увеличивает счетчик событий, может влиять на содержимое передающего буфера, тем более на его первые 68 байт. Но факт на лицо. Всем спасибо за помощь и участие.
Go to the top of the page
 
+Quote Post

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

 


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


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