【问题标题】:Can I reset Microchip's TCP/IP stack without reseting the board?我可以在不重置电路板的情况下重置 Microchip TCP/IP 堆栈吗?
【发布时间】:2009-03-04 18:50:58
【问题描述】:

我正在一个 8 位微控制器上使用 Microchip 的免费 TCP/IP(4.55 版)堆栈。

我正在尝试在不使用 asm("RESET") 进行全板重置的情况下重置堆栈。

关于如何重新启动此堆栈的任何想法。

更新

我通过以下步骤重置堆栈

  1. 将复位引脚切换到 Microchip 以太网芯片上
  2. 调用 StackInit();
  3. 手动重置 UDP 通告状态机

这似乎从我遇到的致命 SPI 错误中恢复。

【问题讨论】:

    标签: embedded microchip


    【解决方案1】:

    调用 StackInit()。该函数重新初始化所有子模块(TCP、UDP、SMTP 等)。它还会破坏您打开的所有 TCP 和 UDP 套接字,因此您必须重新打开要使用的套接字。

    附带说明:我关注了 Microchip 论坛上的主题。我的 TCP 堆栈中也出现了奇怪的重置。它最终成为堆栈溢出。将一些变量放在堆栈的顶部。

    #pragma udata stackoverflow = 0xE00
    UInt32 StackUpperBound[8];
    #pragma udata
    

    在 main() 的开头初始化这些变量,并在开头放置一个断点。查看这些变量是否被覆盖。

    【讨论】:

    • 我尝试调用 StackInit(),但在执行此操作后无法恢复我的 TCP 套接字。你把你的空白数组 StackUpperBound 放在哪里了?在你的主文件中,或者在堆栈中的某个地方。
    • 另外,您创建自己的区块有什么原因吗? (堆栈溢出)
    • 在链接器文件中,我的堆栈位于 0xD00,长度为 0x100 字节。所以把我的变量是 0xE00 放在堆栈的顶部。我总是给我定义为习惯的任何块命名。在 main() 中,我有一个循环将 StackUpperBound 初始化为 DEADBEEF。
    【解决方案2】:

    我对 Microchip 堆栈完全不熟悉,但除非堆栈被设计为重新启动,否则我怀疑你会成功。

    如果所有缓冲区和结构都是静态分配的,那么理论上,您可以调用初始化例程来“重新启动”堆栈(假设它会重新初始化结构)。

    如果它使用动态缓冲区(malloc),那么我相信你会不走运。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-18
      • 2011-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-17
      • 1970-01-01
      相关资源
      最近更新 更多