【发布时间】:2021-12-19 14:17:14
【问题描述】:
我最近从 Keil Uvision 切换到我自己的 Makefile 我在编译文件 port.c 时遇到问题, 文件中的函数:
__asm void vPortSVCHandler( void )
{
PRESERVE8
/* Get the location of the current TCB. */
ldr r3, =pxCurrentTCB
ldr r1, [r3]
ldr r0, [r1]
/* Pop the core registers. */
ldmia r0!, {r4-r11, r14}
msr psp, r0
isb
mov r0, #0
msr basepri, r0
bx r14
}
编译时出现以下错误:
../port.c:52:7: error: expected '(' before 'void'
52 | __asm void vPortSVCHandler( void )
| ^~~~
| (
../port.c:64:13: error: stray '#' in program
64 | mov r0, #0
我是否缺少包含或编译器选项?
【问题讨论】:
-
内联汇编器不是标准化的(如在 C++ 中),也不是可移植的。每个编译器都以自己的方式进行。好的编译器会努力以“C++ 风格”(
asm(" ... ");)来完成它,同时等待 C 委员会认识到人们可能希望在计算机上使用 C。距离第一个 C 标准已经 30 多年了,委员会仍然没有意识到在计算机上使用 C 的必要性,所以不要抱太大希望...... -
将“port.c”更改为“port.cpp”是否可行?
-
不,因为这看起来不像标准化的 C++ 内联汇编器。而且您通常也不想在嵌入式系统中使用 C++。
-
@Lundin
And you generally don't want to use C++ in embedded systems anyway为什么?我有时用。没问题。不错的 RTOS 也可用(失真)