在嵌入式系统中,C语言中的NOP指令有什么等价替代品?

10

我使用KEIL编译程序。

该程序使用如下代码

asm("NOP");

不幸的是,KEIL编译器不接受此语句。

这个想法是通过使用NOP(无操作)汇编代码来引入延迟。

在C中,实际等效于此的是什么? 这是否因我使用的嵌入式控制器而有所不同?


一些嵌入式编译器提供了内置函数__delay_cycles(constant),它会生成代码以等待指定数量的周期。我不确定Keil编译器是否有此功能。 - Lindydancer
什么目标?- Keil的ARM工具使用ARM的编译器(除非它真的很旧,来自Keil被ARM收购之前),而对于其他目标,它们使用自己的编译器。这两者的专有扩展不同。但是所有的都将有一种嵌入式汇编的方法;请参考用户手册以获取内联汇编语法,并参考您的处理器指令集以获取适当的无操作指令。 - Clifford
3个回答

7

1
请更新链接,它已经失效了。 - Balamurugan
2
@Balamurugan - 谢谢,已更新。 - Leeor

5

我使用的嵌入式控制器会影响这个吗?

是的。内联汇编不是C标准的一部分(目前),它因编译器而异,有时甚至在同一编译器的不同目标架构之间也有所不同。有关更多信息,请参见内联汇编是否属于ANSI C标准?

例如,对于C51 Keil编译器,内联汇编的语法为:

...
#pragma asm
      NOP
#pragma endasm
...

而对于ARM,语法大致如下:

...
__asm  {
          NOP
       }
...

你需要查阅你正在使用的实际编译器的手册。
对于一些更常见的操作码,一些编译器提供所谓的内置函数 - 它们可以像 C 函数一样调用,但本质上插入汇编代码,如 _nop_ ()

2
内联汇编实际上在C++中是标准化的,使用原始问题中的语法。不幸的是,C尚未将其标准化。因此,最好将内联汇编隐藏在函数或宏中,以便封装它。如果将来将代码移植到不同的编译器或CPU上,则只需要重写封装部分即可。 - Lundin

1
如果您正在使用Keil进行ARM Cortex目标(例如stm32)的编程,那么您很可能也在使用CMSIS库。它具有可移植的宏和内联函数,用于所有汇编指令,写成这样:__NOP()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接