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:在闪存中运行时、将 const float 分配给 const float 时出现故障

Guru**** 2587365 points
Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1233837/tms320f28388d-bug-with-assigning-const-float-to-const-float-when-running-in-flash

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

大家好、

我需要有关下面查询的帮助。

客户 在刷写 CPU1时发现一个奇怪的问题。  

下面是一段代码:

static float offset = 30.0f;

static const Radians steps[6] = {
    from_degrees(offset + 0.f),   
    from_degrees(offset + 60.f),
    from_degrees(offset + 120.f), 
    from_degrees(offset + 180.f),
    from_degrees(offset + 240.f), 
    from_degrees(offset + 300.f),
};

static const Radians table[8] = {
    /* 0 0 0 */ -1,
    /* 0 0 1 */ steps[1],  // II
    /* 0 1 0 */ steps[3],  // IV
    /* 0 1 1 */ steps[2],  // III
    /* 1 0 0 */ steps[5],  // VI
    /* 1 0 1 */ steps[0],  // I
    /* 1 1 0 */ steps[4],  // V
    /* 1 1 1 */ -1,
};

在调试时、他们看到该表没有正确的值:

在 CPU1.map 中 可以看到该表存储在.const 中、但步骤位于 BSS 中:

00090c1c  00000010  HALL.obj (.const:table$9)

.bss   0  0000b800  000006e9  未初始化
         0000b800  000003e6  system.obj (.bss)
         0000bbe6  0000000c  hall.obj (.bss:Steps$9)

在 RAM.cmd 中、const 被定义为.const:> RAMGS3 | RAMGS4 | RAMGS5、但在 flash.cmd 中它不存在

静态内联浮点 from_degates (float deges){
返回度数* M_PI / 180.0f;
}

这可能是一个错误吗?

提前感谢您。

此致、

Marvin 酒店

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

    您好、Marvin、

    客户是否启用了任何类型的优化? 他们在"项目属性"中配置了什么--fpu-support 选项?

    此致、

    Omer Amir

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

    您好、Omer:

    感谢你等待。 以下是详细信息:

    "c:cpp"/ti/ccs1220/ccs/tools/compiler/ti-cgt-c2000_22.6.0.LTS/bin/cl2000 -v28 -ml -mt --cla_support=cla2 - float_support=fpu64 --idiv_support=idiv0 --tmu_support=tmu0 /motion/cpu1/CPU1/device --vcu_support=vcrc -O4 /motion/cpu1/CPU1/src --fp_mode=relaxed /ti/C2000Ware_4_03_00_00/libraries/calibration/hrpwm/f2838x/include --include_path="D:/motion/cpu1/CPU1 /ti/c2000/C2000Ware_4_03_00_00/driverlib/f2838x/driverlib /motion/cpu1/shared /ti/c2000/C2000Ware_4_03_00_00/libraries/calibration/hrpwm/f2838x/include /ti/c2000/C2000Ware_4_03_00_00/device_support/f2838x/common/include /ti/ccs1220/ccs/tools/compiler/ti-cgt-c2000_22.6.0.LTS/include   

    如果您需要更多信息、请告诉我

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

    您好、Marvin、

    -O4 [/报价]

    告诉客户将优化恢复为关闭状态并重新运行代码、 优化设置可能已优化掉 在 CCS 调试中设置/查看变量的方式。

    此致、

    Omer Amir

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

    老实说,我不知道为什么这个甚至编译,但...

    可能是在运行时( cinit())计算"teps"而不是预期的编译时间,因为它引用了函数,因此被分配给 RAM。 换句话说、它不能在编译时计算。 请记住、"inline"是请求、并非保证、并不意味着编译器将在编译时运行函数以确定初始化值。

    另一方面、可以在编译时计算"table"的初始化值、从而使其保持恒定并保存在闪存中。 然而、阶跃的值在编译时为零、所以你从元素0中得到零。

    Unknown 说:
    static inline float from_degrees(float degrees){
    返回度数* M_PI / 180.0f;
    }

    我认为类似函数的宏可以解决这个问题、因为步骤可以在编译时计算。:

    #define from_degrees( degrees ) ( (degrees) * M_PI / 180.f )
    
    #define OFFSET 30.f
    
    static const Radians steps[6] = {
        from_degrees(OFFSET + 0.f),   
        from_degrees(OFFSET + 60.f),
        from_degrees(OFFSET + 120.f), 
        from_degrees(OFFSET + 180.f),
        from_degrees(OFFSET + 240.f), 
        from_degrees(OFFSET + 300.f),
    };