1

我需要编写将返回特定硬件寄存器值的 C 函数。例如 R0。

我从 GHS 文档中不清楚这是如何使用 GHS 编译器提供的宏来完成的。

uint32_t readRegRx(void)
{
   uint32_t x = 0U;
   __asm("MOV Rx, ??");
   return x;
}

GHS 编译器中用于将局部变量作为内联汇编指令的参数引用的语法是什么?

我在 GHS 文档中看到了这一点:

asm int mulword(a,b)
{
%con a %con b
   mov r0,a
   mov r1,b
   mul r0,r1,r0
%con a %reg b
   mov r0,a
   mul r0,b,r0
%reg a %con b
   mov r0,b
   mul r0,a,r0
%reg a %reg b
   mul r0,a,b
%con a %mem b
   mov r0,a
   ldr r1,b
   mul r0,r1,r0
%mem a %con b
   ldr r0,a
   mov r1,b
   mul r0,r1,r0
%mem a %mem b
   ldr r0,a
   ldr r1,b
   mul r0,r1,r0
%error
}

但这并不是我想要的,我想。上面文档中的示例描述了一个带参数的函数。返回值隐含在 R0 中。

就我而言,我想要的是使用一个普通的 C 函数,它带有嵌入式内联程序集来读取寄存器(R-anything)并将值存储在函数的局部变量中。

4

1 回答 1

1

我收到了来自 GHS 支持的信息,它解决了在 C 函数中读取硬件寄存器 (Rn) 的方法,类似于扩展的 GNU ARM 功能。以下适用于 GHS 编译器的使用,而不是 GNU 编译器的使用:

“出于 asm 宏的目的(在 asm 宏中使用),最好使用增强的 GNU asm 语法,并且您需要打开“接受 GNU asm语句”(--gnu_asm)。”

int bar(void)
{
   int a;
   __asm__("mov r0, %0" : : "r"(a)); // move a to r0. Replace r0 to suit.
   // Stuff
  return a;
}

替代方法:


asm void readR0(r0Val)

{

%reg r0Val

    mov r0Val,r0

}


void foo(void)

{

    register int regValReg = 0;
    readR0(regValReg);

    // Stuff
}
于 2019-08-06T21:06:01.293 回答