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.

[参考译文] 预定义符号、用于仅构建 cla.obj

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

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1499587/pre-defined-symbols-to-build-only-cla-obj

部件号:TMS320F28379D
主题:C2000WARE 中讨论的其他器件

工具/软件:

您好!

我正在处理一个多核工程、并使用了 CPU 2子系统上的 CLA。 我构建项目的方式基本如下:

- core1 (main.c)

- core2 (main.c、cla.cla、cla.h -桥接内核和 CLA)

- lib/(一堆 c 和 h 文件)-这是 core1和 core2项目的链接文件夹

- mem.h

(使用 CCS v12和 C2000Ware 5.04.00)

基本上、lib 实现了我的许多功能、旨在供任一内核和 CLA 使用。 我通过使用预处理器指令检查是否定义了 CPU1/CPU2/CLA 和闪存/RAM 等符号来支持变化、以基本上在编译时更改定义。 同样- mem.h 基本上别名使用相同概念的不同消息 RAM 的名称。 这种方法对我来说非常有用、因为我可以更改 CCSv12中的工程属性、从而从几乎相同的源(lib)中编译所有内容。

我遇到了将此功能扩展到将在 CLA 上运行的代码部分的问题。 我基本上想在仅 cla.cla 编译到.obj 文件时设置一个预定义符号。 例如、

我想根据是否定义了名为 CLA/CPU1/CPU2的符号来确定 mem.h 中的 CPU-CLA 消息 RAM 地址的别名-以便为 CPU 和 CLA 创建.obj 文件、然后这些文件链接到.out 文件。 (使用 CLA 进行编译时调用 cla_read 缓冲区、使用 CPU 调用 cpu_write_buffer)

另一个用例是检查 CLA 符号、在某些情况下使用 CLAMAth 库、否则可以使用在 CPU 上工作的替代功能。

我已经了解了 CLA 软件开发指南、多核开发指南。 优化编译器指南并有一个问题-我是否有办法仅为编译 CLA 代码设置符号定义。 如果 CPU 和 CLA 共享一些通用源代码(mem.h)、则可以获得2个.objs (分别使用 CPU 和 CLA 符号编译)、然后链接到可执行文件的其余部分)。  

