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.

[参考译文] CCS/TMS320F28023:编译器不添加常量、而是在运行代码中进行加法

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/792907/ccs-tms320f28023-compiler-not-adding-constants-addition-happening-in-run-code

器件型号:TMS320F28023

工具/软件:Code Composer Studio

CCS V6、Win7 32位、F28023。

我一直在尝试让 CCS 将两个常量相加、然后在函数调用中使用结果。

例如、我想编写一个汇编例程来将堆栈设置为一个值、这样我就可以看到实际使用了很多。

这是原型...

extern MyMemSet (uint16 *开始、uint16大小、uint16值); 

这是 Func 调用。

MyMemSet (&stackStart + 8、(uint16)&_stack_size - 8、0xa55a); 

stackStart 在链接器中定义、

_stack_size 来自 链接器命令行 arg --stack_size=。

问题:

stackStart + 8 和 &_stack_size - 8在运行时发生。 检查汇编代码会显示加法和减法汇编指令。

这里的所有内容都是常数、如何在编译时实现该数学运算?

谢谢、
标记。

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

    [引用 user="cool Javelin "]此处的所有内容都是常量

    我理解您这么说的原因。  但并不完全准确。   

    表达式

    stackStart + 8 (&S) 

    是由编译器处理的、它不是常量。  stackStart 是一个符号。  直到链接时才确定地址。  链接器完成后、没有机制可以重新处理为此表达式生成的代码以确定最终常量值、并将该代码替换为此值。   

    谢谢、此致、

    乔治

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

    当然,乔治,既然你提醒我,我想知道我为什么不能更早地想到这一点。 谢谢你。

    我想、由于这是一次初始化堆栈的调用、在这种情况下、我可以忍受2条指令效率低下的情况。

    我尝试从链接器中删除--stack_size=选项,并在 C 代码中创建我自己的堆栈缓冲区,但链接器抱怨了,因为 RTL 可能会使用它,所以我必须使用它。

    M.