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.

[参考译文] RTOS/TM4C129XNCZAD:通过 HTTP 连接更改 NDK IP

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/647741/rtos-tm4c129xnczad-ndk-ip-change-with-http-connection

器件型号:TM4C129XNCZAD
Thread 中讨论的其他器件:SYSBIOS

工具/软件:TI-RTOS

使用 HTTP 服务器时尝试更改 IP 地址时出现错误:00010.933 llExit:非法调用 llExit()

代码会更改 IP 以响应包含新 IP 值的 HTTP GET。 我正在尝试在接收 HTTP GET 消息的同一 CGI 函数中删除 CFGTAG _IPNet 配置。

调用 CfgRemoveEntry() 时,CGI 函数给出错误,然后 CfgAddEntry()无法运行。 我无法确定,因为在 尝试单步执行函数时,芯片上的 loader_exit()。

其他开机自检在收到 llExit 错误时出现优先级问题。 有一个名为 dchild 的任务获得优先级9 (内核)、但我认为此任务与 HTTP 服务器相关。 我没有在 XGCONF 中创建此任务。

我是否以不合理的方式删除 IP? 导致错误的原因是什么?

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

    这里也有类似的情况:e2e.ti.com/.../2050531

    但莱昂纳多·穆尔克(Leonardo Muricy)的回答毫无意义(对我来说)。 当我尝试在不删除旧 IP 配置条目的情况下添加新的 IP 配置条目时、我会收到回调错误和一条消息"00006.623 BindNew: Duplicate Bindignored"

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

    我创建了一个低优先级 SWI、而不是尝试更改 CGI 函数中的 IP 地址。

    CGI 会发布 SWI、它仍然会崩溃堆栈。 芯片最终位于 loader_exit(),但控制台输出不同:
    00010.186 llExit:非法调用 llExit()
    网络已删除:if-1:192.168.0.1
    00010.186 llEnter:对 llEnter()的非法重入调用
    网络已添加:if-1:192.168.0.100

    何时可以安全地更改堆栈和 IP 地址?

    编辑:这实际上是一个坏主意。 CGI 函数会被 SWI 中断、因此我实际上没有更改任何内容的时序;横向进度。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我完成了一项低优先级任务、该任务成功设置了新的 IP 地址。 CGI 函数发布此任务的信标、该任务在 CGI 函数之后运行。 IP 地址已更改,但芯片会进入 loader_exit()以响应任何网络活动。 ping 不相关的 IP 地址会将芯片置于 loader_exit()。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我设置按钮、以更改 IP 地址。 这对 HTTP 服务器非常有用。

    这似乎是一个时间问题。 CGI 函数之后会发生一些事情、以确保更改 IP 地址的安全。

    CGI 可以设置一些用于更改 IP 地址的计时器、但这是一项糟糕的工程。 更改 IP 时、必须有一些权威来源告诉我...
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我使用时钟模块创建了半秒延迟。 CGI 函数会调整要启动的时钟、然后 clock 函数会毫无问题地更改 IP 地址。

    这更像是"使它适合"的修复、而不是理解问题的根本原因并创建解决方案。

    为什么在 CGI 函数内更改 IP 时堆栈会崩溃?
    更改 IP 地址之前需要经过多长时间?

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

    很抱歉耽误你的时间。 休假期间处理论坛主题的移交工作进展不顺利。

    这仍然是个问题吗?

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

    您好 Todd、

    是的、我仍然需要帮助。 我有更多的权变措施而不是修复。  这一年中的这段时间、包括我在内、一切都在放慢速度! 这是假期。

    目标是根据用户输入更改 IP 地址。 我选择使用 HTTP 服务器模块通过浏览器界面进行配置。 在芯片的固件上加载 HTML 页面。 Web 浏览器加载页面并使用 HTTP GET 消息响应 HTML 表单。 芯片在一个.CGI 函数中处理消息。 然后、芯片会向浏览器发送另一个 HTML 页面、该页面显示"成功!"。

    问题是在 CGI 函数期间或在 CGI 函数之后立即更改 IP 时堆栈会中断。 我在控制台上看到错误"llExit: illegal call to llExit()(llExit:非法调用 llExit())",并且芯片在 loader_exit()处遇到中断点。 我在其他线程中看到了这个错误来自超过内核优先级的任务、但情况并非如此。

    权变措施是 CGI 函数设置一个0.5秒的计时器。 然后、计时器 ISR 会更改 IP。 我认为、在 RTOS 的上下文中、ISR 在技术上称为 HWI。

    此变通办法看起来很危险、因为我猜测在 HTTP 通信后0.5秒内会发生一些变化、以确保 IP 地址更改的安全。  有一种风险、即在0.5秒后会再次发生相同的情况、以使更改在 ISR 期间变得不安全。

    您能告诉我这是什么以及如何检查它吗?

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

    尊敬的 Peter:

    我只是想让你知道我正在研究这个问题、并将回到明天。

    Steve

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

    尊敬的 Peter:

    我想再次向您介绍最新信息。 我能够再现您看到的问题。 我仍在深入研究、一旦我有更多见解、我将在这里回复。

    Steve

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

    您是否曾遇到过此问题的底部?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Peter:

    供参考...Steve 本周外出。 他将在下周回到办公室时作出回应。

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

    Peter、

    我对没有得到答复表示歉意。 我仍在研究这一点、并将很快报告。 感谢您的耐心等待。

    Steve

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    *
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你是 Steven、过得怎么样?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Peter:

    我必须再次对没有得到答复表示歉意,但我没有忘记这个问题,而且一直在幕后处理这个问题。

    事实证明、这一问题是由于比赛条件造成的、这一情况很难精确定位。

    好消息是、我现在对它处理得非常好、我正在测试一个可能的解决方案。 在我使其工作后、我会将其传递给您、以便您可以在最后尝试

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

    只是想再次更新。 我没有提出解决方案、实际上导致了更多(相关)有关这种比赛条件的问题。

    我仍在进行此过程、并将很快向您更新。

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

    尊敬的 Peter:

    我终于为你准备了一些东西! 请找到解决以下4个问题的随附的 tarball:

     1. ndk-36 netsrv.c 缺少 lleEnter()/llExit()对,套接字清理代码(?)

     2. NDK-225防止在 SockCleanPcb 中释放残余的套接字

     3. NDK-230防止在收到 tcp_RST 时释放挥之不去的套接字

     4. 当 IPv6地址被删除和/或 IPv6被取消初始化时,NDK-232调用 Sock6CleanPcb()

    由于修复了#1、发现了问题2 - 4。 它们都涉及竞争条件、以便在删除 IP 地址(您遇到的问题)或重新引导或关闭堆栈时释放不同线程之间的套接字。

    您应该能够将附件中的"软件包"文件夹拖放到 NDK 安装的软件包文件夹(例如 PC 上的 C:/ti/tirtos_tivac_2_16_00_08/products/ndk_2_25_00_09/packages)上、然后说"是所有人"(请确保备份您的 NDK 安装! 或者、您可能希望先在 NDK 安装副本上尝试此操作)。

    使用附加 的更新 NDK 中的文件后、您将需要重建 NDK 堆栈、然后重建应用程序。

    如果您需要有关此问题的更多帮助或有任何问题、请在此处回复。

    Steve

    e2e.ti.com/.../ndk_5F00_2.25.00.09_5F00_raceConditionFixes.tar.gz

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

    请注意、我将在 NDK 复制文件夹中构建。 复制的文件似乎已编译、但我不知道要将哪个库复制回主堆栈安装。

    NDK 用户指南显示"如果您使用 XGCONF 配置工具在 CCS 中配置 NDK、则相应的 NETCTRL 库是
    根据您启用的模块自动选择"。

    如何分辨 CCS 选择的库? 如何告知 CCS 未重新编译此库(撤消我的更改)?

    wiki 提供了在调试模式下构建的说明。 我是否需要在有调试模式和没有调试模式的情况下构建副本?

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

    我可以在 CCS 工程属性中看到一个设置、用于在 Projects Debug/文件夹中创建 makefile。 此 make 文件中没有对 NDK 文件的引用。

    在控制台输出中、我看到 CCS 为 SYS/BIOS 创建另一个 make 文件"Making ../src/sysbios/sysbios.aem4f ..."。 我 在 CCS 工程属性中看不到该 make 文件的任何设置。 这里也没有对和 NDK 文件的引用。

    我找到了一个调用 packages/ti\ndk\hal\timer_BIOS\lib\hal_dimer_BIOS.aem4f 和 packages/ti\ndk\netctrl\lib\netctrl_ipv4.aem4f 的_linkinfo.xml 文件。 因此、NDK lirabries 是以某种方式指定的。

    什么是让 CCS 制作 SYS/BIOS 库? 如何辨别 CCS 选择了哪些 NDK 库? 它何时会创建 NDK 库?

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

    尊敬的 Peter:

    [引用 user="Peter Borenstein">请谨慎操作,我将在 NDK 复制文件夹中构建。 复制的文件似乎已编译、但我不知道要将哪个库复制回主堆栈安装。

    有很多库可供复制... 使项目指向更新/复制/重建的 NDK 可能更容易。

    或者、您可以通过重命名 NDK 文件夹来"欺骗"您的项目使用更新的版本。

    例如、您现在安装了2个版本的 NDK。 类似如下:

    A. NDK_2.25.00.09

    -原始 NDK 安装

    b. NDK_2.25.00.09_COPY

    -重建/修补的 NDK 安装

    您可以重命名这些文件以进行交换:

    1.将 a 重命名为"NDK_2.25.00.09_orig"

    2.将 b.重命名为"NDK_2.25.00.09"

    (只需确保"b"与"a"位于同一父文件夹中。)

    由于您的项目只是指向"NDK_2.25.00.09"、它现在应该引入更新的库。

    最后、请放心、 通过将 NDK_2.25.00.09重新下载到 TIRTOS 产品文件夹、您可以随时返回到其原始版本。

    [引用 user="Peter Borenstein?]如何判断 CCS 选择了哪个库? 如何告知 CCS 未重新编译此库(撤消我的更改)?

    您的 CCS 工程不会像 SYS/BIOS 库那样重建 NDK 库。

    NDK 库将根据您的*。cfg 设置链接到您的应用。 根据这些设置、它将为您选择合适的库。

    通过查看项目生成的链接器命令文件(*。xdl)、您可以准确地查看链接的 NDK 库。 它位于项目的"Debug"或"Release"文件夹下。 请 参阅此帖子 、获取将向您显示此内容的屏幕截图。

    [引用 user="Peter Borenstein]wiki 提供了在调试模式下构建的说明。 我是否需要在有调试模式和没有调试模式的情况下构建副本?[/quot]

    NDK 附带发布模式库、因此我认为您应该只针对发布模式构建。 唯一需要编译库调试版本的原因是要单步执行实际堆栈代码。 因此、如果您要执行该操作、则应在调试模式下构建它们、并按照 wiki 中的说明关闭优化。

    希望这能为您清除问题、但如果您对此有更多问题、请告诉我。

    Steve

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

    只需重新入住。

    您是否能够尝试上述步骤?

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

    当您宣布新功能时、审阅会议将变得更加顺畅。 对于修复每个人在几个月前忘记的错误、没有给予太多的爱。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Steven、

    您的更改有效! 我能够重新创建问题、编译您的更改、然后问题消失了。 运行 gmake 后、.xdl 文件中指定的一些文件在 Windows 文件资源管理器中更改了其"修改日期"。

    更改 NETGEAR 交换机的静态 IP 也是通过 Web 界面完成的。 我相信你们的修复工作将得到许多人的赞扬。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很棒! 很高兴您终于能够通过这个。

    Steve