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.

[参考译文] RTOS/AM4379:NDK 连接挂起

Guru**** 2943030 points

Other Parts Discussed in Thread: SYSBIOS

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/671086/rtos-am4379-ndk-connect-hangs

器件型号:AM4379
Thread 中讨论的其他器件:SYSBIOS

工具/软件:TI-RTOS

我正在尝试让 BSD 套接字在 AM437x IDK 评估板上运行。  使用标准 EMAC、而不是 PRU。 我以与 PDK 示例相同的方式实现了初始化例程。  我可以创建套接字,但对 Connect()的调用挂起,并且从不返回。  我已经验证了我的侦听套接字应用程序在 Linux 上使用 Winsock 和 BSD 套接字的情况。  我将在下面发布我的简单代码和.cfg 文件。  如果有任何建议,将不胜感激。

我将使用以下工具集

GCC BNU v4.0.3 (线性)

XDC 3.32.2.25_CORE

NDK 2.25.1.11

SYS/BIOS 6.46.5.55

AM437x PDK 1.0.7

//这是 C 代码

int TCPTest()


   fdOpenSession (TaskSelf());

   //创建侦听器
   socket sockTest = socket (AF_iNet、SOCK_STREAM、IPPROTO_TCP);
   if (sockTest == invalid_socket)
       返回-1;

   struct sockaddr_in sin1;
   memset (&sin1、0、sizeof (struct sockaddr_in)));
   Sin1.Sin_Family = AF_iNet;
   sin1.sin_port  = htons (2222);
   sin1.sin addr.s_addr = inet_addr ("192.168.2.113");

//   int trueFlag = 1;
//   if (setsockopt (sockTest、SOL_socket、SO_REUSEADDR、&trueFlag、sizeof (int))==1)
//   {
//       System_printf ("SetSockOpt Failure %d \n", errno);
//   }

   int 结果= connect (sockTest、(struct sockaddr *)&sin1、sizeof (sin1));
   如果(结果< 0)
   {
       int errCode = fdError();
       System_printf ("无法连接(%d)\n"、错误代码);

       fdCloseSession(TaskSele());
       返回-1;
   }


   //接收一些数据
   unsigned char buffer[256+1];
   int numBytes = recv (sockTest、buffer、256、0);
   如果(数字字节> 0)
   {
       Buffer[numBytes]=0;  //空终结器
       system_printf ((const char*)缓冲区);
   }


   fdCloseSession(TaskSele());
   返回0;



/*
 * ==== taskFxn ====
 *
void taskFxn (UARg a0、UARg A1)

   //测试 NDK
   TCPTest();


/*
 * ==== main ====
 *
int main()

   Task_Handle 任务;
   Task_Params taskParams;
   ERROR_Block EB;

   /*内存模块*/
   SDKMMUInit();

   //插入 IDK 板
   //Board_initCfg cfg = Board_init_UART_stdio | Board_init_PINMUX_config | Board_init_module_clock | Board_init_ETH_PHY;
   Board_initCfg cfg = Board_init_uart_stdio | Board_init_PINMUX_config | Board_init_module_clock;
   board_status boardInitStatus = Board_init (cfg);
   if (boardInitStatus!=0)
   {
       System_printf ("Board_init failure\n");
       return(-1);
   }

   /*芯片配置 MII/RMII 选择*/
   CpswPortMacModeSelect (1、Ethernet_MAC_TYPE_RGMII);
   CpswPortMacModeSelect (2、Ethernet_MAC_TYPE_RGMII);

   ERROR_INIT (&EB);

   Task_Params_init (&taskParams);
   taskParams.priority = OS_TASKPRINORM;
   taskParams.STACKSIZE = 0x2000;

   任务= Task_create (taskFxn、&taskParams、&EB);
   if (task =NULL){
       System_printf ("Task_create() failed!\n");
       BIOS_exit (0);
   }

   // Nimu Device 表-连接 CPSW EMAC
   NIMUDeviceTable[NIMU_DEVICE_index+].init = &CpswEmacInit;
   NIMUDeviceTable[NIMU_DEVICE_index].init = NULL;

   BIOS_start();   /*不返回*/
   返回(0);

//////////////////////////////////////////////////////////////////////////////////////////////////////////////

//.cfg 如下所示

/*使用模块*/
VAR 默认值      = xdc.useModule('xdc.runtime.Defaults');
VAR 诊断         = xdc.useModule('xdc.runtime.Diags');
VAR 错误         = xdc.useModule('xdc.runtime.Error');
VAR 日志         = xdc.useModule('xdc.runtime.Log');
VAR LoggerBuf      = xdc.useModule('xdc.runtime.LoggerBuf');
VAR Main         = xdc.useModule('xdc.runtime.Main');
VAR 内存= xdc.useModule('xdc.runtime.Memory')
VAR SysMin = xdc.useModule('xdc.runtime.SysMin');
VAR 系统         = xdc.useModule('xdc.runtime.System');
var text         = xdc.useModule('xdc.runtime.Text');
VAR 时钟         = xdc.useModule('ti.sysbios.knl.Clock');
VAR 计时器         = xdc.useModule('ti.sysbios.timers.dmtimer.Timer');
VAR Swi         = xdc.useModule('ti.sysbios.knl.Swi');
VAR 任务         = xdc.useModule('ti.sysbios.knl.Task');
VAR 信标      = xdc.useModule('ti.sysbios.knl.Semaphore');
var ti_sysbios_hal_hwi = xdc.useModule('ti.sysbios.hal.Hwi');
VAR SysMin         = xdc.useModule('xdc.runtime.SysMin');


