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.

[参考译文] DK-TM4C129X:使用 UpdateBOOTP 检索 IP

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/572766/dk-tm4c129x-retrieve-ips-using-updatebootp

器件型号:DK-TM4C129X

您好!

BOOT_serial 位于0x0、应用程序从0x4000开始。

我要尝试的是,一旦应用程序启动,它就会访问 Unix 服务器,以获取自己分配的 IP 和服务器 IP,然后调用 lwip_init()。

所以,我修改了 ParseBOOTPReply()来检索 IP。

//
//从响应中提取我们的 IP 地址。
//
*((uint32_t *)(void *)(&uip_hostaddr)= psbootbootp -> ui32YIAddr;
//
//保存为 lwip 初始化分配的服务器 IP 的副本
//

bootbootp_Server_Assigned_ip = psbootp->ui32YIAddr;
UARTprintf ("BOOTP Assigned IP=%d \n"、BOOTP_SERVER_Assigned_IP);

//
//从响应中提取服务器地址。
//
*((uint32_t *)(void *)(&g_sServerAddr)= psBOOTP->ui32SIAddr; 

应用程序启动后,它会调用 lwipinit(),并调用 ConfigureEent()和 UpdateBOOTP()。

Configureenet();
UpdateBOOTP();//调用例程以执行 BOOTP 和
////获取服务器分配的 IP 地址


BOOTP_SERVER_Assigned_IP = ntohl (BOOTP_SERVER_Assigned_IP);//转换接收到的网络字节

//
//初始化 lwIP。
//
// lwIPInit (g_ui32SysClock、pui8MAC、0、0、0、0、 ipaddr_use_dhcp);
lwIPInit (g_ui32SysClock、pui8MAC、BOOTP_SERVER_Assigned_IP、0、0、0、 ipaddr_use_static); 

此应用程序使用闪存或基于 ROM 的 bootlaore+DHCP、因此获取电路板的 IP 没有问题。

但是、如果调用两个函数来使用 BOOOTP 检索 IP、则应用程序会卡住。

即使我尝试在没有引导加载程序的情况下在0x00启动应用程序、以查看上述模块是否可以获得 IPS、但这不会让我成功。

您能给我一些提示、帮助吗?

此致、

Jin

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

    您是否尝试静态分配 IP 地址,而不是让设备与 DHCP 服务器协商 IP 地址?

    如果是,则网络是否支持提供的 IP 地址?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Amit、您好!

    我认为是这样,因为我在 bootptab 中添加了此电路板的 MAC 地址和 IP,但不确定需要在何处定义服务器 IP。 我想,一旦 bootpd 收到 BOOTP 请求,服务器 IP 就会添加到应答数据包中。

    实际上、我在0x0测试了 boot_serial、并在 UNIX 服务器中放置了一个从0x4000开始的应用程序、引导加载程序成功地在服务器上接收到 IP 和映像文件。


    问题是它无法检索为电路板分配的 IP。 我检查了哪些函数使应用程序卡住,我对 updateBOOT()感到怀疑。

    由于我只调用带有注释的 updateBootp()的 Configureenet()作为 DHCP,它看起来是有效的,但添加 updateBootp()会使它卡住。

    此致、
    Jin

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

    您好、Jin、

    [引用 user="Jin SEO ]\n 我认为是这样,因为我在 bootptab 中添加了此主板的 MAC 地址和 IP,但不确定需要在何处定义服务器 IP。 我想,一旦 bootpd 收到 BOOTP 请求,服务器 IP 就会添加到回复包中。

    您是指 LMFlashProgrammer 吗?

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

    Amit、您好!

    否,与 BOOTP 关联的实际 HP-UNIX 服务器和 bootpd。 我的应用程序与在 UNIX 上运行的 bootpd 进行通信、而不是与 LMFlash 进行通信。 因为 BOOTP 协议符合标准,所以它应该起作用。就像我之前说过的那样,当我使用 DHCP 时,我成功地从服务器接收到了已连接的 IP 和映像。

    应用程序的映像文件位于其他位置(Unix 服务器)、并在 bootptab (bootpd 的配置文件)中进行了说明。

    此致、
    Jin

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

    您是否尝试用 DHCP 获取的 IP 地址替换静态地址,而不是使用静态地址。 我仍在尝试让我的头脑绕过您的实施。 您能否将流程的步骤列为1-2-3个项目、并在系统的每个步骤和行为中给出预期?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Amit、您好!

    如果使用 DHCP、无论使用 ROM 或基于闪存的引导加载程序、此应用程序都可以正常工作。

    由于我需要提取电路板分配的 IP 和服务器 IP (服务器 IP 将用于与其他守护程序进行套接字通信)。

    我所做的是:

    1.修改 BL_EMAC 中的 ParseBOOTPReply()以检索板 IP 和服务器 IP。

    //
    //从响应中提取我们的 IP 地址。
    //
    *((uint32_t *)(void *)(&uip_hostaddr)= psbootbootp -> ui32YIAddr;
    //
    //为 lwip 初始化保存服务器分配的 IP 的副本
    //
    
    BOOTP_SERVER_Assigned_IP = psBOOTP->ui32YIAddr;
    UARTprintf ("BOOTP Assigned IP=%d \n"、BOOTP_SERVER_Assigned_IP);
    
    //
    //从响应中提取服务器地址。
    //
    *((uint32_t *)(void *)(&g_sServerAddr)= psBOOTP->ui32SIAddr;
    //
    //为 address.c 初始化保存 CHGD 报告的服务器 IP 的副本
    //
    BOOTP_CHRGD_SERVER_ADDRESS = psBOOTP->ui32SIAddr; 

    2.在应用程序首次初始化时,它会调用 lwiptask_init(),而在该 funtion 中,通过调用 lwip_init()来启动 lwip,从而允许使用不同的模式,如 static/dhcp。

    在调用 lwip_init()之前,在 BL_EMAC 中执行 Configureenet()、updateBootp()。

    // EnetReconfig (120000000);
    Configureenet();
    UpdateBOOTP();//调用例程以执行 BOOTP 和
    ////获取服务器分配的 IP 地址
    
    
    BOOTP_SERVER_Assigned_IP = ntohl (BOOTP_SERVER_Assigned_IP);//转换接收到的网络字节
    
    //
    //初始化 lwIP。
    //
    // lwIPInit (g_ui32SysClock、pui8MAC、0、0、0、0、 ipaddr_use_dhcp);
    lwIPInit (g_ui32SysClock、pui8MAC、BOOTP_SERVER_Assigned_IP、0、0、0、 ipaddr_use_static); 

    为此、我更改了 lwipts 中禁用的 LWIP_DHCP。

    #define LWIP_DHCP 0 //默认为0 

    此外、更改了 bl_config.h 和.cmd 中 start/vector 地址的定义(我认为无论我怎么做、这都不是必需的)

    #define APP_START_ADDRESS 0x00000000
    #define VTABLE _START_ADDRESS 0x00000000 

    3.如果调用了上述函数,应用程序甚至没有启动。(代码相同,应作为我测试的闪存引导加载程序+DHCP 进行调用)

    4.我注释了 updateBootp(),以查看 configureenet()是否正常,但它仍然从0x0 +DHCP 开始,因此 lwip_init()为 DHCP 设置。

    5.已注释 configureenet()和未注释的 updateBootp(),它们不起作用(它只是在应用程序启动时卡住)

    这是我迄今为止测试过的内容。

    实际上,lwip_init()的模式现在是 DHCP 还是静态的,因为我尝试检查上述两个函数是否正常工作。

    抱歉、我忘记说 BOOTP/tftp 包含在 UIP 中、因此我在 UIP-conf、h 中配置了以下内容

    //
    //
    //打开 UDP 支持。
    ////
    *****************
    #define UIP_CONF_UDP 1 

    此致、

    Jin

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

    您好、Jin、

    您是否仍在尝试解决此问题?

    根据我的理解、您的应用程序(而不是引导加载程序)首先使用 UIP 堆栈(通过调用 ConfigureEnet 和 UpdateBOOTP 函数)来获取分配给 DK-TM4C129x 的 IP 地址和服务器 IP 地址。 如果为真,则缺少以下信息:

    SysClock 配置为什么? ConfigureEnet 函数将其配置为120MHz。 但是、我们希望确保它未配置为其他某个值。

    SysTick 中断如何处理 BOOTP 和 TFTP 协议所需的全局变量? 请参阅 bl_emac.c 文件中的函数"SysTickIntHandler"。

    谢谢、

    SAI

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

    您好、Sai、

    SysClock 以120MHz 的频率运行。

    此应用程序在 FreeRTOS 上运行、似乎需要经过 FreeRTOS 才能使用 SysTick 中断、我现在将介绍这一点。

    我不确定问题是否来自 SysTick 中断、但让我尝试一下。

    此致、

    Jin

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

    您好、Jin、

    [引用 user="Jin SEO "]此应用程序在 FreeRTOS 上运行

    我以前没有意识到这一点。

    [引用 user="Jin SEO "]为了使用 SysTick 中断,我现在正在查看该中断。

    FreeRTOS 允许插入勾形钩。 每次 SysTick 中断发生时都会调用此回调函数。

    [引用 user="Jin SEO "]我不确定问题是否来自 SysTick 中断,但让我尝试一下。

    文件"bl_emac.c"中的 SysTickIntHandler 具有以下代码。 我没有花时间查看如果这些变量设置不正确会发生什么情况、但它们在您调用的函数中都被使用。 更好地正确处理它们。

    void
    SysTickIntHandler (void)
    {
    //
    //增加节拍数。
    //
    G_ui32Ticks++;
    G_ui32PeriodicTimer += SYSTICKMS;
    G_ui32ARPTimer += SYSTICKMS;
    } 

    谢谢、

    SAI