等效于嵌入式 C 中的 NOP?

Posted

技术标签:

【中文标题】等效于嵌入式 C 中的 NOP?【英文标题】:Equivalent for NOP in C for Embedded? 【发布时间】:2014-11-03 22:50:50 【问题描述】:

我用KEIL编译一个程序。

程序使用代码

asm("NOP");

很遗憾,KEIL 编译器不接受该语句。

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

在 C 中 this 的实际等价物是什么?这是否因我使用的嵌入式控制器而异?

【问题讨论】:

一些嵌入式编译器提供了一个内在函数__delay_cycles(constant),它发出代码以等待多个周期。但是,我不确定 Keil 编译是否可以。 什么目标? - Keil 的 ARM 工具使用 ARM 的编译器(除非它真的很老,在 Keil 被 ARM 收购之前),而对于其他目标,他们使用自己的编译器。两者之间的专有扩展不同。然而,所有人都将有一种嵌入内嵌汇编器的方法;请参阅用户手册了解内联汇编语法,并将您的处理器指令集参考为适当的无操作指令。 【参考方案1】:

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

见 - https://www.keil.com/support/man/docs/armcc/armcc_chr1359124998347.htm

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

【讨论】:

请更新链接,已失效。 @Balamurugan - 谢谢,已更新【参考方案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_ ()

【讨论】:

内联汇编器实际上是在 C++ 中标准化的,使用原始问题中的语法。可悲的是,C 尚未对其进行标准化。因此,最好将内联汇编器隐藏在函数或宏中,以便封装它。如果以后将代码移植到不同的编译器或CPU上,只需要重写封装的部分即可。【参考方案3】:

如果您将 Keil 用于 ARM Cortex 目标(例如 stm32),那么您很可能也在使用 CMSIS 库。它为所有汇编指令提供可移植宏和内联函数,如下所示:__NOP()

【讨论】:

以上是关于等效于嵌入式 C 中的 NOP?的主要内容,如果未能解决你的问题,请参考以下文章

用于自定义文档的嵌入式查看器 API

将嵌入式 Oracle JVM 中运行的 Java 按名称授予 Oracle 目录的等效语法是啥?

面向(嵌入式 C/C++)开发人员的 Eclipse IDE 2020-12:经典深色主题深黑色背景和菜单中的文本

mJS:适用于C/C++的嵌入式JavaScript引擎

Python - C 嵌入式分段错误

等效于 Julia 中的 c\c++ 编译器指令