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.

[参考译文] 编译器/TMS320F2.8069万:外部"C"(Flash_CallbackPtr *)问题

Guru**** 2539500 points
Other Parts Discussed in Thread: CONTROLSUITE

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/574290/compiler-tms320f28069-extern-c-flash_callbackptr-problem

部件号:TMS320F2.8069万
主题:controlSUITE中讨论的其他部件

工具/软件:TI C/C++编译器

大家好。

我发现了我的Piccolo的一个旧项目,它是使用6.2 0编译器制作的。 现在我有16.12 0 STS编译器。 但是这个项目没有编译。

编译器在“F2806X_BootVars.h”中的函数指针"extern void (*Flash_CallbackPtR)(void);"上给出错误。 周围环绕着"extern "C"{}"。

此函数也位于"F2806X_GlobalVariableDefs.c"- void (* Flash_CallbackPtr)(void)中;

因此,compipler抱怨如下: "../src/F2806x_GlobalVariableDefs.c",第474行:错误#148:声明与"void (*Flash_CallbackPtr)()C"不兼容(在"C:\workspaces\ProjectsGit\ServoPiccolo69\include\F280h_Bootvars.6x)的第31行声明)

看起来这会在6.2 以上的所有编译器上导致一个错误.........0-我尝试了16.9 .1,16.6 .0,6.4 .12。

该项目仅包含TI文件-来自controlSUITE "device_support"文件夹:外设和系统控制的标头和源文件。

请帮助我解决这个问题。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    附加内容:我已打开"将C文件视为C++"选项。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    再更新一次-链接到有此错误的项目。

    它由F2.8069万器件的controlSUITE默认文件组成。 源文件和include文件被放置到文件夹中,这些文件夹的名称与controlSUITE文件夹中的路径对应。

    Project在项目属性中打开了“将C文件视为C++”选项“CCS Build - C2000 Compiler - Advanced Options - Language Options”

    我还必须修复一些文件:

    •  函数"Void InitPieVectorTable(void)"中的"DEVICE_supportl.f2806x.v151.F2806X_common.source/F2806X_PieVect.c"。2806。</s>2806 编译器不喜欢将“UINT32*”变量初始化为“void*”类型;
    • "device_supportl.f2806x.v151.F2806x_common.source/F2806x_sysctrl.c"-2806- copmler2806 copmler抱怨pragma "#pragma code_section (InitFlash,"secureRamFuncs");"不兼容C++ pragma样式。


    Yadi.SK/.../N5QzgB3G3E6uGr

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在编译这些文件时,很可能不应该打开“将C文件视为C++”选项。 它们很可能被编译为C代码。 我对此的证明是,当C++代码中包含头文件时,F2806x_BootVars.h将该函数声明为extern "C"函数。 您应该在项目级别禁用“将C文件视为C++”选项,而只对必须编译为C++文件的文件启用此选项。 您应该认真考虑使用.cpp扩展名命名C文件,这样您根本不需要该选项。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    嗯,这不是那么容易。
    我的真实项目需要该标志,因为该项目包含“cpp”文件。 在我上一篇文章中,只有一个问题示例。 我无法共享原始项目,因为某种版权=)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果该文件已被命名为扩展名为.cpp,则编译器将自动将其识别为C++文件,而不需要该选项。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我们在没有此标志的项目中有许多警告。
    我想,我们做了一些错误的事情,但它已经用了多年的老编译器工作了。 它可能是旧编译器的错误,尽管=)
    在项目中,我们混合了C和C++,所以我们有一些标头和类。 如果没有上述标志,我们将出现"标识符"class"未定义"之类的错误。
    以下是示例: Yadi.SK/.../N5QzgB3G3E6uGr
    附注:我真的不是C++专家,但我不得不处理我们团队的一些项目,这些项目的C++=(.
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    听起来您在C文件中包括C++标题。 这不奏效。 启用“将C文件视为C++”选项并删除所有'extern "C"块或将外部"C"严格应用于"C"文件中的所有定义,这样切换到C++(就像您所做的那样)可能是最简单的。

    如需了解外部"C"的功能说明,请参阅此处: www.drdobbs.com/.../1.84403437亿

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

    感谢您的建议。

    我现在使用的是第二种方法-"严格地将外部"C"应用于您的"C"文件中的所有定义"。 它很有帮助,但我在“F2806X_GlobalVariableDefs.c”中得到警告

    #ifdef __cplusplus
    #pragma data_section("FlashCallbackVar");
    #else
    #pragma data_section(Flash_CallbackPtr,"FlashCallbackVar");
    #endif
    extern "C" void (*Flash_CallbackPtR)(void);
    

    它显示: "../src="/F2806X_GlobalVariableDefs.c",第470行:警告#1373-D:pragma data_section只能应用于具有静态存储的符号的定义,而不能应用于“Flash_CallbackPtr”(在“C:\Boot6x\ProjectsGit\ServoPiccolo69\include\Fars.V280h”的第31行声明)。 不管怎样,程序运行正常。

    不过,我觉得可笑的是,旧版编译器没有这种问题。 而且奇怪的是,问题发生在标准TI文件中。

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

    需要用大括号将定义括起来,否则它们只是声明:

    #ifdef __cplusplus //注意:既然您将所有内容都视为C++,那么我将取消#ifdef __cplusplus conditionals
    #pragma data_section("FlashCallbackVar");
    }}}"C"
    {#else
    
    #pragma data_section(Flash_CallbackPvoid,"FlashCallbackVar"
    
    
    );#Callendif_Ptr_pendif_(注
    
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这将导致“错误#612:此类pragma不能在此处使用”=(
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    啊,对不起,当然你应该把pragma放在开括号后面...

    #ifdef __cplusplus //注意:既然您将所有内容都视为C++,那么我将取消#ifdef __cplusplus conditionals
    extern "C"
    {
    #pragma data_section("FlashCallbackVar");
    #else
    #pragma data_section(Flash_CallbackPvoid,"FlashCallbackVar"
    
    
    );#Flash #def <#prendif_p>
    
    

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