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.
工具/软件: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 中断、因此我实际上没有更改任何内容的时序;横向进度。
我使用时钟模块创建了半秒延迟。 CGI 函数会调整要启动的时钟、然后 clock 函数会毫无问题地更改 IP 地址。
这更像是"使它适合"的修复、而不是理解问题的根本原因并创建解决方案。
为什么在 CGI 函数内更改 IP 时堆栈会崩溃?
更改 IP 地址之前需要经过多长时间?
您好 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
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
Steven、
您的更改有效! 我能够重新创建问题、编译您的更改、然后问题消失了。 运行 gmake 后、.xdl 文件中指定的一些文件在 Windows 文件资源管理器中更改了其"修改日期"。
更改 NETGEAR 交换机的静态 IP 也是通过 Web 界面完成的。 我相信你们的修复工作将得到许多人的赞扬。