我正在尝试阅读cpsr
并使用这些功能设置cpsr
。但是这些功能在 eclipse 中运行良好,但我在keil uvision 4
中使用它们时遇到了问题。
static inline unsigned __get_cpsr(void)
{
unsigned long retval;
asm volatile (" mrs %0, cpsr" : "=r" (retval) : );
return retval;
}
static inline void __set_cpsr(unsigned val)
{
asm volatile (" msr cpsr, %0": :"r" (val));
}
我收到此错误:
error: #65: expected a ";"
error: #20: identifier "asm" is undefined
因此我使用 __inline
和 __asm
,现在我收到此错误:
source\main.c(94): error: #18: expected a ")"
source\main.c(94): error: #18: expected a ")"
有关如何修复它的任何想法?或者在单独的asm file
中移动这些函数的步骤是什么,这似乎是一个解决方案,但不幸的是我不太熟悉汇编
答案 0 :(得分:0)
旧版本 Keil uVision 通常带有自己的编译器和汇编器 (ARMCC 5)。 ARMCC 5 汇编器的汇编格式与 GCC 汇编器的汇编格式不同。
您需要查看差异。
将 ARMCC 6 与较新的 Keil 一起使用应该可以解决该问题,因为 AMRCC 6 使用与 GCC 相同的汇编格式。
虽然如果您需要在 ARMCC 5 中使用它,那么从 https://www.embeddedrelated.com/showthread/lpc2000/7010-1.php 开始,以下内容应该可以工作:
static inline unsigned __get_cpsr(void)
{
__asm { MRS R0, CPSR }
}
static inline void __set_cpsr(unsigned val)
{
__asm { MSR CPSR_cxfs, R0 }
}
我还没有研究为什么要添加 cxfs
。可能只使用 CPSR
。
在 C 而不是 C++ 中,以下也应该适用:
static inline unsigned __get_CPSR(void)
{
register unsigned regCPSR __asm("cpsr");
return(regCPSR);
}
static inline unsigned __set_CPSR(void)
{
register unsigned regCPSR __asm("cpsr");
return(regCPSR);
}
https://www.keil.com/support/man/docs/armcc/armcc_chr1359125006491.htm
C++(至少从 17 开始)忽略了 register 关键字,这似乎需要使用汇编。这不太理想。