news 2026/6/10 0:35:15

简单理解:__asm(“NOP“) 和 delay 的区别

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
简单理解:__asm(“NOP“) 和 delay 的区别

我用生活中的通俗例子,把__asm("NOP")delay的区别讲得明明白白,保证新手也能懂:

先记一个核心比喻

把 CPU 想象成一个工厂工人,你的代码就是给工人的指令:

  • __asm("NOP")= 让工人原地站 1 秒钟,啥也不干(仅耗 1 秒,时间固定、无额外动作);
  • delay= 让工人原地等指定时长(比如等 1 分钟、1 小时),工人会通过 “反复站 1 秒”(软件 delay)或 “看钟表计时”(硬件 delay)来完成等待。

逐点拆解(通俗版)

对比项__asm("NOP")(空操作指令)delay(延时函数)
本质给工人的 “单条短指令”:站 1 秒就走,不啰嗦给工人的 “打包任务”:明确要求等够指定时间
耗时长短极短!只能等 “1 个最小时间单位”(比如 1 秒),多等就要重复说多次可长可短!想等 1 分钟、1 小时都可以,只需告诉它时长
精准度绝对精准!说站 1 秒就站 1 秒,不多不少分两种情况:1. 软件 delay(反复站 1 秒):大概准(可能多等 0.5 秒,因为工人要数 “站了多少次”);2. 硬件 delay(看钟表):特别准(钟表计时,不受工人动作影响)
工人忙不忙不忙!站 1 秒就继续干别的活,几乎不耽误事软件 delay:超忙!全程站着等,啥别的活都干不了;硬件 delay:不忙!工人看钟表计时,期间能正常干别的活,到点了再停下
使用场景只需要 “等一下下” 的场景(比如:工人搬完 1 块砖,站 1 秒稳一稳,再搬下一块)需要 “等很久” 的场景(比如:工人搬完砖,等 10 分钟再开始下一批活)

举 2 个实际代码例子(新手能看懂)

例子 1:用__asm("NOP")(等 “一下下”)

比如让 GPIO 引脚拉高后,需要 “稳 1 个 CPU 时钟周期”(纳秒级)再拉低,就像搬砖后稳 1 秒:

GPIO_SetBits(GPIOA, GPIO_Pin_0); // 工人:把砖搬起来(引脚拉高) __asm("NOP"); // 工人:站1秒,稳一稳(仅耗1个时钟周期) GPIO_ResetBits(GPIOA, GPIO_Pin_0); // 工人:把砖放下(引脚拉低)

这里如果不用NOP,引脚拉高后立刻拉低,硬件可能反应不过来;但也没必要等 1 分钟,只需要 “一下下”,所以用NOP最适合。

例子 2:用delay(等 “很久”)

比如控制 LED 灯亮 1 秒再灭,需要等够 1 秒,总不能写 1000000 条NOP吧?用delay一句话搞定:

LED_On(); // 工人:打开灯 delay_ms(1000); // 工人:等够1000毫秒(1秒)再干活 LED_Off(); // 工人:关掉灯

这个delay_ms(1000)就是 “打包任务”—— 如果是软件 delay,工人会反复执行 1000000 次NOP(站 1000000 次 1 秒);如果是硬件 delay,工人会看 “钟表”(定时器),等钟表走到 1 秒再关灯,期间还能顺便干别的小事。


最后总结(一句话记牢)

  • 想让 CPU “等极短的固定时间”(纳秒级、精准、不耽误事)→ 用__asm("NOP")
  • 想让 CPU “等任意长的时间”(微秒 / 毫秒 / 秒级、灵活)→ 用delay
  • delay本质上要么是 “重复执行很多次NOP”,要么是 “用定时器计时”,而NOP是 “最小的延时单位”,就像 “1 秒” 是 “1 分钟” 的最小单位一样。

绝大多数场景下 delay 不能完全取代 NOP,只有极个别简单场景能勉强替代,但代价很大

还是用之前 “工人” 的比喻,帮你彻底想通为什么 ——

先看 “能勉强替代” 的情况(但没人这么做)

比如你需要让工人 “站 1 秒稳一稳”(对应 1 条 NOP),你非要用 delay 说 “等 1 秒”,理论上工人也能完成:

// 原本用1条NOP:__asm("NOP"); delay_us(0.01389); // 72MHz CPU下,1条NOP≈13.89纳秒=0.01389微秒

但问题来了:

  1. delay 是 “打包任务”,有额外开销:工人接 “等 1 秒” 的 delay 指令时,先要花时间 “拆包”(函数调用、循环初始化、判断循环条件)—— 比如拆包就要花 0.5 秒,最后实际等了 1.5 秒,远超你要的 1 秒,硬件时序直接乱了;
  2. 精度完全不够:软件 delay 的最小单位通常是 “1 微秒”(1000 纳秒),而 NOP 是 “13.89 纳秒”—— 你要等 14 纳秒,delay 只能选 0 微秒(不等)或 1 微秒(等 1000 纳秒),差了 70 多倍,硬件根本没法用。

再看 “完全不能替代” 的 3 个核心场景(NOP 的独有价值)

场景 1:纳秒级精准时序校准(delay 做不到)

