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.

[参考译文] EK-TM4C1294XL:如何转移 SendBOOTPRequest

Guru**** 2524370 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1563769/ek-tm4c1294xl-how-to-divert-sendbootprequest

器件型号:EK-TM4C1294XL


工具/软件:

我计划在我正在开发的代码中重用 EMACbootloader 代码中的 BOOTP 和 TFTP 功能。当我直接重用 BOOTPThread 函数并执行 SendBOOTPRequest 函数时、它会在行中进入 FaultISR。  pui8Packet[ui32Idx] = 0; 
我怀疑修改 uip_appdata在 uip.h 中声明的值会导致故障。 是否有正确初始化的方法 uip_appdata?  
此外,我尝试在 SendBOOTPRequest () 的开头分配内存 uip_appdata = (uint8_t _)malloc(sizeof(uint8_t) _ UIP_APPDATA_SIZE);,但行为没有改变,它仍然进入故障。

静态 void
SendBOOTPRequest (void)

uint8_t * pui8Packet =(uint8_t *) uip_appdata;

tBOOTPPacket * psBOOTP =(tBOOTPPacket *) UIP_appdata;

uint32_t ui32Idx;

//
//零填充 BOOTP 请求数据包。
//
for (ui32Idx = 0;ui32Idx < sizeof (tBOOTPPacket);ui32Idx++)

pui8Packet[ui32Idx]= 0;
}

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

    尊敬的 Muneto-San:

     能否请参阅:

      C:\ti\TivaWare_C_Series-2.2.0.295\third_party\UIP-1.0\UIP 目录中的 uip.h 和 Uip.c 文件  

     dhcpc.c、位于 C:\ti\TivaWare_C_Series-2.2.0.295\third_party\UIP-1.0\apps\dhcpc 目录中

    您将在此处了解 UIP_DATA 的声明方式(在 uip.h 文件中)以及如何在 dhcpc.c 文件中使用它。 另请参阅 uip.c 文件中的说明。 请参阅下面的。  

    /*
    * UIP 是 IP、UDP 和 TCP 协议的一个小型实现(如
    *以及一些基本的 ICMP 内容)。 这种实现方式结合了 IP、
    * UDP、TCP 和应用层非常紧密。 保持一定的大小
    *在编译的代码中,这个代码经常使用 goto
    *声明。 虽然可以中断 uip_process ()
    *函数合并为许多较小的函数,这会增加代码
    *大小是因为参数传递的开销和事实
    *优化器不会那么高效。
    *
    *原则是我们有一个小的缓冲区,称为 uip_buf ,
    *设备驱动程序在其中放置一个传入的数据包。 TCP/IP
    * Stack 解析数据包中的标头,并调用
    *应用程序。 如果远程主机已向应用程序发送数据、
    *该数据存在于 uip_buf 中,应用程序读取
    *从那里的数据。 由应用程序将这些数据放入其中
    *如果需要,可以使用字节流。 不会向应用程序提供数据
    *这是不连续的。
    *
    *如果应用程序希望将数据发送到对等方,则应将其放入
    *它的数据进入 uip_buf。 UIP_appdata 指针指向
    *第一个可用字节。 TCP/IP 堆栈将计算
    *校验和,并填写必要的标头字段,最后发送
    *数据包返回到对等方。
    */

    如何声明 UIP_appdata 的片段。

    void *uIP_appdata;/* uIP_appdata 指针指向的
    应用数据。 */

    dhcpc.c 文件中如何分配和使用 UIP_appdata 来发送发现数据包的片段。  

    /*---------------------------------------------------------------------------*/
    static void
    send_discover(void)
    {
    u8_t *end;
    struct dhcp_msg *m = (struct dhcp_msg *)uip_appdata;

    create_msg(m);

    end = add_msg_type(&m->options[4], DHCPDISCOVER);
    end = add_req_options(end);
    end = add_end(end);

    uip_send(uip_appdata, end - (u8_t *)uip_appdata);
    }

    您还可以在 C:\ti\TivaWare_C_Series-2.2.0.295\third_party\UIP-1.0\apps\telnetd\telnetd.c 文件中查找有关如何使用 UIP_appdata 发送 TFTP 数据包的示例。  

    static void
    senddata(void)
    {
    static char *bufptr, *lineptr;
    static int buflen, linelen;

    bufptr = uip_appdata;
    buflen = 0;
    for(s.numsent = 0; s.numsent < TELNETD_CONF_NUMLINES &&
    s.lines[s.numsent] != NULL ; ++s.numsent) {
    lineptr = s.lines[s.numsent];
    linelen = strlen(lineptr);
    if(linelen > TELNETD_CONF_LINELEN) {
    linelen = TELNETD_CONF_LINELEN;
    }
    if(buflen + linelen < uip_mss()) {
    memcpy(bufptr, lineptr, linelen);
    bufptr += linelen;
    buflen += linelen;
    } else {
    break;
    }
    }
    uip_send(uip_appdata, buflen);