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.

[参考译文] TM4C1294NCPDT:手动配置 DHCP 或静态 IP 时出现问题

Guru**** 2609955 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/766896/tm4c1294ncpdt-problems-with-manual-configuration-of-dhcp-or-static-ip

器件型号:TM4C1294NCPDT

大家好、

 我使用了 TM4C 处理器、我的项目也在使用 XGCONF 配置来实现 DHCP 分辨率。

 它工作正常、IP 很快就能获得、这种方法我没有问题。

 现在我有一个请求、需要实施支持来按需选择 IP 分辨率类型、我的意思是、使用可以访问配置面板(通常、我使用套接字或 UART 进行配置)。
 但我在尝试动态设置 DHCP 或 IPaddress 时遇到问题。 NC_NetStart 不起作用、我不知道如何修复它。

 我正在使用 tcpEcho 尝试修复它、然后将解决方案放在我的项目上。

 我使用的是 TI-RTOS 2.16.1.14。

 我遇到的错误如下:

启动 TCP 回显示例
系统提供商设置为 SysMin。 停止目标以查看 ROV 中的任何 SysMin 内容。
服务状态:DHCP:已启用:000
服务状态:DHCP:已启用:正在运行:000

NetworkConfig 配置-初始化
NC_SystemOpen
CONFIGURANDO DHCP
CfgAddEntry ret = 0
NC_NetStart
000 ExecStart:已打开
00000.000 DHCPOpen:NIMUIOCTL (NIMU_GET_DEVICE_MAC)失败、错误代码为-22

NetStop 回叫
FSR = 0x0000
HFSR = 0x40000000
DFSR = 0x0000000b
MMAR = 280bbbbbbf4
BFAR = 280bbbbbf4
AFSR = 0x00000000
正在终止执行...

 在我的文件 tcpEcho.c 中,NetworkConfig()















