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.
工具与软件:
背景:我比较熟悉 IAR 的 icc430 C/C++编译环境、一位比较熟悉 TI CGT MSP430环境的新手。
在 IAR 中、如果我希望将一些内联汇编语言嵌入到其他 C/C++例程中、我可以这样说:
Checksum_T checksums::: computeChecksum ( uint32 const FirstByte44, Region_Address uint32 const RegionBytecount, Checksot_T const Seed )
{
CHECKSUM_T CHECKSUM = SEED;
U16ConstPointer20_T Byte_ptr =(U16ConstPointer20_T) FirstByteECG Region_Address;
uint32. remainingWords = RegionBytecount / 2UL;
while (remainingWords !=0UL)
{
Checksum +=* Byte_ptr;
asm ("ADC.W %0") /*将尾进位与累积校验和值相加(可以是%0或%1)*/
:"=r"(校验和) /*%0是我们的输出参数("校验和") */
:"r"(校验和) /*%1是我们的输入参数("校验和") */
:"cc"; /*木结构资源列表(仅条件代码) */
byte_ptr++;
remainingWords --;
}
return(校验和);
}
%0、=r、r 和 cc 填充创建了一个与 C 编译器的接口、由此、C 编译器将汇编语言伪操作数%0设置为指向 C 的"校验和"数据值。 它还让 C 编译程序知道我的内联汇编代码会影响或破坏哪些资源、以便编译程序知道避免这些资源/从我这里保存/接受值。
通过浏览 SLAU132Y (CGT 编译器手册)和 SLAU131Y (汇编器手册)、我看不到任何类似的工具、因此看起来我需要读取汇编列表并自定义我的内联汇编代码以访问正确的资源(由 C/C++编译器确定)。 事实上、编译器手册指出我的问题是不可能的:
asm 语句不提供任何引用局部变量的方法。 非常有用
您需要引用局部变量、那么您需要在汇编代码中编写整个函数。
及更高版本:
使用 asm 语句时不要改变 C/C++变量的值。 这是因为
编译器不会验证此类语句。 它们将原样插入汇编代码、和中
如果您不确定它们的效果、可能会导致问题。
虽然我可以想象、如果我愿意接受某种风险、编译器可以将事情"背后"(恕不另行通知)、我仍然可以编写我建议的代码。
我是否正确理解情况? 如果 CGT 中不存在该功能、也可以、但在 IAR 环境中实现比 CGT 环境更方便。
您好、Atlant:
通常情况下、为了避免编译器扰乱我的代码、我将显式定义不被编译器调整的函数和变量。 您可以对变量本身使用 volatile 关键字、以防止它被优化掉
另一个选项是也防止优化整个函数、请参阅类似的线程- https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/570641/compiler-msp430f147-how-do-i-turn-the-optimizer-off-for-a-specific-function
本应用手册还将帮助填补某些此类链接方面的空白(以及几个代码示例)- https://www.ti.com/lit/slaa140
此致、
Luke
"asm"接受"volatile"关键字[例如 asm volatile (" nop ");]但我不知道它是否有任何效果。
我还没有尝试您提到的 GCC 样式参数化的 TI 编译器。
感谢您指出 IAR asm 语法实际上是 GCC 语法;我应该猜到了这一点、但没想到。 ;-)
我还没有尝试使用 TI 编译器提及的 GCC 样式参数化。
我只是尝试了一下。
对于包含 asm ("ADC.W %0")的行、CGT 编译器(在大多数默认模式下运行)如下:
"hello.c"、第294行:错误:预期为")"
因此、除非某些限定符可以更改此行为、否则 CGT 编译器不愿意接受此 GCC 语法。
(我还在 GCC 中尝试过它、在这种环境下、它起作用了。)
您好、Atlant:
您是否能够对您的函数应用 no 优化、并将正在使用的变量设置为未优化? -
#pragma FUNCTION_OPTIONS (FUNCTION_NAME、"-opt_level=OFF")
在这个情况下、编译程序不应该调整函数、我希望此函数会允许您的__asm 将430指令应用到数据中。
路加福音:
我还没有尝试过、但我有理由相信您是正确的、设置"不优化"将有助于解决这种情况。
现在、我的问题至少部分是理论问题;我正在考虑将我们的代码库(或其中的部分)从 IAR 环境移植到 CGT 环境会采取什么措施、而汇编代码位是到目前为止我注意到的唯一绊脚石。 到目前为止我实验移植的代码除了 makefile 以及(预期的)编译器和链接器限定符之外、无需调整。
听起来不错! 我现在将关闭该线程、但如果您在进行移植时遇到任何困难、可以随意创建另一个线程。