我意识到、跨内核共享源要容易得多、因为每个子系统的构建和链路是独立的。 是否有办法可以实现与 CLA 类似的功能?

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

    lib/中的许多内容都是相当有用的内容、例如 GPIO 读取/写入、ePWM 修饰符、可从 C28x 和 CLA 使用。 是否确实支持重复使用同一来源?

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

    尊敬的 Prakhar:  

    在 CLA/C28中使用相同的代码应该是无缝的。  

    https://software-dl.ti.com/C2000/docs/cla_software_dev_guide/_static/pdf/C2000_CLA_Software_Development_Guide.pdf 

    请参阅此文档、了解使用预定义符号在任一内核上运行相同代码的情况

    /cfs-file/__key/communityserver-discussions-components-files/171/CLAProjectStructureUG.pdf

    请告诉我这是否回答了您的请求

    此致、

    Ozino

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

    我还不确定的是从您共享的文档中编译共享文件(例如 solution.c/h)。

    当 C28x 编译器正在编译 main.c 文件时、我假设依赖项(lib.c/h)会内置到 obj 文件中。 调用 CLA 编译器将 tasks.cla 编译到对象时、它是否会使用 _TMS320C28XX_cla__符号重新编译依赖项(lib.c/h)? 它是否重复使用 C28编译器中的.objs?

    提问、因为我遵循了您分享的文档中的建议-这样  

    // shared.h header file
    
    #ifndef __TMS320C28XX_CLA__
    // Declare C28 functions
    
    #include "c28_utils.h" //c28 ONLY helpers
    void func1();
    void func2();
    
    # else 
    // Declare CLA funcs
    
    void func1();
    void func2();
    
    #endif


    // shared.c defintion file
    
    
    # include "shared.h"
    #ifndef __TMS320C28XX_CLA__
    // Declare C28 functions
    
    void func1() {
     // do something
     }
    void func2(){
     // do something
     }
    # else 
    // Declare CLA funcs
    void func1() {
     // do something else
     }
    void func2(){
     // do something else
     }
    
    #endif



    但我仍然得到警告  

    从 CLA 文件"./CPU2_cla.obj "中调用"./shared.obj "中定义的 C28函数"func1"无效

    我使用了一些源代码分析工具、并确保 shared.h 仅包含在.cla 文件中、而不包含在 C28 CPU 主文件中。  

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

    您好、

    您不需要定义两次函数。 用户只需要将其定义为一并在适当的情况下调用函数。

    我建议您查看我们的 CLA 支持的参考设计 https://dev.ti.com/tirex/explore/node?node=A__AMlfQ8j5xnIEkwEg-43-8A__digital_power_c2000ware_sdk_software_package__5C6SEVO__LATEST&placeholder=true

    请注意函数 CLLLC_runISR1 ()、它在 main.c 和 clatasks.cla 中调用。 但是、根据 #define CLLLC_ISR1_RUNNING_ON 的值、它将启用/禁用与相应内核关联的代码。

    这样、在任一情况下只引用函数的一个实例。

    此致、

    Ozino

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

    嗨、Ozino。


    感谢您的答复。 我浏览了链接工程的代码、似乎存在误解。

    您共享的工程似乎使用 ISR 的1个定义、并使用预处理器指令来切换它的执行位置(CPU 或 CLA)。  

    在我的例子中、我想根据共享函数是由 CLA 任务调用还是 C28x 内核调用来更改该函数的定义。 理想情况下、这还会包括函数签名的差异(因此、在头文件中、我前面的注释中有2个不同的声明)。

    如果您能回答以下问题-我认为我们已经解决了 误解

    1. 依赖项(包括)由 c28和 CLA 编译器独立扫描。 AKA -如果同一源文件同时包含在 CLA 和 C28代码中、我是否可以期望它两遍?
    2. 因此、我是否可以操作编译器、以便为源代码生成2个不同的.obj 文件(假设一个文件是使用 CLA 编译器定义的_TMS320C28XX_CLA__编译的、另一个文件不使用 C28编译器定义的符号)。 我是否需要在替代定义中重命名符号(我大致记得 CLA 编译器在所有使用的符号名称前加上"cla")
    3. 这意味着我应该可以从 C28和 CLA 中调用"相同"的函数、并实现不同的行为。 这是可能的吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Prakhar:

    感谢您的详细说明。 只要定义了函数定义、使其适用于目标的相应核心、您提出的建议就应该是可行的。

    是由 c28和 CLA 编译器独立扫描的依赖项(包括)。 AKA -如果同一源文件同时包含在 CLA 和 C28代码中、我可以期待两遍同一源文件吗?

    只要您使用必要的保护、即 C28x 与 CLA、就应该能够保留同一函数的两种不同定义。 但我认为这是可能的。

    因此、我是否可以操纵编译器为源代码生成2个不同的.obj 文件(假设一个文件是使用 CLA 编译器定义的_TMS320C28XX_CLA__编译的、另一个文件不使用 C28编译器定义的符号)。 我是否需要在替代定义中重命名符号(我大致记得 CLA 编译器在所有使用的符号名称前加上"cla")

    您是否尝试生成单独的输出文件(例如 main1.out、main2.out)? 或者、您是否为每个内核寻找单独的 main.obj 文件? 我不确定在不重命名 main.c 文件或在构建之间保存生成的目标文件的情况下可以实现这一点。

    这意味着我应该可以从 C28和 CLA 中调用"相同"函数并实现不同的行为。 这是可能的吗?

    我的理解是、这不适用于相同的构建正确吗? 我假设有1个选项是在 C28x 上运行、另一个在 CLA 上运行?

    此致、

    Ozino

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

    感谢您的答复。

    [引述 userid="235944" url="~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1499587/pre-defined-symbols-to-build-only-cla-obj/5768974 #5768974"]

    您是否尝试生成单独的输出文件(例如 main1.out、main2.out)? 或者、您是否为每个内核寻找单独的 main.obj 文件? 我不确定在不重命名 main.c 文件或在构建之间保存生成的目标文件的情况下可以实现这一点。

    [/报价]

    我不会遇到两个内核之间的问题。 如果我理解正确-每个 CPU 子系统 都有一个.out 文件、该文件是根据链接器脚本链接在一起的相关.objs。 如果我想在同一子系统上的 CPU 和 CLA 中使用相同的源文件-并且我已经使用了适当的预处理器指令来操作定义-相同的代码是否可以由不同的编译器(使用不同的预定义)编译 生成不同的.objs -一个用于 C28、另一个用于 CLA -然后将其分别链接到 CPUx_main.obj 和 cla_tasks.obj 进行的相关调用?

    但我仍然收到警告  

    从 CLA 文件"./CPU2_cla.ob
    调用"./shared.obj"中定义的 C28函数"func1"无效

    我假设生成我收到的错误消息(在前一个回复中提到)是因为 shared.h 文件是由 C28编译器编译的、然后 CLA 会重复使用同一.obj。

    我试图实现此行为的唯一原因是有效地管理我的源代码。 我尝试将一些电机控制代码从 C28移植到 CLA。  我希望代码位于同一个文件中、以便将来可以维护。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我没有遇到两个内核之间的问题。 如果我理解正确-每个 CPU 子系统 都有一个.out 文件、该文件是根据链接器脚本链接在一起的相关.objs。 如果我想在同一子系统上的 CPU 和 CLA 中使用相同的源文件-并且我已经使用了适当的预处理器指令来操作定义-相同的代码是否可以由不同的编译器(使用不同的预定义)编译 生成不同的.objs (一个用于 C28、另一个用于 CLA)、然后将其分别链接到 CPUx_main.obj 和 cla_tasks.obj 进行的相关调用?

    理论上、是的、应该可以修改工程、以便您能够基于目标内核生成具有其独特 objs 的两个不同输出。 我建议利用编译配置选项。 这将使您能够指定每次构建都唯一的预定义符号(例如 C28、CLA)、这将在不同的目录中生成.bin、.objs。 它的设置将与我们的闪存配置和 RAM 构建配置类似。 您可以将其用作起始模板

    我假设生成我收到的错误消息(在前一个回复中提到)是因为 shared.h 文件是由 C28编译器编译的、然后 CLA 会重复使用同一.obj。

    我试图实现此行为的唯一原因是有效地管理我的源代码。 我尝试将一些电机控制代码从 C28移植到 CLA。  我希望代码位于同一个文件中、以便将来可以维护。

    [/报价]

    我假设是这样。 如果尝试对 C28和 CLA 构建使用相同的文件、则必须确保在文件中提供必要的保护。 这应该适合您。  

    查看我们的移植指南和研讨会、了解如何启用 CLA

    https://software-dl.ti.com/C2000/docs/cla_software_dev_guide/getting_started.html#workshops

    此致、

    Ozino