我的C ARDUINO程序中的内联汇编代码,用于LED延迟功能

时间:2014-08-11 12:53:47

标签: c assembly arduino embedded inline-assembly

我已经设置了在这个简单的blink arduino程序中替换延迟函数的任务

int ledPin = 13;

void setup()
{
  pinMode(ledPin,OUTPUT);
}

void loop()
{
  digitalWrite(ledPin, HIGH);
  delay(1000);
  digitalWrite(ledPin, LOW);
  delay(1000);
}

到目前为止,我已将此作为汇编功能:

asm volatile(
" lp1:   ldi r17,10         ;                \n"
" lp2:   ldi r16,100        ;                \n"
" lp3:   ldi r18,50         ;                \n"
" np:    nop                ;                \n"       
"        dec r18            ;                \n"
"        brne np            ;                \n"
"        dec r16            ;                \n"
"        brne lp3           ;                \n"
"        dec r17            ;                \n"
"        brne lp2           ;                \n"
"        sbiw r30,1         ;                \n"
"        brne lp1           ;                \n"
"        ret                ;                \n"
);

我不确定我到目前为止是否正确,但我主要混淆的是我将如何在程序中稍后调用该功能,所以我可以我想要多次打电话

感谢任何帮助

1 个答案:

答案 0 :(得分:1)

asm volatile通常用于在C例程中嵌入程序集片段。因此,在您的示例中,您可以编写一个简单的C函数,其中只包含给定的汇编代码( nb:您需要删除ret指令,因为C函数将处理函数返回给你)。然后,您可以随时随地调用C函数。

另一种方法是将代码移动到实际的汇编文件中,但是您必须担心您正在使用的任何编译器/平台的实际C调用约定(这包括函数参数,如果有的话。

根据经验,我建议将以前的方法嵌入到C函数中,因为函数调用的细节留给了编译器,你仍然可以从汇编代码中获益。