为什么插入了几条NOP指令,MCU的功耗就变了?

面包板社区 2025-09-06 09:00
资讯配图

我最近在测试一个M0+ MCU的运行功耗,测试代码采用如下最简单的方式,即main函数里只跑一个while(1)空循环,测试出来的电流是1.11mA,使用的IDE为KEIL MDK,优化等级为0

资讯配图

当我在while(1)的前面插入3条NOP指令,测出来的电流却变成了0.89mA。

资讯配图

这是怎么回事?是测量误差,还是事实就是如此?这可是足足差了200多uA啊,为此我又做了如下几个对比实验。

测试条件

功耗

优化等级0,while(1)前不加NOP

1.11mA

优化等级0,while(1)前插入1个NOP

0.90mA

优化等级0,while(1)前插入2个NOP

1.11mA

优化等级0,while(1)前插入3个NOP

0.89mA

优化等级0,while(1)前插入4个NOP

1.12mA

优化等级0,while(1)前插入5个NOP

0.91mA

优化等级0,while(1)前插入6个NOP

1.11mA

优化等级0,while(1)前插入7个NOP

0.88mA

优化等级0,while(1)前插入8个NOP

1.11mA

上述实验可以看到明显的规律,只要while(1)前插入的NOP是奇数时功耗就相对小一点(差不多都是约0.9mA),while(1)前插入的NOP是偶数时功耗就大一点(差不多都是约1.11mA)。

说到这里,我们需要来了解一下NOP指令,我之前对NOP指令的理解只停留在它可以用来做软件延时用,其实它还有一个重要的作用是实现指令对齐

资讯配图

在调试窗口下,我们看一下汇编代码

资讯配图

C代码的while(1)被汇编成了2条指令,即NOP和B,跳转指令B前自动插了一个NOP。while(1)实际上是先执行一个NOP指令,再执行B指令,B指令跳转的地址就是自身的地址,达到无限循环的效果。可以看到此时while(1)里NOP指令地址是0x00000152(十进制338),B指令地址是0x00000154(十进制340)。

当while(1)前插入奇数条NOP指令后,while(1)对应的指令地址会改变。

资讯配图

指令地址的变化为什么会影响功耗呢?这又得需要提一下CPU执行指令的过程。

资讯配图

CPU内部一直重复执行着 Fetch(取指令)–> Decode(指令译码)–> Execute(执行指令)的过程。

CPU在执行程序取指令的时候,每次按照Flash 4字节对齐的方式从Flash一次读32bit的指令,如果while(1)前插入偶数(包括0)个NOP指令,那么CPU在执行while(1)时,需要从Flash读取2次32bit内容再Decode去执行。如果while(1)前插入奇数个NOP指令,那么CPU在执行while(1)时,只需要从Flash读取1次32bit内容即可。就是这个地方的差异会引起功耗的差异,前者要执行更多的操作所以功耗更大一点。

此外如果while(1)前不加入NOP,但是把优化等级调到最高,此时while(1)里 B指令前就不会插入一条NOP指令,这时B指令的地址为0x00000152,这时效果和不开优化等级、while(1)之前插入奇数个NOP一样,功耗也会低一点。道理其实是一样的,因为while(1)的执行只需要从0x150地址取一次指。

资讯配图

最后我还做了一个实验,就是把程序放到了RAM里,不管while(1)前加多少NOP,功耗都是一样,都是0.58mA。程序在RAM里,就不用从Flash里读程序了,所以功耗更低。
利用功耗的不同去做破解的行为,也是类似的原理。
以上分析仅是猜测,因为不了解MCU内部的运行细节,如果不对之处,欢迎大家指正。

扫码加入

单片机技术交流群

资讯配图


END


热门推荐:

保险丝与TVS到底哪个放在前面,哪个放后面?两群工程师吵了起来!

暴利产品,就这样轻易被破解

拆个电信机顶盒,教科书级的硬件设计降低成本案例!

为什么经常要求MOS管快速关断,而不要求MOS管快速开通?

为什么MOS 管需要驱动电路?

电池采样电路有异常?差点提桶跑路。。。

瞎蒙!电源纹波大,换电感能行吗?

我是电子圈里最牛的点灯大师、最亮的仔!

硬件工程师不懂报价,别接私活!不然...

资讯配图

声明:内容取材于网络,仅代表作者观点,如有内容违规问题,请联系处理。 
MCU
more
除了内卷和价格战,国产MCU还剩下什么?
限速25km/h!电动两轮车新国标落地,MCU 如何应对?
4个问题,理解MCU的启动原理
百万出货的激光雷达芯片;恩智浦全球首款16nm FinFET工艺车规MCU;飞安级电流放大芯片;无人机电动车通吃的电机驱动芯片。
极海G32A1465汽车通用MCU的多维度测评【国产MCU专栏 第119期】
有那么点详细的CW32学习笔记【国产MCU专栏 第120期】
有奖直播 | 瑞萨电子 RA MCU 线上峰会
工业与汽车回暖,上半年本土MCU好起来了
TI 原厂免费培训报名:最新架构DSP+MCU C2000™(8月28日深圳 9月11日北京)
有奖直播:TI 新增强型MSPM0C/H系列MCU助力精简系统设计
Copyright © 2025 成都区角科技有限公司
蜀ICP备2025143415号-1
  
川公网安备51015602001305号