This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TM4C129ENCPDT:NDK_Send Blocking -在 tcpEcho 示例中使用邮箱

Guru**** 2044430 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1469255/tm4c129encpdt-ndk_send-blocking---using-a-mailbox-within-the-tcpecho-example

器件型号:TM4C129ENCPDT

工具与软件:

您好!

我正在修改 TI-rtos tcpEcho 函数。 简而言之、我有两个任务:TCP 任务和 UART 任务。 这与 tcpEcho 示例最初的 TCP 任务相同。

总之、我想回显 TCP 套接字从 TCP 套接字和 UART 中接收到的任何内容。 请注意、这些是单独的任务、而 UART 的优先级较低。

我遇到的问题是、调用 NDK_send 的"send"函数似乎没有被阻止。 因此、在发送函数完成之前、TCP 任务会置于睡眠状态。 这会产生时序问题、或看起来是。

问题:1)我可以使 send 函数阻塞吗? 2) 2)是否有指示发送函数完成时间的状态或回调?  

下面是我的当前代码。 我已注释掉邮箱相关项目。

谢谢!

//________________________________________________====
/**
@返回
-无效

 处理 TCP 连接的任务。 可以有多个正在运行的任务
 这个函数。
*/
空 tcpWorker
(
UArg arg0、   //<任务参数0
UArg arg1   ///<任务参数1
)

   int32_t clientfd =(int32_t) arg0;
   int32_t bytesRcvd;
   int32_t 字节 Sent;

   bool loopError = false;

   volatile bool mailboxPostSuccessess = false;

   system_printf ("tcpWorker: start clientfd = 0x%x\n"、clientfd);
   /* SysMin 只会在您调用 flush 或 exit *时打印到控制台
   system_flush();

   while ((!loopError)&&((bytesRcvd = recv (clientfd、tcpTaskSys.buffer.x、TCPPACKETSIZE、0))> 0)
   {
       /* TCP Echo 功能*/
       bytesSent = send (clientfd、tcpTaskSys.buffer.x、bytesRcvd、0);

       if ((bytesSent < 0)||(bytesSent!= bytesRcvd))
       {
           system_printf ("错误:发送失败。\n");
           /* SysMin 只会在您调用 flush 或 exit *时打印到控制台
           system_flush();
           休息;
           // loopError = true;
       }
       //否则
       //{
       
           /* EGSE 代码*/
       
           //mailboxPostSuccessess = Mailbox_post (*(tcpTaskSys.rs422Handle)、tcpTaskSys.buffer.x、BIOS_no_wait);//sizeof (buffer));//请仔细检查 sizeof (buffer)语句。
       
           //if (true == mailboxPostSuccessess)
           //{
               // System_printf ("邮箱到 RS422的发布成功。\n");
               /* SysMin 只会在您调用 flush 或 exit *时打印到控制台
               // System_flush();
       
               // Task_sleep(GetSleepTickCount());
           //}
           //否则
           //{
               //待如果邮箱已满、请在此处向 FIFO 添加推送
               // System_printf ("邮箱错误!\n");
               /* SysMin 只会在您调用 flush 或 exit *时打印到控制台
               // System_flush();
           //}
      //}





   }

   system_printf ("tcpWorker stop clientfd = 0x%x\n"、clientfd);

   close (clientfd);
}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [quote userid="589411" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1469255/tm4c129encpdt-ndk_send-blocking---using-a-mailbox-within-the-tcpecho-example 我遇到的问题是调用 NDK_SEND 的"send"函数似乎没有被阻止。 因此、在发送函数完成之前、TCP 任务会置于睡眠状态。 这会产生计时问题、或者看起来是。[quote userid="589411" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1469255/tm4c129encpdt-ndk_send-blocking---using-a-mailbox-within-the-tcpecho-example 问题:1)我可以使发送函数阻塞吗? 2) 2)是否有指示发送函数完成时间的状态或回调?  [报价]

    你好、Noah、

     我的理解是 send()是用与 BSD socket send()函数相同的行为实现的。 因此、缺省情况下、它应该被阻止、 直到完成传输。 您能否以 bytesSent 为单位检查返回值。 send()是否成功? 可能是有错误。 bytesSent 表示什么? 请注意、如果出现错误、它将断开并关闭套接字。 如果没有错误、tcpWorker 任务将保持活动状态、因为它在 while 循环中等待传入数据。 如果你的 UART 任务具有较低的优先级、我认为不会满足这个任务。  

     在按原样运行 tchpecho 示例时、它是否起作用?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Charles

    我还没有看到从 send ()返回的错误,所以我认为它是正常的。 是的、tcpecho 示例按原样使用。

    由于 while 循环、UART 任务不会被处理、这是正确的。 这就是为什么我把 tcpWorker 任务放在睡眠。 现在、我的操作可能不正确、但我的过程是:1)接收 TCP、2)回传 TCP 3)发布到邮箱、4)将 tcpWorker 任务置于睡眠状态500us、5)从 UART 发送相同的消息。

    也许,我把任务放在错误的位置睡觉。 我希望它足够"实时"、因为 TCP 回显和 UART 写入大致同时发生。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好、Noah、

     处理器是否达到  Task_sleep (GetSleepTickCount ())? RTOS 节拍默认为1ms。  您是否通过某种方式更改了节拍率? 如果使用默认值1ms、则无法进行500uSec 睡眠。 为什么你不尝试一个更长的延迟与几 MS 看看它是否产生了影响.   

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    很好的建议。 我来试一下。

    供参考-我将使用此函数更改刻度

    //________________________________________________====
    /**
    @返回
    - int32_t:正值表示通过;负值表示错误

    计算并分配 SLEEP 节拍值、设置为10ms (当前)。
    */
    静态 int32_t CalculateSleepTick
    (
    uint32_t* val  //<参考的睡眠周期值
    )


       int32_t returnVal =-1;

       if (val)
       {
           returnVal = 1;

           /*我们希望在宏定义的微秒内休眠*/
           *(val)= task_sleep_time_microsecs/Clock_tickPeriod;
       }

       返回值;
    }

    #define TASK_SLEEP_TIME_MICROSECs   10000u

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我将睡眠时间更改为1毫秒。 此外、调试控制台降低了实时性能。 现在、我可以使用邮箱来发送传输、然后我要从 UART 4中打印此传输的第一个字节!