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.

[参考译文] TMS320F280039C:CLA 后台或子内联函数中不允许 EALLOW/EDIS?

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1054200/tms320f280039c-eallow-edis-not-allowed-in-cla-background-or-a-sub-inline-function

器件型号:TMS320F280039C
主题中讨论的其他器件:C2000WARE

尊敬的香榭丽舍

我要向我们的客户询问这一点吗?

用户使用 CLA 任务8作为后台任务。

我们发现、只要使用 EALLOW/EDIS、这种简单的语句就不能用于后台任务。

1.以下代码  

#pragma INTERRUPT (Cla1Task8_background、"background")
中断空 Cla1Task8_background()

EALLOW;
GpioCtrlRegs.GPAMUX1.bit.GPIO0=0;
GpioCtrlRegs.GPAMUX1.bit.GPIO1=0;
EDIS;

.

2.后台任务中调用的子内联函数中的以下代码。

#pragma INTERRUPT (Cla1Task8_background、"background")

中断空 Cla1Task8_background()

CONFIG_PWM_TO_GPIO ();

.

#pragma FUNC_ALWAYS_INLINE (CONFIG_PWM_TO_GPIO)
静态内联 void CONFIG_PWM_TO_GPIO()

EALLOW;
GpioCtrlRegs.GPAMUX1.bit.GPIO0=0;
GpioCtrlRegs.GPAMUX1.bit.GPIO1=0;
EDIS;
// GPIO_setPinConfig (GPIO_0_GPIO0);这是不允许的、因为内部使用了 EALLOW/EDIS。

编译器错误为:

错误#99923:CLA 不允许在后台任务中进行函数调用。 尝试内联函数。

CLA 后台任务中是否不允许 EALLOW/EDIS?

如果是、用户如何在  CLA 后台任务中修改受 EALLOW 保护的这些寄存器?

黄维恩

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

    您好、Wayne、

    对于 CLA 源代码、您必须使用 MEALLOW 和 MEDIS、而不是 EALLOW 和 EDIS。
    请参阅 TRM (spruiw9)第7.6.3章(第835/836页)。

    此致、

    1月

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

    您好、Jan、

    在 C2000Ware 头文件中、EALLOW 和 EDIS 宏会根据 CPU 类型进行适当映射、因此这不是问题所在。

    下面是代码片段:

    //
    //定义允许写入受保护的寄存器
    //
    #ifndef EALLOW
    #ifndef __TMS320C28XX_CLA__
    #define EALLOW __EALLOW ()
    其他
    #define EALLOW __meallow()
    #endif //__TMS320C28XX_CLA__
    #endif // EALLOW

    谢谢、

    Ashwini

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

    您好、Wayne、

    EALLOW 和 EDIS 被映射到 CLA 编译器内在函数、这些内在函数看起来是函数调用、因此您会看到错误。 让我询问编译器团队、是否有某种方法可以在后台任务中使用这些工具。

    谢谢、

    Ashwini

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

    您好、Wayne、

    编译器团队和我都尝试过、我们无法重现此问题-编译工作正常、只能用于后台任务和内联函数。 您能告诉我正在使用的编译器版本和编译器优化选项吗?

    谢谢、
    Ashwini

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

    尊敬的 Ashwini:

    我在下面用于重现用户的行为。

    CCS 11.0

    C2000ware V4

    编译器 V21.6.0.LTS

    -opt_level 1

    -opt_for_speed 3.

    我还向您发送了一个项目来重现此问题。

    如果您对重现此问题还有任何疑问、请告诉我。

    黄维恩

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

    尊敬的 Ashwini:

    我们尝试使用__meallow()来替换 EALLOW 和使用__mdies()来替换 EDIS,它现在适用于上述两种用法。

    因此、剩下的问题是:

    1) 1)您说过如下。 为什么不起作用?

     //
    //定义允许写入受保护的寄存器
    //
    #ifndef EALLOW
    #ifndef __TMS320C28XX_CLA__
    #define EALLOW __EALLOW ()
    其他
    #define EALLOW __meallow()
    #endif //__TMS320C28XX_CLA__
    #endif // EALLOW

    2) 2)如果我们使用诸如 GPIO_setPinConfig (GPIO_14_GPIO14)之类的 driverlib;它内部有 EALLOW/EDIS、它在 CLA 端工作吗?

    (现在、我的侧不起作用。)

    黄维恩

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

    您好、Wayne、

    非常感谢您共享代码。 我要看一下。

    关于 GPIO_setPinConfig (GPIO_14_GPIO14)、这应该也适用于 CLA 端、查看您发送的项目可能会提供一些线索、说明它为什么不适合您。

    我最多会在一天或两天内回来。

    谢谢、

    Ashwini

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

    您好、Ashwini、

    如果你使用 CLA、你必须考虑除 CPU 之外的其他规则。 因此、替代 MEALLOW 和 MEDIS 溶解是没有意义的。
    除了简化之外、一切都是不必要的复杂。 这显然证明了韦恩的问题。
    使用 CLA 命令集也有什么困难?

    此致、Jan

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

    您好、Jan、

    发送的应用程序 Wayne 包含位字段头文件 f28003x_device.h、与 driverlib 头文件不同、该文件仅将定义映射到 C28 instrincs __EALLOW ()和__EDIS ()。 因此、为 CLA 编译的 driverlib 源代码不起作用、因为 C28定义正在被挑选。

    此修复程序将更新 f28003x_device.h 例如、对于 EALLOW、更新定义

    从(电流):

    #define EALLOW __EALLOW ()

     至:

    #ifndef EALLOW
    #ifndef __TMS320C28XX_CLA__
    #define EALLOW __EALLOW ()
    其他
    #define EALLOW __meallow()
    #endif //__TMS320C28XX_CLA__
    #endif // EALLOW

    软件团队已收到此问题的通知。

    谢谢、

    Ashwini

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

    您好 Ashwini、

    我不是这个替换产品的朋友。
    我希望 MEALLOW/MEDIS 出现在我的 CLA 代码中、而不是 EALLOW/EDIS (它们是 CPU 指令)。

    此致、
    1月

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

    您好!

    关于在  CLA 上使用 GPIO_setPinConfig、我想补充一点:

    CLA 无法访问 GPIO 控制寄存器。 CLA 只能访问 GPIO 数据寄存器。

    GPIO_setPinConfig 在.c 文件中定义、因此它使用 C28x 指令。 您可以在 CLA 代码中使用.h 文件中定义的内联函数。

    此致、

    Veena

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

    您好、Jan、

    EALLOW 和 EDIS 是 C 代码中的宏名称、CLA 和 C28都可以调用这些名称。 宏名称反映了最初为 C28编写的代码的 C28名称。 宏将根据  CLA 代码是调用 C 代码(在这种情况下、_ TMS320C28XX_CLA__由编译器定义)还是 C28代码来映射到 CLA 或 C28指令。

    谢谢、

    Ashwini

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

    您好、Wayne、

    已向软件团队提交问题以修复位字段头文件。

    目前、您可以 使用 driverlib 文件中的 EALLOW 和 EDIS 定义更新位字段头文件 f28003x_device.h。

    谢谢、

    Ashwini