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.

[参考译文] PRU编译器:PRU编译器2.1 4:条件编译的cdecls变通办法(#if/#eles/#ifdef/etc.)

Guru**** 2534260 points


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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/591729/pru-compiler-pru-compiler-2-1-4-cdecls-workaround-for-conditional-compilation-if-else-ifdef-etc

工具/软件:TI PRU编译器  

你(们)好

我正在尝试使用cdecls将C头文件(具有多个#ifdef /#endif)包含到程序集源文件中。  

http://downloads.ti.com/docs/esd/SLAU131K/Content/SLAU131K_HTML/sharing_c_c_header_files_with_assembly_source.html 提到,目前它不会进行有条件的编译。 有人可以建议解决此问题的方法吗?

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

    我正在尝试使用cdecls将C头文件(具有多个#ifdef /#endif)包含到程序集源文件中。  [/引述]

    继续并使用.cdecls将其包含在内。  但是,您需要了解,在 处理include文件时,会计算#ifdef和#endif行。  它们不会被转换成.if和.endif等汇编程序指令,然后由汇编程序的指令处理阶段进行评估。

    谢谢,此致,

    -George

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

    感谢您的快速回复。 我认为我的用例有点不同,我将在此处解释。
    假设有一个C头文件A_C.h包含

    #ifdef P

    #定义 R

    #endif

    和另一个ASM头文件A_ASM.h文件执行相同的操作,格式为汇编程序,如图所示
    如果$isdefed ("P")
    R组1
    endif

    如果我在某些程序集源文件中包含A_ASM.h,并且在构建配置中将P作为预定义符号,我可以在.if $isdefed("R")下看到正在执行的语句。 但我使用cdecls直接包含C头文件A_C.h时,则不会。 此外,现在如果我也将R作为预定义符号添加到构建配置中,它将正确构建,但会发出R声明为R的警告

    这表明在两种情况下都定义了R,但在以前的情况下,它没有进入符号表。 因此,我想知道,在构建配置中没有明确提及的情况下,是否有某种方法可以让R进入符号表?

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

    总之,使用#define,测试在.cdecls内创建的符号是否存在...

    如果$defined (C_Define_name);有效 

    ...而不是使用...

    如果$isdefed("C_Define_name");失败 

    要理解为什么需要了解汇编程序定义的一些概念。  有两种符号:常规(也称为标准)符号和替换符号。  C也有这些,但没有这些条款。  在C中,#define符号将一段文本替换为另一段文本。  例如  

    #Define Forever While (1)
    

    ...意味着文本将永远替换为文本"while (1)"。  这与常规符号完全不同...

    int global_variable; 

    指令.set创建一个正则符号。  使用.define指令实现#define符号,并创建替换符号。  替换符号出现的任何位置都将替换为相应的文本。  

    $isdefed运算符只检查常规符号表。  但$defined运算符同时检查常规符号表和替换符号表。

    有关详细信息,请参阅 PRU装配工具手册

    谢谢,此致,

    -George