void NetStart(){System_printf("NetStart Callback\r\n");System_flush();} void netStop(){ System_printf("NetStop Callback\r\n");System_flush();} void ServiceeReport(uint a, uint b, uint c, handle cfg);{/udp_eDP_eDP0=uint()}
int NetworkConfig (void)
{
int ret;
CI_IPNet NA;
CI_route RT;
CI_SERVICE_DHCPc dhcpc;
handle hCfg;

System_printf ("\r\nNetworkConfig Configuracion - Initialization\r\n);
System_flush ();

ret = NC_SystemOpen (NC_Priority_Low、NC_OPDE_INTERRUPT);
if (nc_printf

)("NC_SystemOpen Failed (%d)\n"System_printf"(nC





);

unt (n_unt)

;unt =系统配置(n_unt);unt (n_unt);unt (n_unt);(



如果无法创建系统配置)(n_unt);


//在接口1
bzero (&dhcpc、sizeof (dhcpc))上指定 DHCP 服务;
dhcpc.cisargs.Mode = CIS_FLG_IFIDXVALID;
dhcpc.cisargs.IfIdx = 1;
dhcpc.cisargs.pCbSrv =&serviceReport;
dhcpc.param.pOptions = DHCP_OPTIONS;
dhcpc.param.len = 2;
ret = CfgAddEntry (hCfg、CFGTAG 服务、CFGITEM_SERVICE_DHCPLIENT、0、sizeof (dhcpc)、 (uint8 *)&dhcpc、0);

System_printf ("CfgAddEntry ret =%d\r\n"、ret);
System_flush ();

//添加我们的主机名
CfgAddEntry (hCfg、CFGFO_SYSINtag、CFGITEM_DHCP_HOSTNAME、0、strttttt8)("uremota"、"uintttag"(uintttta) 0);
}
否则{
System_printf ("CONFIGURANDO static IP\r\n");

System_printf ("Configurando IP e Netmask\r\n");
System_flush();
//手动配置本地 IP 地址
bzero (&nA、sizeof (nA));
na.ipadinet = 192.168.0.0nA

("r_adinet = na";"r.pna"("10.na"); "scientts.com);
NA.NetType = 0;
//将地址添加到接口1
ret = CfgAddEntry (hCfg、CFGTAG _IPNet、1、0、sizeof (CI_IPNet)、 (uint8 *)&nA、0);

//添加我们的主机名
CfgAddEntry (hCfg、CFGTAG _SYSINFO、CFGITEM_DHCP_HOSTNAME、0、strlen ("equip")、(uint8 *)"equip"、 0);

bzero (&RT,sizeof (RT));
RT.IPDestAddr = 0;
RT.IPDestMask = 0;
rt.IPGateAddr = inet_addr ("192.168.0.1");

//添加路由
ret = CfgAddEntry (hCfg、CFGTAG _route、0、0、sizeof (CI_route)、 (uint8 *)&RT, 0);
}

// TCP 发送缓冲区大小
int 值= 2048;
CfgAddEntry (hCfg、CFGTAG _IP、CFGITEM_IP_SOCKTCPTXBUF、
CFG_ADDMODE_UNIQUE、sizeof (uint)、(uint8 *)&value、0);

// TCP 接收缓冲区大小(复制模式)
值= 2048;
CfgAddEntry (hCfg、CFGTAG _IP、CFGITEM_IP_SOCKTCPRXBUF、
CFG_ADDMODE_UNIQUE、sizeof (uint)、(uint8 *)&value、0);

// TCP 接收限制(非复制模式)
值= 2048;
CfgAddEntry (hCfg、CFGTAG _IP、CFGITEM_IP_SOCKTCPRXLIMIT、
CFG_ADDMODE_UNIQUE、sizeof (uint)、(uint8 *)&value、0);

// UDP 接收限制
值= 2048;
CfgAddEntry (hCfg、CFGTAG _IP、CFGITEM_IP_SOCKUDPRXLIMIT、
CFG_ADDMODE_UNIQUE、sizeof (uint)、(uint8 *)&value、0);

//
//使用此配置启动系统
//
////我们一直启动,直到函数返回1以下。 这允许
//我们有一个“reboot”命令。
//
System_printf ("NC_NetStart\r\n");
System_flush();
do
{
ret = NC_NetStart( hCfg、NetStart、netStop、netOpenHook );
}while (




fg > 0);System_printf ("NC_NetStart retCode =%d\r\n"、

Finishing);// System_printf




(nc > 0);System_printf

(nc);System_print_printf (nc (close [关闭系统配置](n'_print])




空 startupTask (UArg0、UArgarg1){
NetworkConfig();
}

startupTask 由 BIOS 作为任务调用。

有线索吗? 我已经看了几篇文章、但没有找到修复方法。

是否有任何人可以共享具有手动配置的项目 tcpEcho?

提前通知 Tks

莱安德罗

void NetStart(){System_printf("NetStart Callback\r\n");System_flush();}
void netStop(){System_printf("NetStop Callback\r\n");System_flush();}
void serviceReport (uint a、uint b、uint c、handle cfg){//debug ("ServiceReport\r\n");}
int isDhcp = 1;uint8 dhcp_options[]={DHCPPT_SERVER_identifier、DHCPPT_router};void netOpenHook (IPN ipaddr、uint IfIdx、uint fADD);int NetworkConfig (void){int 配置;CI_IPNet NA;CI_route RT;CI_SERVICE_DHCPc;DHCPc 处理 DHCPc
System_printf ("\r\nNetworkConfig 配置-初始化\r\nNC_SystemOpen\r\n");System_flush ();
RET = NC_SystemOpen (NC_Priority_Low、NC_OPMODE_INTERRUPT);if (ret){ System_printf ("NC_SystemOpen Failed (%d)\n"、ret);System_flush ();return -1;
hCfg = CfgNew();if (!hCfg){ System_printf("无法创建配置\n");System_flush();转到 main_exit;}

if (isDhcp){System_printf ("CONFIGURANDO DHCP\r\n");
//在接口1 bzero (&dhcpc、sizeof (dhcpc))上指定 DHCP 服务;dhcpc.cisargs.Mode = CIS_FLG_IFIDXVALID;dhcpc.cisargs.IfIdx = 1;dhcpc.cisargs.pCbSrv =&serviceReport;     dhcpc.param.pOptions = DHCP_OPTIONS;     dhcpc.param.len = 2;ret = CfgAddEntry (hCfg、CFGTAG 服务、CFGITEM_SERVICE_DHCPLIENT、0、sizeof (dhcpc)、 (uint8 *)&dhcpc、0);
system_printf ("CfgAddEntry ret =%d\r\n"、ret);System_flush ();
//添加我们的主机名 CfgAddEntry (hCfg、CFGTAG _SYSINFO、CFGITEM_DHCP_HOSTNAME、0、strlen ("remotta")、(uint8 *)"remotta"、 0);否则{System_printf ("CONFIGURANDO 静态 IP\r\n");
system_printf ("Configurando IP e Netmask\r\n");System_flush ();//手动配置本地 IP 地址 bzero (&nA,sizeof (nA));na.ipaddr = inet_addr ("192.168.0.10");na.ipMask = inet_addr ("255.255.255.0);strcpy (na.Domain) "scientts.com);NA.NetType = 0;//将地址添加到接口1 ret = CfgAddEntry (hCfg、CFGTAG _IPNet、1、0、sizeof (CI_IPNet)、 (uint8 *)不适用、0);
//添加我们的主机名 CfgAddEntry (hCfg、CFGTAG _SYSINFO、CFGITEM_DHCP_HOSTNAME、0、strlen ("equip")、(UINT8 *)"equip"、 0);
bzero (&RT,sizeof (RT));rt.IPDestAddr = 0;rt.IPDestMask = 0;rt.IPGateAddr = inet_addr ("192.168.0.1");
//添加路由 ret = CfgAddEntry (hCfg、CFGTAG _route、0、sizeof (CI_route)、 (uint8 *)&RT, 0);}
  // TCP 发送缓冲区大小  int 值= 2048;  CfgAddEntry (hCfg、CFGTAG _IP、CFGITEM_IP_SOCKTCPTXBUF、          CFG_ADDMODE_UNIQUE、sizeof (uint)、(uint8 *)&value、0);
  // TCP 接收缓冲区大小(复制模式)  值= 2048;  CfgAddEntry (hCfg、CFGTAG _IP、CFGITEM_IP_SOCKTCPRXBUF、          CFG_ADDMODE_UNIQUE、sizeof (uint)、(uint8 *)&value、0);
  // TCP 接收限制(非复制模式)  值= 2048;  CfgAddEntry (hCfg、CFGTAG _IP、CFGITEM_IP_SOCKTCPRXLIMIT、          CFG_ADDMODE_UNIQUE、sizeof (uint)、(uint8 *)&value、0);
  // UDP 接收限制  值= 2048;  CfgAddEntry (hCfg、CFGTAG _IP、CFGITEM_IP_SOCKUDPRXLIMIT、          CFG_ADDMODE_UNIQUE、sizeof (uint)、(uint8 *)&value、0);
#if 0  // TCP 保持空闲(10秒)  RC = 100;  //  这是 TCP 探测  CfgAddEntry (hCfg、CFGTAG _IP、CFGITEM_IP_TCPKEEPIDLE、          CFG_ADDMODE_UNIQUE、sizeof (uint)、(uint8 *)&RC、0);
  // TCP 保持间隔(1秒)  //  这是 TCP 保持探测  RC = 10;  CfgAddEntry (hCfg、CFGTAG _IP、CFGITEM_IP_TCPKEEPINTVL、          CFG_ADDMODE_UNIQUE、sizeof (uint)、(uint8 *)&RC、0);
  // TCP 最大保持空闲时间(5秒)  //  这是 TCP 保留将在断开连接 RC  = 50之前进行探测;  CfgAddEntry (hCfg、CFGTAG _IP、CFGITEM_IP_TCPKEEPMAXIDLE、          CFG_ADDMODE_UNIQUE、sizeof (uint)、(uint8 *)&RC、0);#endif

  CfgSetDefault (hCfg);////使用此配置引导系统//////我们继续引导,直到函数返回小于1。 这允许//我们有一个“reboot”命令。 // System_printf ("NC_NetStart\r\n");System_flush();do { ret = NC_NetStart( hCfg、NetStart、netStop、netOpenHook );} while (ret >0);
System_printf ("NC_NetStart retCode =%d\r\n"、ret);
//删除配置 CfgFree( hCfg );
System_printf ("NetworkConfig Configuracion - Finishing \r\n);System_flush ();
//关闭 OS MAIN_EXIT:NC_SystemClose ();
return (0);}


空 startupTask (UArg0、UArgarg1){NetworkConfig();}

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

    配置中缺少某些项目(例如创建时钟对象)。 我将使用 XGCONF 生成网络堆栈线程代码、然后将其从 Debug\configPkg\cupitp\config (例如 tcpEcho_pem4f.c)中生成的源文件中复制出来。 搜索 ti_ndk_config_Global_stackThread 并复制它(及其调用的任何函数)。 注意:您可能会对静态 IP 执行相同的操作来查看差异。 您应该能够轻松添加 isDHCP 检查。

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

    正如我所理解的、tcpEcho_pem4f.c 是基于 XGConf 参数生成的代码、因此、我们的想法是使用此代码作为我自己配置的基础。
    对吗?
    可能我需要的只是时钟。
    我将进行介绍并告诉您。
    Tks 寻求帮助

    莱安德罗
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、tcpEcho_pem4f.c 是基于 XGConf 参数生成的代码。 因此、您使用 XGCONF、就像过去一样。 从 tcpEcho_pem4f.c 中复制配置堆栈的代码、并将其放入您自己的源文件中。 然后移除堆栈的 XGCONF 配置(因此不生成代码)。