嵌入式C中NOP的等价值是多少?

时间:2014-09-10 10:17:41

标签: c assembly embedded

我使用KEIL编译程序。

程序使用代码

  

ASM( “NOP”);

不幸的是,KEIL编译器不接受该声明。

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

C中实际相当于什么?这与我使用的嵌入式控制器有什么不同吗?

3 个答案:

答案 0 :(得分:3)

在大多数编译器中都有一个内在的nop,Keil也应该这样做 - 尝试__nop()

请参阅 - http://www.keil.com/support/man/docs/armccref/armccref_CJABCDAD.htm

为了兼容性原因,内部函数通常比直接添加汇编代码更安全。

答案 1 :(得分:2)

  

这会因我使用的嵌入式控制器而异吗?

是。内联汇编不是C标准的一部分(但是),它在编译器之间有所不同,有时甚至在同一编译器的不同目标架构之间。有关详细信息,请参阅Is inline asm part of the ANSI C standard?

例如,对于C51 Keil编译器,syntax for inline assembly

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

而对于ARM,语法类似于

...
__asm  {
          NOP
       }
...

您需要查看您正在使用的实际编译器的手册。

对于一些更常见的操作码,一些编译器提供所谓的内在函数 - 这些可以被称为C函数,但实际上是插入汇编代码,如_nop_ ()

答案 2 :(得分:0)

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