新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > STM32的代碼,跑在RAM里快?還是跑在Flash里快?

        STM32的代碼,跑在RAM里快?還是跑在Flash里快?

        作者: 時間:2016-12-02 來源:網絡 收藏
        這肯定是很多人關心的問題,下面通過一個例子看看會有什么樣的結論:
        測試手段如下:
        主循環(huán)一直在做一個變量的自加(sum1++),當然前提保證不會溢出。
        用Cortex-M3內部的Systick計數,以一秒鐘為限,這個sum1的數值大小,可以判斷哪種方式比較快。為了嚴密,我們觀察第一秒到第二秒之間的計數效果;而不是從第0秒到第1秒(因為使能Systick到真正開始執(zhí)行sum1++可能有間隙)。在第一次進入Systick的ISR時,記錄下sum1的值;第二次進入Systick的ISR時,再次記錄sum1的值,兩次值之差即為一秒鐘間隔中sum1執(zhí)行了多少次自加。由此看出哪種方式比較快。
        同樣的測試前提:Prefetch Buffer Enable + Flash Latenty="2" (根據Flash Programming Manual中要求的那樣,當48MHz
        測試結果如下:
        不對代碼優(yōu)化,在RAM中執(zhí)行程序:sum1計數69467/秒
        不對代碼優(yōu)化,在FLASH中執(zhí)行程序:sum1計數43274/秒 (Flash里跑得慢)
        /***********循環(huán)體內代碼為N個以下的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]
        ......
        /****************************************************/
        打開速度優(yōu)化開關,在RAM中執(zhí)行程序:sum1計數98993/秒
        打開速度優(yōu)化開關,在FLASH中執(zhí)行程序:sum1計數115334/秒 (Flash里跑得快)
        /***********循環(huán)體內代碼為N個以下的block*************/
        (1)LDR R1,[R1,#4]
        (2)ADDS R1, R1,#0x1
        (3)STR R1,[R0, #0]
        ......
        /****************************************************/
        結論就是:
        1)程序運行在RAM里速度快還是運行在Flash里速度快,不是絕對的一概而論的,取決于代碼;
        2)就以上兩種具體的代碼情況來說,我覺得無優(yōu)化時,如果在Flash里執(zhí)行:(1)(2)的取指(讀flash)->譯碼->執(zhí)行 (讀flash);取指和執(zhí)行階段flash的目標地址不是連續(xù)的,因此是non-sequencial access,所以會很慢;
        打開優(yōu)化時,(1)(2)(3)都不會造成flash的non-sequential access,所以在flash里的優(yōu)勢(取指和取數據走不同的總線ICode和DCode以及Prefetch)就體現(xiàn)出來了。
        再進一步的分析,又有這樣一些結論:
        沒有優(yōu)化時,指令執(zhí)行時要到Flash中取常數,結果造成指令預取隊列的取指中斷,取完常數后需要重新填充指令預取隊列,而Flash訪問需要插入等待周期,當然時間就比較長了。
        經過代碼優(yōu)化后,指令執(zhí)行時不用再到Flash中取常數,指令預取隊列不會被打斷,而Flash訪問需要插入等待周期的效應被下面貼子中介紹的取指緩沖區(qū)抵消,所以自然速度就快了;而這個時候在RAM中執(zhí)行反而慢了是因為RAM不在ICode總線上,從RAM取指需要繞一圈,當然要比在ICode總線上的Flash慢了。
        關于Flash的性能,請看我的另一篇分析:【分析】STM32從Flash中運行程序的時序分析
        另外,STR9與STM32的總線架構是一樣的,這里有一個在STR9上實現(xiàn)的FFT函數的實測數據,可以進一步說明在Flash中運行代碼可以比在RAM中快!
        在ST的網站上有一個DSP的函數庫,這是它的文檔《STR91x DSP library (DSPLIB)》,在這篇文檔中有一節(jié)討論FFT運算速度的,那里給出了實際的運算時間比較,摘錄如下:
        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


        關鍵詞: STM32代碼RAMFlas

        評論


        技術專區(qū)

        關閉
        主站蜘蛛池模板: 永修县| 巫山县| 广灵县| 景德镇市| 湾仔区| 铜陵市| 肥乡县| 遂平县| 甘谷县| 安达市| 邹城市| 房山区| 手机| 乐都县| 鞍山市| 滦南县| 乌拉特中旗| 湘潭县| 卢氏县| 新建县| 铁岭市| 秦皇岛市| 张北县| 锦屏县| 庆安县| 藁城市| 沧州市| 仙桃市| 彩票| 柘荣县| 富平县| 上犹县| 榆中县| 天台县| 蕲春县| 兴义市| 盐边县| 镇安县| 秦安县| 盐源县| 武隆县|