STM32的代碼,跑在RAM里快?還是跑在Flash里快?
測(cè)試手段如下:
主循環(huán)一直在做一個(gè)變量的自加(sum1++),當(dāng)然前提保證不會(huì)溢出。
用Cortex-M3內(nèi)部的Systick計(jì)數(shù),以一秒鐘為限,這個(gè)sum1的數(shù)值大小,可以判斷哪種方式比較快。為了嚴(yán)密,我們觀察第一秒到第二秒之間的計(jì)數(shù)效果;而不是從第0秒到第1秒(因?yàn)槭鼓躍ystick到真正開(kāi)始執(zhí)行sum1++可能有間隙)。在第一次進(jìn)入Systick的ISR時(shí),記錄下sum1的值;第二次進(jìn)入Systick的ISR時(shí),再次記錄sum1的值,兩次值之差即為一秒鐘間隔中sum1執(zhí)行了多少次自加。由此看出哪種方式比較快。
同樣的測(cè)試前提:Prefetch Buffer Enable + Flash Latenty="2" (根據(jù)Flash Programming Manual中要求的那樣,當(dāng)48MHz
測(cè)試結(jié)果如下:
不對(duì)代碼優(yōu)化,在RAM中執(zhí)行程序:sum1計(jì)數(shù)69467/秒
不對(duì)代碼優(yōu)化,在FLASH中執(zhí)行程序:sum1計(jì)數(shù)43274/秒 (Flash里跑得慢)
/***********循環(huán)體內(nèi)代碼為N個(gè)以下的block*************/
(1)LDR R0,[PC, #0x154]
(2)LDR R1,[PC, #0x154]
(3)LDR R1,[R1,#0]
(4)ADDS R1, R1,#0x1
(5)STR R1,[R0, #0]
......
/****************************************************/
打開(kāi)速度優(yōu)化開(kāi)關(guān),在RAM中執(zhí)行程序:sum1計(jì)數(shù)98993/秒
打開(kāi)速度優(yōu)化開(kāi)關(guān),在FLASH中執(zhí)行程序:sum1計(jì)數(shù)115334/秒 (Flash里跑得快)
/***********循環(huán)體內(nèi)代碼為N個(gè)以下的block*************/
(1)LDR R1,[R1,#4]
(2)ADDS R1, R1,#0x1
(3)STR R1,[R0, #0]
......
/****************************************************/
結(jié)論就是:
1)程序運(yùn)行在RAM里速度快還是運(yùn)行在Flash里速度快,不是絕對(duì)的一概而論的,取決于代碼;
2)就以上兩種具體的代碼情況來(lái)說(shuō),我覺(jué)得無(wú)優(yōu)化時(shí),如果在Flash里執(zhí)行:(1)(2)的取指(讀flash)->譯碼->執(zhí)行 (讀flash);取指和執(zhí)行階段flash的目標(biāo)地址不是連續(xù)的,因此是non-sequencial access,所以會(huì)很慢;
打開(kāi)優(yōu)化時(shí),(1)(2)(3)都不會(huì)造成flash的non-sequential access,所以在flash里的優(yōu)勢(shì)(取指和取數(shù)據(jù)走不同的總線ICode和DCode以及Prefetch)就體現(xiàn)出來(lái)了。
再進(jìn)一步的分析,又有這樣一些結(jié)論:
沒(méi)有優(yōu)化時(shí),指令執(zhí)行時(shí)要到Flash中取常數(shù),結(jié)果造成指令預(yù)取隊(duì)列的取指中斷,取完常數(shù)后需要重新填充指令預(yù)取隊(duì)列,而Flash訪問(wèn)需要插入等待周期,當(dāng)然時(shí)間就比較長(zhǎng)了。
經(jīng)過(guò)代碼優(yōu)化后,指令執(zhí)行時(shí)不用再到Flash中取常數(shù),指令預(yù)取隊(duì)列不會(huì)被打斷,而Flash訪問(wèn)需要插入等待周期的效應(yīng)被下面貼子中介紹的取指緩沖區(qū)抵消,所以自然速度就快了;而這個(gè)時(shí)候在RAM中執(zhí)行反而慢了是因?yàn)镽AM不在ICode總線上,從RAM取指需要繞一圈,當(dāng)然要比在ICode總線上的Flash慢了。
關(guān)于Flash的性能,請(qǐng)看我的另一篇分析:【分析】STM32從Flash中運(yùn)行程序的時(shí)序分析
另外,STR9與STM32的總線架構(gòu)是一樣的,這里有一個(gè)在STR9上實(shí)現(xiàn)的FFT函數(shù)的實(shí)測(cè)數(shù)據(jù),可以進(jìn)一步說(shuō)明在Flash中運(yùn)行代碼可以比在RAM中快!
在ST的網(wǎng)站上有一個(gè)DSP的函數(shù)庫(kù),這是它的文檔《STR91x DSP library (DSPLIB)》,在這篇文檔中有一節(jié)討論FFT運(yùn)算速度的,那里給出了實(shí)際的運(yùn)算時(shí)間比較,摘錄如下:
Radix-4
Complex FFT Operation Mode Cycle Count Microseconds
64 Point Program in Flash & Data in SRAM 2701 28.135
64 Point Program & Data in SRAM 3432 35.75
64 Point Program & Data in Flash 3705 38.594
256 Point Program in Flash & Data in SRAM 13740 143.125
256 Point Program & Data in SRAM 18079 188.323
256 Point Program & Data in Flash 19908 207.375
關(guān)鍵詞:
STM32代碼RAMFlas
相關(guān)推薦
技術(shù)專(zhuān)區(qū)
- FPGA
- DSP
- MCU
- 示波器
- 步進(jìn)電機(jī)
- Zigbee
- LabVIEW
- Arduino
- RFID
- NFC
- STM32
- Protel
- GPS
- MSP430
- Multisim
- 濾波器
- CAN總線
- 開(kāi)關(guān)電源
- 單片機(jī)
- PCB
- USB
- ARM
- CPLD
- 連接器
- MEMS
- CMOS
- MIPS
- EMC
- EDA
- ROM
- 陀螺儀
- VHDL
- 比較器
- Verilog
- 穩(wěn)壓電源
- RAM
- AVR
- 傳感器
- 可控硅
- IGBT
- 嵌入式開(kāi)發(fā)
- 逆變器
- Quartus
- RS-232
- Cyclone
- 電位器
- 電機(jī)控制
- 藍(lán)牙
- PLC
- PWM
- 汽車(chē)電子
- 轉(zhuǎn)換器
- 電源管理
- 信號(hào)放大器
評(píng)論