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.

[参考译文] TMS320F28388D:F28388DPTPS:可能的编译器限制

Guru**** 2589265 points
Other Parts Discussed in Thread: SYSCONFIG, C2000WARE, TMS320F28388D

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1231348/tms320f28388d-f28388dptps-possible-compiler-restriction

器件型号:TMS320F28388D
主题中讨论的其他器件:SysConfigC2000WARE

您好、专家!

我是代表客户发布此帖子。 它在下面。

我尝试在 CLA 上读取 ADC 值、然后求平均值、然后通过共享 CLA/CPU 变量将平均值传递给 CPU。 我将稍后分享我如何在.c、.cla 和 shared.h 中声明变量。

但首先、我遇到的编译问题是、当我尝试对新的 ADC 值求平均值时

tempDouble = HWREGH (ADCCRESULT_BASE + 0x0U + lastRRPointer_s);
tempDoble =(0.1 * tempDouble)+(C28CLA_secondary.ac target="_blank">secondary.AC2DCMON  * 0.9);
C28CLA_secondary.AC2DCMON = tempDouble;

给出编译错误:错误#99923:"../CLA1.CLA"、第352行:CLA 不允许在后台任务中进行函数调用。 尝试内联函数。

编译错误声称发生在第352行(HWREGH 宏的第一行代码)上 顺便说一下-该错误仅在最后一行存在时出现-如果它只是前2行代码、则不存在编译错误

以下是我的可变声明代码、以防它们有用;

main.c 是;

#ifdef _cplusplus
#pragma DATA_SECTION ("CLADataLS0")
#else
#pragma DATA_SECTION (C28CLA_secondary、"CLADataLS0")
#endif //__ cplusplus
struct C28CLA_secondary_struct C28CLA_secondary;//从 CLA 发出的辅助信号。 由于这些信号的速度特性不是高速的、它们被组合在一起为"次要"信号。 此组表示以发射环路速度以更新的信号。

shared.h 是;

结构 C28CLA_secondary_struct{
Volatile Double AC1DCMON;
Volatile Double AC2DCMON;
}extern C28CLA_secondary;

嗯、实际上.CLA 中没有任何内容(因为它在.h 中声明了。 我希望这是正确的 LOL)

我没有使用函数调用。

 

我使用 TI 的函数宏来访问硬件寄存器。 不过–即使我删除了用于访问硬件寄存器的宏函数调用、并将该代码替换为硬编码值、仍然会得到相同的编译错误。

 

原始代码行;(HWREGH 是一个宏函数)

C28CLA_secondary.AC1DCMON  =(0.9 * C28CLA_secondary.AC1DCMON)+(0.1 *  HWREGH (ADCCRESULT_BASE + 0x0U + lastRRPointer_s));

 

删除了宏函数的代码、但仍然出现编译错误

C28CLA_secondary.AC1DCMON  =(0.9 * C28CLA_secondary.AC1DCMON)+(0.1 * 123);

提前感谢您!

此致、

乔纳森

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

    您好!

    我已将此主题提请编译器专家注意。 请注意,由于当地假期,您可能要到明天才会收到回复。

    谢谢

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

    请将事情置于发生的状态...

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

    对于文件 CLA1.CLA、 请按照 如何提交编译器测试用例一文中的说明进行操作

    谢谢。此致、

    -乔治

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

    您好、George、

    感谢你的帮助。 我已根据"如何提交编译器测试用例"生成并附上 PP 文件。 我还简化了代码、以帮助集中我们的故障排除工作。 我还将包含这些文件。  

    这些文件大多是空的。 下面是我声明变量的方式;

    MAIN_CPU1.c 中的全局声明

    #pragma DATA_SECTION(C28CLA_secondary,"CLADataLS0")
    struct C28CLA_secondary_struct C28CLA_secondary;

    CPU1_CLA1_shared.h 中 C28与 CLA 之间共享头文件中结构体的定义

    struct C28CLA_secondary_struct {
    volatile double AC1DCMON;
    volatile double AC2DCMON;
    } extern C28CLA_secondary;

    CLA1.CLA 中 BG 任务内的单行代码发生编译错误

    __attribute__((interrupt("background"))) void Cla1BackgroundTask ( void )
    {
        C28CLA_secondary.AC2DCMON = (0.9 * C28CLA_secondary.AC2DCMON);
    }

    此项目基于 CLA BG 任务示例项目。 如果您需要更多信息(例如 SysConfig 等)、请告诉我。 我希望此记录对您有所帮助。

    我在上传.pp 文件时遇到问题。 我可能会发布此帖子、然后尝试将.pp 文件附加到对此帖子的回复中。 抱歉、

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

    这是.pp 文件。  出于某些原因、我不得不将文件类型更改为".c"才能上传它们、但我承诺它们实际上是".pp"文件!

    e2e.ti.com/.../CLA1.ce2e.ti.com/.../6457.main_5F00_CPU1.c

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

    我还想提一下、你可以将变量类型从结构体更改为更简单的东西、例如 uint16_t 或 uint32_t、就会得到相同的结果。

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

    感谢您提供测试用例。  不幸的是,我不能复制...

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

    请提供编译器的版本、以及所有构建选项、与编译器看到的完全相同。  复制并粘贴文本、而不使用屏幕截图。

    您是否确定发送了正确的代码?  我搜索文件...

    Unknown 说:
    tempDouble = HWREGH (ADCCRESULT_BASE + 0x0U + lastRRPointer_s);
    tempDoble =(0.1 * tempDouble)+(C28CLA_secondary.ac target="_blank">secondary.AC2DCMON  * 0.9);
    C28CLA_secondary.AC2DCMON = tempDouble;

    我没有看到这个。

    谢谢。此致、

    -乔治

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

    您好、George、

    您可以关闭我的回复帖子而不是原始帖子吗? 在回复帖子中、我花时间对其进行了很好的格式化、并整理了代码、以便于您使用!

    我删除了项目中每一行不相关的代码、因此只有共享变量声明、SysConfig 生成代码、以及 BG 任务内提供编译器错误的单赋值语句。

    编译器版本:

    C2000 TI V22.6.0.LTS

    构建选项:


    ****项目 SHV_Controller_Base 的配置 CPU1_FLASH 构建****

    "C:\\ti\\ccs1230\\ccs\\utils\\bin\\gmake"-k -j 16 all -O

    生成文件:"../CLA1.CLA"
    调用:C2000编译器
    "c:/ti/ccs1230/ccs/tools/compiler/ti-cgt-c2000_22.6.0.LTS/bin/cl2000 /ti/C2000Ware_4_03_00_00 /Users/bschiller/TI /ti/ccs1230/ccs/tools/compiler/ti-cgt-c2000_22.6.0.LTS/include /Users/bschiller/TI -v28 -ml -mt --cla_support=cla2 - float_support=fpu64 --idiv_support=idiv0 --tmu_support=tmu0 --vcu_support=vcrc -O0 --include_path="C:/Users/bschiller/TI /ti/C2000Ware_4_03_00_00/driverlib/f2838x/driverlib
    "../CLA1.CLA"第134行:建议#30012:(性能)优化期间未消除双精度浮点乘法运算。 使用低效回退;考虑修改代码、使其不需要进行此操作。
    错误#99923:"../CLA1.CLA"第134行:CLA 不允许在后台任务中进行函数调用。 尝试内联函数。


    >>编译失败
    subdir_rules.mk:9:目标"cla1.obj"的配方失败
    gmake:***[cla1.obj]错误1
    gmake:由于错误、未重制目标"all"。

    ****构建完成****

    希望这 对您有所帮助!

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

    我现在明白了这个问题。  后台任务无法调用任何函数。  那么一个表达式是什么样子的...

    C28CLA_secondary.AC2DCMON = (0.9 * C28CLA_secondary.AC2DCMON);

    它没有显式函数调用。  但是、不能使用 CLA 上的指令计算双精度乘法。  因此、它是通过从编译器 RTS 库调用函数来计算该函数来实现的。  这种隐式函数调用是导致...

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

    ... 很大的影响。  在这种情况下、内联不是解决方案。  您必须以某种方式更改代码、因此不需要双精度运算。  有点像……

    float_variable1 = 0.9f * float_variable2;

    ... 没关系。  注意 F 常量上的后缀 0.9f

    很遗憾、我无法给出有关如何更改代码的具体建议。  我不太明白。

    谢谢。此致、

    -乔治

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

    谢谢你,乔治!

    考虑到我的 TMS320F28388D 上 C28和 CLA 之间的硬件差异、这是合理的-但是、如果使用的双精度变量是局部变量还是在 C28/CLA 之间共享、你能帮助我理解为什么这很重要吗? (或许、如果我更好地理解这里的区别、我就可以找出一个解决办法)

    例如、如果我使用在 BGTSK 内声明的双精度变量、那么我可以编译;

    double_local_variable1 = 0.9f * double_local_variable2;

    但是、如果我使用 共享的双精度变量(就像我之前共享的变量-在 main 和 extern 至 CLA 中声明的变量)、那么编译器会使用非内联函数调用?

    感谢您的帮助-我还不准备放弃双精度,除非我也有!

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

    我不知道,但我怀疑当你...

    使用在 BGTSK 内声明的双精度变量、然后我可以编译;

    double_local_variable1 = 0.9f * double_local_variable2;

    [/报价]

    ... 这些代码被优化掉。  无需优化即可生成、也可以将这些变量 易失性 我怀疑...

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

    ... 发生。

    谢谢。此致、

    -乔治

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

    乔治,你是正确的,再次! -它被优化出来,这就是为什么它没有给出误差。

    好的,最后一个问题,我发誓!

    我已经准备好使用浮点值而不是双精度值-但 我在使用浮点值时仍会遇到相同的错误(99923)。  我还缺少什么吗?

    我使用的是 TMS320f28388D。 这是我后台任务中的代码-项目的其余部分与我之前共享的内容相同。 为"test = 1.1 * test;"行指定了错误(99923)。

        volatile float test = 0;
        test  = 1.1 * test;

    感谢您帮助我们了解所发生的情况、

    布伦特

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

    常量的默认类型如 1.1 双精度 。  如果表达式的一部分是 双精度 ,它会使整个表达式计算为 双精度 。  将常量的类型更改为 浮点 ,添加 F 后缀并写它 1.1f

    谢谢。此致、

    -乔治

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

    好吧-这是你最后一次让我看起来愚蠢! (至少在这个主题中!)

    感谢您的帮助、George。

    谢谢、  

    布伦特