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/TM4C129ENCPDT:GatewayMutex_con构 和 BIOS.runtimeCreatesEnabled

Guru**** 2478765 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/687426/rtos-tm4c129encpdt-gatewaymutex_construct-and-bios-runtimecreatesenabled

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

工具/软件:TI-RTOS

我更喜欢避免在嵌入式系统中使用动态分配。  要在我的 xxx.cfg 文件中强制执行此操作、我必须执行以下操作:

VAR BIOS = xdc.useModule('ti.sysbios.BIOS');

BIOS.runtimeCreatesEnabled = false;

在我的应用程序代码中、我有静态分配的结构、例如:

静态结构{
  bool 已初始化;
  GateMutex_Structgate;
} Crc32State ={ false };

在应用程序启动期间、我在以下结构上调用 XXX_constructure:

如果(!Crc32State.initialized){
 GateMutex_construction (&Crc32State.gate、NULL);
 Crc32State.initialized = true;

*请注意,我也尝试过这种方法,其中传递了静态分配的 GateMutex_Params 而不是 NULL,但它没有产生什么不同。

对 GateMutex_con构 的调用失败并报告错误:

TI.SYSBIOS.Gates.GateMutex:创建策略错误
xdc.runtime.Error.raise:终止执行

如果我按照回调堆栈操作、我会在自动生成的文件 Gateway_pem4f.c 中找到此代码:

/*构造*/
void ti_sysbios_gates_GateMutex_construct(ti_sysbios_gates_GateMutex_Struct*__obj,const ti_sysbios_gates_GateMutex_Params *__paramsPtr )

XDC_runtime Error_raiseX (NULL、ti_sysbios_gates_GateMutex_Module_id__C、NULL、0、XDC_runtime Error_E_E_generic、 (XDC_IArg"创建策略错误"、0);

似乎我配置了一些项目选项错误。  XXX_contrauct 方法的要点不是不需要动态分配?

感谢你的帮助。

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

    是的、断言不应存在。 您正在使用哪个版本的 TI-RTOS (或 SYS/BIOS)? 您是否有展示此行为的示例项目? 我刚刚尝试过它(在用于 TivaC 2.16.01..14的 TI-RTOS 上)、但我没有得到断言。

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

    这是否得到了解决?

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

    很抱歉、您回来的速度很慢。  我还有其他工作要做。  但是、今天我整理了一个项目、展示了问题。

    我将 TI-RTOS 用于 TivaC 2.16.0.08

    e2e.ti.com/.../5775.Sample.zip

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

    在最初发布中、GateMutex_constructcall 出现问题。  示例应用程序会触发相同的基本问题、但它正在使用 Mailbox_con构 调用。  下面的屏幕截图显示了调试器中的问题。

    感谢你的帮助。

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

    感谢大家的观看。 我已经注意到了这一点。 我将编写一个更完整的答案、我将在今天稍后发布、其中涵盖两个模块行为的原因。

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

    感谢您的示例。 看了之后、我意识到在尝试复制时出错了。 我现在可以了。

    TI-RTOS 中的每个模块(实际上是 SYS/BIOS 和 XDCtools)都有一种方法来描述其.xDC 文件中模块的某些方面。 我不会详细介绍、但简短的故事是、如果模块的.xDC 文件中包含@InstanceInitStatic、则可以在 BIOS.runtimeCreatesEnabled = false 时调用构造;(更具体地说、如果模块的创建策略是静态的)。 邮箱和 GateMutex 在其.xDC 文件中都没有@InstanceInitStatic (因此生成的代码中存在错误)。

    那么、为什么要为模块保留@InstanceInitStatic 呢? 如果该结构将分配内存、则不应调用它。 观察 Mailbox 和 GateMutex、该结构不需要内存分配。 我们实际上已经在较新版本的 Mailbox.XDC 中添加了 μ@InstanceInitStatic。 我们还应将其添加到 GateMutex 中(并应重新评估所有模块)。

    适合您的选项:
    1.设置 BIOS.runtimeCreatesEnabled = true;
    2.在.cfg 文件中静态创建邮箱和 GateMutex 实例。
    修改产品代码、将@InstanceInitStatic 添加到 Mailbox.XDC 和 GateMutex.XDC 文件中、并从命令行重新构建产品(TI-RTOS 用户指南中的说明)。 查看 Task.XDC 以查看@InstanceInitStatic Addition 的示例。

    供参考:如 有兴趣、请访问:rtsc.eclipse.org/.../XDCspec_-_@InstanceInitStatic。

    Todd
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢 Todd、我已经发现"BIOS.runtimeCreatesEnabled = true;"将允许我的代码运行、但我想按照它的结论来确保我在后台不会出现问题。