我使用KEIL编译程序。
该程序使用代码
asm("NOP");
不幸的是,KEIL 编译器不接受该声明。
这个想法是通过使用 NOP(无操作)汇编代码来引入延迟。
这在 C 中的实际等价物是什么?这是否因我使用的嵌入式控制器而异?
我使用KEIL编译程序。
该程序使用代码
asm("NOP");
不幸的是,KEIL 编译器不接受该声明。
这个想法是通过使用 NOP(无操作)汇编代码来引入延迟。
这在 C 中的实际等价物是什么?这是否因我使用的嵌入式控制器而异?
大多数编译器都有一个内在函数nop
,Keil 也应该有这个 - 试试__nop()
见 - https://www.keil.com/support/man/docs/armcc/armcc_chr1359124998347.htm
出于兼容性原因,内部函数通常比直接添加汇编代码更安全。
这是否因我使用的嵌入式控制器而异?
是的。内联汇编还不是 C 标准的一部分,它因编译器而异,有时甚至在同一编译器的不同目标体系结构之间也有所不同。请参阅内联 asm 是 ANSI C 标准的一部分吗?了解更多信息。
例如,对于C51
Keil 编译器,内联汇编的语法是
...
#pragma asm
NOP
#pragma endasm
...
而 for ARM
,语法类似于
...
__asm {
NOP
}
...
您需要查看您正在使用的实际编译器的手册。
对于一些更常见的操作码,一些编译器提供了所谓的内在函数——它们可以像 C 函数一样被调用,但本质上是插入汇编代码,比如_nop_ ()
.
如果您将 Keil 用于 ARM Cortex 目标(例如 stm32),那么您很可能也在使用 CMSIS 库。它为所有汇编指令提供了可移植的宏和内联函数,如下所示:__NOP()
.