[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等對功耗的影響。敬請期待。


分享到:


相關文章: