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.
工具与软件:
您好!
我正在修改 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);
}
你好、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中打印此传输的第一个字节!