比如 SPI 通信中,CS 片选引脚拉低后,需要等20 纳秒再发数据(手册要求):

  • 用 NOP:写 2 条__asm("NOP")(2×13.89≈27.78 纳秒),精准满足要求;
  • 用 delay:软件 delay 最小只能到 1 微秒(1000 纳秒),直接超了 50 倍,SPI 数据会传错,硬件直接通信失败。
场景 2:规避编译器优化(delay 没用)

比如给硬件寄存器写指令后,编译器可能觉得 “这行代码没用”,直接删掉:

*(volatile uint32_t*)0x40001000 = 0x123; // 给硬件发指令 __asm("NOP"); // 插入NOP,编译器不敢删上面的代码

如果换成 delay:

*(volatile uint32_t*)0x40001000 = 0x123; delay_us(1); // delay是函数,编译器仍可能删掉上面的写指令

因为 delay 是 “封装函数”,编译器能识别出 “写指令和 delay 无关”,照样优化掉,而 NOP 是 “内嵌汇编”,编译器会认为 “这是硬件操作”,必须保留前面的代码。

场景 3:无额外资源占用(delay 做不到)

比如在中断服务函数里(CPU 必须快速响应,不能耗时间),需要 “稳 1 个时钟周期”:

  • 用 NOP:1 条指令,执行完立刻处理中断,耗时≈13.89 纳秒,不影响中断实时性;
  • 用 delay:哪怕是 delay_us (1),软件 delay 要循环 72 次 NOP(72×13.89≈1000 纳秒),还得加函数调用、循环判断,中断响应变慢,甚至导致其他中断卡死。

用表格总结 “为什么 delay 取代不了 NOP”

需求 / 场景NOP 能不能满足delay 能不能满足核心原因
纳秒级(<1 微秒)精准延时✅ 完美满足❌ 完全不行delay 最小单位是微秒,精度不够
无额外开销(快速执行)✅ 几乎无开销❌ 有函数 / 循环开销delay 要拆包、循环,耗时间
规避编译器优化✅ 有效❌ 无效NOP 是汇编指令,编译器不敢动
中断里的极短延时✅ 适合❌ 不适合delay 会拖慢中断响应
微秒 / 毫秒级延时❌ 代码冗余✅ 完美满足NOP 要写几百 / 几千条,难维护

最后给你一个 “选择口诀”(记牢就不会错)

  • 要 “等一下下”(纳秒级、精准、快)→ 用 NOP;
  • 要 “等很久”(微秒 / 毫秒 / 秒级、灵活)→ 用 delay;
  • delay 是 “NOP 的批量打包版”,但打包有开销,没法替代单条 NOP 的 “精准和快速”。

简单说:NOP 是 “针尖”,能扎进极细的缝隙;delay 是 “锤子”,能砸开大块的石头 —— 锤子再好用,也没法代替针尖扎缝隙,反过来也一样。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/9 17:26:52

SSH Config文件配置别名简化连接命令

SSH Config文件配置别名简化连接命令 在现代AI科研与软件开发中&#xff0c;工程师每天可能要连接多台远程服务器——实验室的GPU节点、云上的训练实例、测试环境的虚拟机。每次输入 ssh user192.168.x.x -p 2222 -i ~/.ssh/key.pem 这样的长串命令不仅繁琐&#xff0c;还容易…

作者头像 李华
网站建设 2026/6/9 17:21:47

Java线程优先级的真相:你知道它真的起作用吗?

文章目录Java线程优先级的真相&#xff1a;你知道它真的起作用吗&#xff1f;引言&#xff1a;线程优先级是个坑&#xff0c;你跳过没&#xff1f;一、什么是线程优先级&#xff1f;简单来说&#xff1a;线程优先级是“建议”&#xff0c;不是“命令”示例代码&#xff1a;设置…

作者头像 李华
网站建设 2026/6/9 0:49:01

PyTorch DataLoader多线程设置:Miniconda环境调优

PyTorch DataLoader 多线程设置与 Miniconda 环境调优实践 在当前深度学习项目日益复杂、数据规模持续膨胀的背景下&#xff0c;一个常见的瓶颈并非来自模型本身&#xff0c;而是出人意料地落在了“喂数据”这个环节。你有没有遇到过这样的情况&#xff1a;GPU 风扇呼啸运转&am…

作者头像 李华
网站建设 2026/6/9 21:29:23

收藏这篇,工作自己找上门!招聘网站全家桶网安转行捷径一次给

2025求职必备&#xff01;全网招聘网站地图零基础网络安全学习路线图&#xff08;收藏级指南&#xff09; 文章提供全面的求职指南&#xff0c;包含各类招聘平台介绍和使用技巧&#xff0c;以及零基础转行网络安全的详细路线图和学习资源。从入门到实战的学习路径&#xff0c;…

作者头像 李华
网站建设 2026/6/9 21:08:35

智造之眼:人工智能如何重塑现代工业制造

个人首页&#xff1a; VON 鸿蒙系列专栏&#xff1a; 鸿蒙开发小型案例总结 综合案例 &#xff1a;鸿蒙综合案例开发 鸿蒙6.0&#xff1a;从0开始的开源鸿蒙6.0.0 鸿蒙5.0&#xff1a;鸿蒙5.0零基础入门到项目实战 本文章所属专栏&#xff1a;《AI从0到1&#xff1a;普通人…

作者头像 李华