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/PROCESSOR-SDK-AM335X:挂钩结构定制

Guru**** 2606725 points
Other Parts Discussed in Thread: SYSBIOS

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/653323/rtos-processor-sdk-am335x-hooks-structure-customization

器件型号:PROCESSOR-SDK-AM335X
Thread 中讨论的其他器件:SYSBIOS

工具/软件:TI-RTOS

如何从 XDC 自动创建"ti_SysBIOS_KNL_Task_hooks__C"中删除它?  我需要提供我的钩子*自有*结构,XDC Sys/BIOS 预编译器正在自行生成此空结构,但无法阻止它的发生。

/* hooks__C */
#pragma DATA_SECTION (ti_sysbios_KNL_Task_hooks__C、".const:ti_hooksBIOS_KNL_Task_hooks__C");
__far__ const CT_ti_sysbios_KNL_Task_ti_sysbios_KNL_Task_0_C0;_0_C} 

我不需要空结构。 我需要提供自己的功能。  如果我定义自己的符号、链接器(正确)会由于"重新定义的符号"而失败。

我尝试对 NDK 进行逆向工程、NDK 设法为该结构提供自己的函数指针。  但 CFG 中的任何内容都不会为用户提供任何控制。

-CSW

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    RTOS 团队已收到通知。 他们将在这里作出回应。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Christopher、

    您可以使用 Task.addHookSet 添加挂钩函数。 例如、您可以将以下内容添加到.cfg 文件中:

    Task.addHookSet(
    createFxn:'&myCreateHook'、
    exitFxn: '我的 ExitHook'、
    deleteFxn:'&myDeleteHook'、
    SwitchFxn:'&mySwitchHook'
    })

    然后在源代码中进行此操作。

    使 mySwitchHook 无效(Task_Handle prev、Task_Handle next)



    void myCreateHook (Task_Handle handle、Error_Block *EB)



    使 myDeleteHook 无效(Task_Handle handle)



    使 myExitHook 无效(Task_Handle handle)



    在上面的"my"函数处设置一个断点、您将看到相应地调用了它们。

    更多详细信息、请参考 SYS/BIOS API 参考中的任务模块(例如、CDOC)。

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

    Todd、

    谢谢、但这并不能解决问题。

    当我查看一个简单的 RTOS 项目时、该结构被定义为空。

    当我查看 NDK 项目时、Debug/configPkg/[ackaghe/cfg/blah_blah_pa8fg.c 文件...  该结构有两个条目。   

    const __t1_ti_sysbios_KNL_Task_hooks ti_sysbios_KNL_Task_hooks__a[2]={
    {
    /******** 
    第一个
    ********* / }、 {/*第二个*/ (((XDC_void (*)(XDC_Int))((XDC_Fxn) ti_SysBIOS_rts_GNU_ReentSupport_taskRegHook___I))、/* registerFxn * (((xdc_void (*)(ti_sysbios_KNL_Task_handle、xdc_runtime_Error_Block*))) 0)、/* createFxn */ (((xdc_void (*)(ti_sysbios_knL_Task_handle))) 0)、/* readyFxn * (((xdc_void (*)(ti_sysbios_knL_Task_handle、ti_sysbios_knL_Task_handle)) 0)、// switchFxn * (((xdc_void (*)(ti_sysbios_KNL_Task_handle))) 0)、// exitFxn * (((xdc_void (*)(ti_sysbios_knL_Task_handle))((xdc_Fxn) ti_sysbios_rts_GNU_ReentSupport_taskDeleteHook__I)))、/* deleteFxn * }, };

    因此、我在 CFG 文件中放入了两个条目:

    task.addHookSet ({
    registerFxn:'&NDK_hookInit'、
    createFxn:'&NDK_hookCreate'、
    exitFxn:'&NDK_hookExit'
    })
    
    Task.addHookSet ({
    registerFxn:'&ti_SYSBIOS_RTS_GND_RETEXING_Support
    
    }'&RTS_RETEXING_RETEXINDIT_RTS_ RETEXING_RETEXT_RTS_支持})
    

    那么 、这些函数 ti_sysBIOS_rts_GNU_ReentSupport_taskRegHook__i 和 ti_sysBIOS_rts_GNU_ReentSupport_taskDeleteHook__i 在哪里?  当  CFG 文件中没有提及时、为什么示例项目知道要将它们输出到 Debug/configPkg/[ackaghe/cfg/blah_blah_pa8fg.c 源文件中?

    这些函数是什么、任何地方都没有有关它们的文档。  很明显,他们有一些事情要做重新进入,但没有解释。

    因为当我包含它们时、我会得到一个链接器错误"未定义引用"。  很棒

    有趣的是、在示例 NDK 项目中、XDC 也被投入到  "Debug/configPkg/[ackaghe/cfg/blah_blah_pa8fg.c 中的"NDK_hookInit()"原型中  、但它没有为"ti_sysBIOS_rts_GNU_ReentSupport_taskDelteteHook_i"添加一个原型

    更重要的是...  发生什么事了?

    什么是"hookset ID" 、如何设置它?  您如何知道您要处理的是哪个"挂钩集 ID"?  NDK 显然是通过 Hookset ID 获取的、因为它需要执行 Task_setHookContext Task_getHookContext。  但是、如何在无需注册创建函数的情况下获得 ID 呢?  它们有多少个、存储在哪里?  每个函数挂钩只允许多个上下文值吗?

    这一切都开始了、因为我要尝试构建并运行 NDK、因此我可以修改它...  它必须有一个挂钩 ID… 它们来自挂钩结构...  这是静态的、无法以编程方式添加...

    这一点没有解释。  我搜索过的任何位置。  我的圣诞假期是如何度过的。

    -CSW

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是否在.cfg 文件中配置* NDK? 如果是、它会自动添加所需的挂钩函数。

    例如*
    VAR NDK = xdc.loadPackage ('ti.ndk.config');
    VAR Global = xdc.useModule('ti.ndk.config.Global');
    (笑声)

    我能够将上面给出的行(myExitHook 等)添加到 GCC 网络示例中、我的挂钩函数出现在生成的文件中。 网络示例使用.cfg 配置 NDK 堆栈。 因此、我最终得到了3个条目。

    让我们先解决这个问题、然后再讨论挂钩集 ID。

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

    Todd、

    感谢您的对话。  您以前曾帮助过我、我对此表示感谢。  在我发帖的时间中、我似乎获得了大约25%的帮助。 这令人沮丧。

    当我花一周时间尝试从代码和拆分内容中反向工程时、也会感到沮丧、因为我找不到一个简单的文档段落、无论我遇到什么困难。

    (这已经持续了一年。  GPIO、USB、以太网等)

    无论如何、我不想将 CFG 文件用于 NDK。  CFG 仅用于基本 RTOS。 原因如下:

    我的任务是修改 NDK 以满足一些定制要求。  NDK 文档从外部讨论 API、查看并几乎完全看作是通过 CFG 文件实现的 API。 但该文档并未解释所有内容。 AM335x 参考手册(SPRU 73)介绍了3PSW 和端口配置、而不是 TCP/IP 堆栈。

    AM335x 手册还指的是 CPSW、未定义它... 但我认为我开始理解它、无论它代表什么。

    为了进行逆向工程、我希望能够进行故障排除和单步执行代码、以查看可以在何处更改代码以直接处理数据流。  当与预编译库链接时、我无法执行该操作。  任何"跳转"函数在 CCS 中都不起作用、在使用"grep "时会使事情速度减慢得令人震惊。

    XGCONF/CFG 实用程序强制它与库链接。  因此我不想使用它、因为它将更改所有包含路径、添加库等... 我只需包含所有源模块。  这意味着我无法使用"loadpackage (NDK)"。  我正在接触 XDC 所做的事情、但没有任何地方对此进行解释。  

    所以、是的、我希望 XDC 生成这些线路、但我正在尝试在 XDC-NDK 周围执行一个结束运行。  在本例中、XDC 被放置在任何地方都没有描述的函数中。 (在本例中为 I_SYSBIOS_RTS_GNU_ReentSupport_taskDeleteHook__I)  这意味着 NDK 需要我不知道什么、也没有记录、并且 XDC 知道需要它、然后将它放入其中。  当我尝试将其放入自己的程序时、链接器无法找到它。  但它位于 Sys/BIOS 库中、因为这些函数不在 XDC 创建的庞大 C 文件中。  它们仅被引用。

    我删除了这些函数的第二个"Task.addHookSet"、并且获得了一个只包含 NDK_InitNDK_Create 等的构建和链接。  但是、如果因功能缺失而无法"重新输入"、它会崩溃吗?  长远来说,会有更多的任务,是否会有任何影响呢?   现在、它会构建、加载和运行、但我甚至看不到基本的 ICMP DHCP 请求。  我不知道它是否与这些重新输入函数相关、或者只是一些设置不当的东西(我仍在尝试学习)。

    我可以并将深入探讨 NDK 内部功能以解决类似问题、例如 DHCPPC 任务的运行方式。  但是、这个 XDC 内容不在 NDK 内部、而是在为 NDK 做一些我找不到或理解的事情。

    我希望这说明了我尝试采取的方法。  我挖掘和挖掘、找不到文档、甚至找不到任何我可以为培训和辅导付费的人。  (Eric Wilbur 告诉我、他不使用 NDK、也不具有 Sitara 器件的相关经验)。

    谢谢。

    -CSW

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

    ti_sysbios_rts_GNU_ReentSupport_taskDeleteHook__i 和 ti_sysbios_rts_GNU_ReentSupport_taskRegHook__i 挂钩函数不是由 NDK 添加的。 内核会根据需要添加这些内容、因此您不应担心这些内容。

    关于 NDK 所需的其他挂钩、您需要通过.cfg 文件中的 Task.addHookSet 添加这些挂钩(即 NDK_hookInit、NDK_hookCreate 和 NDK_hookExit)。

    您是否了解了 NDK 用户指南中的"使用 C 代码(不使用 XGCONF)配置 NDK "部分?

    [引用 user="Christopher Weber"]但由于缺少这些函数、一旦无法"重新输入"、它是否会崩溃?[/quot]

    您能提供有关碰撞的更多详细信息。

    Todd

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

    [引用 user="ToddMullanix"]

    ti_sysbios_rts_GNU_ReentSupport_taskDeleteHook__i和 ti_sysbios_rts_GNU_ReentSupport_taskRegHook__i挂钩函数不是由 NDK 添加的。 内核会根据需要添加这些内容、因此您不应担心这些内容。

    [/报价]

    是的、我认为它是由 XDC 添加的...  它是如何决定的?  为什么它会做出决定?  如果我在 XGCONF 周围执行"结束运行"、那么它可能不知道是否需要它。

    [引用 user="ToddMullanix"]

    关于 NDK 所需的其他挂钩、您需要通过.cfg 文件中的 Task.addHookSet 添加这些挂钩(即 NDK_hookInit、NDK_hookCreate 和 NDK_hookExit)。

    [/报价]

    好的。  它会构建、现在不会崩溃。

    [引用 user="ToddMullanix"]

    您是否了解了 NDK 用户指南中的"使用 C 代码(不使用 XGCONF)配置 NDK "部分?

    [/报价]

    我有"Developers Kit Users Guide" spru523、第3.2节、并将其用作模型。  但从一开始就缺乏这种技术。  第3.2.1节:"必须 创建挂钩模块以调用 OS 挂钩函数 NDK_hookInit()和 NDK_hookCreate()。"  我不知道怎么做...  没有任何信息告诉用户如何执行该操作。  从而导致此帖子。

    但是、显然、正如您所解释的那样、它确实需要 XGCONF 来安装挂钩。  因此、标题误导了我、我仍然需要在 CFG 文件中执行一些操作。

    此外 、诸如 CfgAddEntry 函数之类的东西不会定义如何使用它。 有一组#define CFGITEM_IP_xxx 常量,但没有使用它们的规格(一些导通函数、一些导通结构……)

    和...  显然 CI_SERVICE_DHCPPC 结构中的接口编号开始在0x01...处计数  也没有对此进行解释。  什么 C 索引计数系统以1而不是0开始??

    [引用 user="ToddMullanix"]

    Christopher Weber
    但是、如果因功能缺失而无法"重新输入"、它会崩溃吗?

    Todd

    [/报价]

    这是一个问题: 这些"可重入"函数没有设置什么、它会在稍后崩溃吗?

    现在它没有崩溃。  我已系统地更正了我自己的错误和拼写错误、MMU、获取任务上下文值、hookset ID 等...  现在是挂钩函数。  现在、它还没有工作、但也没有崩溃。  可以是配置设置、也可以是其他设置。

    回到"hookset"内容、您说我们可以在后面介绍... 我似乎确定它与 fdOpenSession API 相关...   这是我不清楚的另一个组件。

    到目前为止、谢谢。。

    -CSW

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

    首先、您能否确认 GNU 可重入挂钩是否存在、而无需添加它们。 除非存在某些情况(例如、禁用任务处理、零大小堆、您在.cfg 文件中显式禁用可重入性)、否则应自动添加它们。 如果它们不是自动添加的、请告诉我您正在使用哪个版本的 SYS/BIOS、XDCtools、NDK 和编译器。

    其次、UG 部分中的"使用 C 代码配置 NDK (不使用 XGCONF)"部分意味着您没有使用 NDK 的 XDC 配置功能。 您仍然需要.cfg 文件、因为您使用的是 TI-RTOS。 我同意这一点可以进一步澄清。

    第三、我不遵循您的逻辑、不想使用 NDK 中的配置选项。 如果没有它、您仍在使用 NDK 库(我假设您没有将所有 NDK 源拉入您的应用)。

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

    Todd、它的顺序相反。、因为似乎有一个断开连接。。。

    [引用 user="ToddMullanix"]
    第三、我不遵循您的逻辑、不想使用 NDK 中的配置选项。 如果没有它、您仍在使用 NDK 库(我假设您没有将所有 NDK 源拉入您的应用)。
    [/报价]

    实际上、我正是这样做的。 我将几乎整个 NDK 树拉到了我的项目中。 单独的副本、未链接。 最后、我需要在最低级别进行一些自定义。 我不想在自定义设置的基础上重建整个 TCP/IP 堆栈。 因此、我将尝试了解我可以在哪里修改这个。

    它的内部信息根本没有记录在任何地方。 那么、我要读取源代码、然后使用调试器步进...

    [引用 user="ToddMullanix"]
    首先、您能否确认 GNU 可重入挂钩是否存在、而无需添加它们。 除非存在某些情况(例如、禁用任务处理、零大小堆、您在.cfg 文件中显式禁用可重入性)、否则应自动添加它们。 如果它们不是自动添加的、请告诉我您正在使用哪个版本的 SYS/BIOS、XDCtools、NDK 和编译器。
    [/报价]

    我不知道如何确认它们、只是我在一个简单的"示例"中看到了它们、工程源文件由 XDC 在重建 Sys/BIOS 时自动生成。

    我看不出这是什么 GNU 问题、因为 XDC 生成了源文件。

    我比较的两个项目:

    • Sitara PDK 中名为 NIMU_BasicExample_bbbAM335x_armExampleproject 的"示例"。 未进行更改。 这在 XDC 生成的文件中有可重入挂钩。
    • 我自己的基本项目、使用 CCS 7.2"新建项目"选项构建、作为"典型" Sys/BIOS。 然后、我将 NDK 源导入到中。 然后、当您指示它如何工作时、我手动添加了"NDK"挂钩。 并且不存在可重入的挂钩... 如果我添加它们、它们是未定义的。

    两者都使用 Sys/BIOS 6.46.5.55、XDC 3.2.1.22和 NDK 2.25.01.11。 (我的工程未指定 NDK、它具有来自同一文件夹树的源代码)

    添加了可重入函数的"示例"与我在 NDK 源树中提取的项目之间的区别:

    • "示例"使用的是 GNU 4.9.3.
    • 我在 NDK 源代码中提取的项目使用 TI 编译器17.9.0

    我之所以使用 TI、是因为我所在雇主的团队使用 TI 编译器。

    我还看到"示例"项目在其属性设置中使用 EDMA 和 PDK。。。 我不知道他们带来了什么... 也许是因为"示例"项目也使用 UART 和 I2C??

    [引用 user="ToddMullanix"]
    其次、UG 部分中的"使用 C 代码配置 NDK (不使用 XGCONF)"部分意味着您没有使用 NDK 的 XDC 配置功能。 由于您使用的是 RTOS、因此您仍然需要.cfg 文件。 我同意这一点可以进一步澄清。
    [/报价]

    是的、您需要向 CFG 文件中添加挂钩的说明。

    修改 CFG 文件会使我感到害怕、因为 GUI (XGCONF)可能会覆盖我更改的任何内容。

    嗯、我的项目具有被拉入 NDK 源代码、它符合要求并且运行时没有错误、但似乎没有发送数据包、或者似乎没有接收数据包... 它可能是这样

    • 有关启动挂钩中缺少"可重入"调用的内容。 (因为我不知道它们有多重要)
    • 在任务优先级中未正确设置的内容。
    • 谁知道……?

    我正在进行步进和调试、以了解我可以学到的内容。

    -CSW

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

    如果您要将所有 NDK 源纳入项目中、则您可以自行完成。 我们根本没有资源来帮助解决这一问题。

    您无需以图形方式编辑.cfg。 您可以将其作为文本文件进行编辑(右键单击->使用->文本编辑器打开或使用您喜爱的编辑器)。

    关于缺少 GNU 可重入挂钩的问题...只有在使用 GNU (GCC)编译器时才会出现这些挂钩。 由于您使用 TI 编译器构建了该示例、因此不需要这些函数。

    Todd
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Todd、
    是的、我知道我自己也是这样做的。 我不想寻求这种帮助。
    这就是应该如何安装 NDK 挂钩或这些可重入函数等东西。 现在可以解决这个问题。

    或者、该挂钩集 ID 的结构设计是什么... 我不了解(但也不妨碍我继续推进我正在做的工作)。

    我可以发表其他问题。 但是、我要问的问题会非常具体。 可能是关于中断、缓冲器、寄存器等...

    谢谢。
    -CSW