Other Parts Discussed in Thread: SYSBIOS
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;