我正在使用Visual Studio来维护为嵌入式平台设计的C项目。我正在尝试使用Visual C编译器来构建项目,在停止错误之前尽可能地进行,并在准备好后,使用目标工具链重建它。通过这种方式,我可以在原生的,过时的目标IDE上使用IDE的卓越功能。
当然,Visual C编译器并不能理解本机编译器的所有代码功能,但是我使用命令行Defines和Undef管理并使用本机编译器的系统头文件来创建非常令人满意的进步。
我现在所困扰的是使用内联汇编。在某些系统头文件中,有一些代码片使用内联汇编,格式为:
#define GET_COUNT(count) \
do {
__asm volatile ("r2 = CYCLES; \n" \
"r1 = CYCLES2; \n" \
"[%0] = r2; \n" \
"[%0+4] = r1; \n" \
: : "p" (&(count)) \
: "r1", "r2" ); \
} while (0)
我正在寻找一种方法让MS C编译器忽略有关汇编指令的c2400
错误。它可以通过某种方式自动注释掉__asm
调用,或者将其重命名为关键字,这将使编译器忽略它。但是,一个要求是对系统头本身的源代码没有任何改变。
UPDATE 1:此宏的用法示例位于另一个系统头文件中:
static clock_t clock(void)
{
_cycle_t _cnt;
_GET_COUNT( _cnt );
return (clock_t) _cnt;
}
此代码生成上述错误。
因此,我创建了一个包含临时函数定义的文件:
void temp_func(char *a)
{
return;
}
在项目选项中我定义了volatile=
和__asm=temp_func
。然后我使用强制包含文件选项来包含该文件。我的想法就是这样,原始__asm volatile ("blah");
将映射到temp_func("blah")
调用,因此对构建没有影响。
但是,现在我在使用宏的行上得到以下错误:
错误C2143:语法错误:缺少')'之前':'
答案 0 :(得分:1)
一种方法是使用说#define MSVC
,然后使用#ifdef MSVC ... #else ... #endif
提供替代代码。
另一种方法是将特定于平台的所有内容放在单独的.c文件中。然后,当我想在PC上测试/证明代码时,尽可能编写其他版本的补丁。然后它只是项目中包含的一个不同的文件,并且目标代码没有乱七八糟的解决方法。
那么你只需要提供不同文件的替代版本,而不需要触及源代码。
答案 1 :(得分:0)
标题使用AT& T格式程序集,Microsoft编译器只接受英特尔格式程序集。通常,您必须以英特尔格式重写标头中的代码。
理论上,您可以使用GCC将头文件编译为目标代码,然后将它们作为静态库包含在项目中。