[STM32]功耗研究报告1:指令功耗

前提:

STM32F429IGT6开发板,有基础功耗。

3.3V供电,不开超载,VOS为默认的Scale 1模式,室温20摄氏度。

系统时钟168M,AHB时钟168M,APB2高速外设时钟84M,APB1低速外设时钟42M。

电流测试设备精度1mA。


[STM32]功耗研究报告1:指令功耗

实验环境实拍图片


跳转指令数据结论:

1、BX 比 B 低12mA, BLX 比 BL 低13mA

2、B 比 BL 低1mA,BX 比 BLX 低1mA

3、B 比 B.W 低2mA

4、【B Lable】的等效命令【LDR R0,=Lable】【BX R0】。相同的时间内,后者比前者低9mA,但是后者要慢一半速度。在裸奔的main里面,经常有while(1);这种语句,用后者实现功耗会小很多。


赋值指令数据结论:

1、MOV R0, R0

比 NOP 低3mA,因此空指令不要用NOP

2、MOV R0, R0 比 MOV R0, R1 低1mA

3、MOV R0, R0 比 MOV R0, PC 要低4mA

4、MOV R0, #0x12 和 MOVT R0, #0x12 功耗相同

5、MOV R0, #0x12 比 LDR R0, [PC, #256] 要高8mA

6、MOV R0, R1 比 LDR R0, [PC, #256] 高2mA

7、LDR R0, [PC, #256] 比 LDR R0, [PC] 要高4mA

8、LDR R0, [PC, #imm] 立即数imm为4的倍数时,imm越大,功耗越高。

9、LDR R0, [PC, #imm] 立即数imm不为4的倍数时,功耗急剧增加。(只为2的倍数也会急剧增加)

10、LDR R0, [R1] 比 LDR R0,[PC] 要高13mA,因此尽量用相对于PC的加载读取内存

11、LDR R0,[R1] 和 STR R0,[R1] 功耗相同,即内存读写功耗在mA精度上相同。


指令所在地址和功耗的关系,数据结论:

1、指令都是顺序执行的,只有跳转指令能够实现一直在同一地址执行。因此本结论只针对跳转指令,其他指令可能适用可能不适用。

2、指令地址和功耗的关系以16字节循环:地址结尾是0,功耗最低;结尾是2,功耗更高;随着地址的增加,功耗呈现波动形,但是都肯定比0地址的要高。

3、B {PC} 指令,在不同地址的功耗,以0地址开始,地址递增2,对应的电流如下:

92, 94, 93, 94, 96, 98, 104, 104, 下一个循环 92, 94 ... ...

4、B {R5}指令,R5指向本条指令的地址。以0地址开始,递增2,对应电流如下:

82, 83, 83, 83, 91, 92, 122, 121, 下一个循环 82, 83 ... ...

5、分析3,4可看到,指令处于0地址功耗最低,处于2,4,6地址的时候,功耗增加不多,后续地址功耗急剧增加。


软件开发指导结论:

1、BX和BLX可以完全取代B和BL。实现相同的功能,BX需要额外一个寄存器赋值的操作,消耗时间和功率都会比B要多。但是在相同时间内,BX实现方式的功耗要更低。如果某段代码,执行越快越有用,则优先用B,比如采集计算的代码。如果某段代码,不需要执行效率,则用BX,比如main里的while(1),又比如IDLE任务。

2、LDR R0, [PC, #imm] 方式给寄存器赋值,功耗,空间和速度都比用MOV方式要好,因此优先使用。LDR R0, =0x12这种伪指令会生成MOV R0,0x12指令,在对功耗要求较高的情况下不要使用,需要自己分配文字池实现。遗留问题:编译器是否有选项可以强制LDR R0, =0x12生成LDR指令?

3、自己分配文字池,保证所有常量的存放地址和使用地址比较近。保证LDR R0, [PC, #imm]中的imm尽量小。

4、LDR和STR读写命令必须是4的倍数。CORTEX-M3支持非对齐访问,但会导致运行时间和功耗的成倍增加。

5、运行频率最高的代码段,比如高频中断,SYSTICK中断,常用逻辑等,使用汇编优化编写。

6、频率非常高的指令,放在16字节对齐的位置。


实例,芯片初始化完成后跳转到main函数:


[STM32]功耗研究报告1:指令功耗

优化和功耗对比


相关代码:

链接:https://pan.baidu.com/s/1pED2qo1brgQx5Mxovds8Uw

提取码:ngy1


下一篇,功耗研究报告2,电源,频率,VOS等对功耗的影响。敬请期待。


分享到:


相關文章: