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.

[参考译文] C2000-CGT:使用新的 CGT 8.5.0.LTS 编译 SYS/BIOS 6.83.0 时出现构建错误

Guru**** 2487165 points
Other Parts Discussed in Thread: TMS320C6678, SYSBIOS

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1554959/c6000-cgt-there-is-a-build-error-when-compiling-sys-bios-6-83-0-with-new-cgt-8-5-0-lts

器件型号:C6000-CGT
Thread 中讨论的其他器件:TMS320C6678SYSBIOS

工具/软件:

当我构建包含具有新 CGT 8.5.0.LTS 的 SYS/BIOS 的工程时、会收到错误:

“c:/TI/bios_6_83_00_18/packages/ti/posix/ccs/time.h “、第 103 行:错误#102:“timespec"已“已在当前范围内声明
“C:/TI/bios_6_83_00_18/packages/ti/posix/ccs/time.h “、第 108 行:错误#102:“itimerspec “已在当前范围内声明

在编译“C:/TI/bios_6_83_00_18/packages/ti/posix/tirtos/clock.c “时检测到 2 个错误

使用较旧的 CGT 8.3.13 时、所有工作正常。

我使用:

CCS 12.8-1、SYS/BIOS 6.83.0.18。

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

    您好:

    您使用哪种器件?

    谢谢

    Ki

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

    C6678

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

    谢谢你。 我将提请器件专家注意本主题。

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

    尊敬的 Valentin:

    这是 TMS320C6678 还是其他器件型号?

    此致、

    Takuma

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

    尊敬的 Takuma:

    也正是 TMS320C6678 的优选软件

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

    尊敬的 Valentin:

    请让我从最后开始检查、并告诉您。

    此致、

    Betsy Varughese.

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

    尊敬的 Valentin:

    我可以 使用下面的测试代码重现 CGT 8.5.0.LTS 的问题。  

    #include <stdio.h>
    //#include <time.h>                  // C66xx CGT run time header
    #include <ti/posix/ccs/time.h>       // POSIX header from BIOS
    
    int main(void)
    {
    #ifdef _STRUCT_TIMESPEC
        printf("C66x CGT runtime defines timespec\n");
    #endif
    
    #ifdef ti_posix_ccs_time__include
        printf("POSIX from BIOS defines timespec\n");
    #endif
    
        struct timespec ts;
        ts.tv_sec = 1;
        ts.tv_nsec = 1000;
        printf("timespec.tv_sec = %ld, tv_nsec = %ld\n", (long)ts.tv_sec, ts.tv_nsec);
        return 0;
    }
    

    我能够确定根本原因(请参阅,随附的屏幕截图)

    指定 CGT v8.5 、运行时库 页眉引入了一个附加包含链:

    • 现在包括 、
    • 继而还包括这些 。

    通过此链、结构 itimerspec 和结构 timespec 都由编译器的标准标头定义。 这会与 TI-RTOS POSIX 层 (ti/POSIX/CCS/time.h) 发生冲突、后者也会声明相同的结构、从而导致重新定义错误。

    在早期的 CGT 版本(例如 v8.3)中、 不包括 、因此没有从运行时库中提取 timespec 和 itimerspec。 因此、只有 TI-RTOS POSIX 标头提供了这些定义、并且不会发生冲突。

    为了避免这种情况(如果要使用 CGT v8.5)、

    时使用 BIOS/TI-RTOS 、包括“#include “ 以确保使用的是 POSIX 层。

    如果您只需要 编译器的标准运行时支持 、包括“#include “以依赖 CGT 运行时库。

    此致、

    Betsy Varughese.

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

    遗憾的是、此错误出现在编译器使用我自己的代码之前。 编译 BIOS 本身时出现错误。 在我的示例中-bios_6_83_00_18/packages/ti/POSIX/tirtos/clock.c

    我认为、我需要更改 BIOS 的代码。

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

    尊敬的 Valentin:

    不幸的是、此错误在编译器使用我自己的代码开始之前出现。 编译 BIOS 本身时出现错误。 在我的示例中-bios_6_83_00_18/packages/ti/POSIX/tirtos/clock.c

    这实际上指向工具链与仅 BIOS 标头冲突。 (请参阅上面随附的屏幕截图 (CGT v8.5))  

    (您已确认其在 CGT v8.3 中工作正常)

    此致、

    Betsy Varughese.

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

    看起来是对的。 需要更改 BIOS 代码(因为我知道它不支持)。

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

    尊敬的 Valentin:

    是的、没错。 根据发行说明、BIOS 6.83.00.18 通过了 C66x CGT 8.3.2 LTS 验证、因此建议使用特定的编译器版本以获得最佳兼容性。

    此致、

    Betsy Varughese.

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

    我构建了一个解决方案!

    在 SYS/BIOS 源中应进行两次编辑:

    1.[packages/ti/POSIX/CCS/TIME.h] 添加了的内容 而不是由 BIOS 本身定义`timespec`和`timerspec`。 但对于 C6000 且版本>= 8.5.0、仅适用于 CGT

    ...
    #elif defined(__TMS320C6X__) && (__TI_COMPILER_VERSION__ >= 8'005'000)
    #include <time.h>
    #else
    ...

    这使得项目可以构建。

    2. 需要进行[packages/ti/sysbios/hal/seconds.xdt]第二次校正  、以抑制有关溢出 32 位整数的常数 2208988800 的警告。 `S此常量出现在自动生成的 c 代码中、因此应在模板` econds.xdt `中进行编辑 — 只需添加` u 使常量无符号。

        t += 2208988800u;

    下面是指向补丁文件的链接

    https://gist.github.com/chemandante/660e1c13fe0f4a83c5bb6a6e8c420867