// NDK
VAR Global = xdc.useModule('ti.ndk.config.Global');
VAR IP = xdc.useModule('ti.ndk.config.Ip');
VAR TCP = xdc.useModule('ti.ndk.config.Tcp');
VAR UDP = xdc.useModule('ti.ndk.config.Udp');
VAR Route = xdc.useModule('ti.ndk.config.Route');
//var ti_ndk_config_emac = xdc.useModule('ti.ndk.config.Emac');
 
/*
 *取消注释此行以全局禁用断言。
 *所有模块继承'库'模块的默认值。  您
 *可以使用 Module.common$按模块覆盖这些默认值。
 *禁用断言将节省代码空间并提高运行时性能。
Defaults.common$.diags_ASSERT = Diags.always_off;
 *

/*
 *取消注释此行以防止模块名称加载到目标上。
 *模块名称字符串放置在.const 段中。 设置此值
 *将参数设置为 false 将节省.const 段中的空间。  误差和
 *断言消息将包含"未知模块"前缀
 实际模块名称的*。
Defaults.common$.namedModule = false;
 *

/*
 *最小化系统中的 EXIT 处理程序数组。  系统模块包括
 *向 System_atexit()注册的函数数数组
 *由 System_exit()调用。
 *
System.maxAtexitHandlers = 4;       

/*系统堆栈大小(由 ISR 和 Swi 使用)*/
program.stack = 0x10000;

System_printf()的/*循环缓冲区大小*/
SysMin。bufSize = 0x200;

/*
 *为整个系统创建并安装记录器
 *
var logerBufParams = new LoggerBuf.Params();
LoggerBufParams.numEntry = 16;
var logger0 = LoggerBuf.create (logerBufParams);
Defaults.common$.logger = logger0;
Main.common$.diags_INFO = Diags.always_on;
 
System.SupportProxy = SysMin;

/*========================= BIOS 配置=================== *

VAR BIOS = xdc.useModule('ti.sysbios.BIOS');
BIOS.libType = BIOS.LibType_Custom;
 
/*
 * BIOS 模块将为系统创建默认堆。
 *指定此默认堆的大小。
 *
BIOS.heapSize = 0xA0000;



Task.defaultStackSize = 4096;
task.idleTaskStackSize = 4096;

System.SupportProxy = SysMin;

System_printf()的/*循环缓冲区大小*/
SysMin。bufSize = 0x200;

/* NDK 配置*/
ip.ResolveIP = false;
ip.CallByIP = false;
Ip.autoIp = false;
ip.address ="192.168.2.7";
ip.mask ="255.255.255.0;
ip.gatewayIpAddr ="192.168.2.1";
ip.domainname ="mydomain.net";
//ip.socketConnectTimeout = 10000;
//ip.socketConnectTimeout = 1;

global.ndkTickPeriod = 100;
global.kernTaskPriLevel = 11;
Global.serviceReportHook =空;
global.ipv6 = false;
global.pktNumFrameBufs=384;


tcp.transmitBufSize = 16384;
tcp.receiveBufSize = 65536;
tcp.receiveBufLimit=65536;


VAR socType          ="AM437X";

/*加载 CSL 包*/
/*使用 CSL 封装*/
VAR_l = XDC.loadPackage ('ti.CSL');
Csl.Settings.deviceType = socType;

/*加载 OSAL 封装*/
var osType ="tirtos";
VAR OSAL = xdc.useModule('ti.osal.Settings');
OSAL.osType = osType;

/*加载 UART 软件包*/
VAR UART = XDC.loadPackage ('ti.drv.UART');

/*加载 I2C 封装*/
var I2C = xdc.loadPackage ('ti.drv.i2c');

/*加载电路板封装并设置电路板名称*/
VAR 板= XDC.loadPackage ('ti.board');
board.Settings.boardName ="idkAM437x";

/* GPIO */
VAR GPIO         = XDC.loadPackage ('ti.drv.GPIO');
//var GPIO         = xdc.loadPackage ('ti.drv.GPIO');
//GPIO.Settings.socType = socType;

/*加载 EMAC 软件包*/
VAR EMAC = XDC.loadPackage ('ti.drv.emac');
emac.Settings.socType = socType;

/*加载 NIMU 封装*/
VAR Nimu      = XDC.loadPackage ('ti.transport.NDK.Nimu');
Nimu.Settings.socType = socType;

/*高速缓存和 MMU */
VAR Cache = xdc.useModule('ti.sysbios.family.arm.a9.Cache');
cache.enableCache = true;

VAR MMU = xdc.useModule('ti.sysbios.family.arm.a8.Mmu');
MM4.enableMMU = true;

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    RTOS 团队已收到通知。 他们将在这里作出回应。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Anthony、

    您是否已验证 NDK 套接字(非 BSD 套接字) API 是否适用于您的应用? 此问题是否仅在 BSD 套接字 API 中发生?

    您可以参阅 PDK 中 NIMU_FtpExample_idkAM437x_armExampleProject 中的 ftpserver_thread_entry()、该工程会为 TCP 套接字/连接调用 NDK API。

    另请检查该线程是否对 BSD 套接字有所帮助- e2e.ti.com/.../666135

    此致、
    Garrett