<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > STM32從Flash中運(yùn)行程序的時(shí)序分析

          STM32從Flash中運(yùn)行程序的時(shí)序分析

          作者: 時(shí)間:2016-12-02 來源:網(wǎng)絡(luò) 收藏
          都知道STM32的CPU時(shí)鐘頻率可以達(dá)到72MHz,以后還會更快,但是由于半導(dǎo)體制造工藝的限制,存放程序的Flash存儲器不可能達(dá)到這么高的工作頻率,這樣當(dāng)CPU直接訪問Flash存儲器時(shí)必須插入等待周期以得到正確的結(jié)果。
          問題是在Flash的速度比CPU慢的情況下,是不是可以簡單地說STM32在執(zhí)行Flash中的程序時(shí)每條指令都需要插入等待周期呢?等待周期的插入對程序的執(zhí)行到底有多大的影響?請看下面的分析:
          首先,STM32的內(nèi)部Flash是組織成64位寬度,即每次可以讀出64位;在Flash與CPU的取指隊(duì)列之間有兩個(gè)緩沖器,用于暫存Flash中取出的指令,見下圖。
          其次,STM32的指令有16位的也有32位的,指令是從圖中綠色的緩沖器取出;當(dāng)綠色緩沖器變空時(shí),黃色緩沖器中的內(nèi)容會被復(fù)制到綠色緩沖器中;這樣取指與讀取Flash互不干擾。
          正因?yàn)镾TM32的指令有不同長度,所以程序執(zhí)行的等待周期與程序的內(nèi)容有關(guān)。
          圖一是假定所有指令都是16位的指令:
          1)時(shí)刻t0時(shí)黃色緩沖器和綠色緩沖器都為空,此時(shí)CPU等待3個(gè)周期后,到時(shí)刻t1時(shí)才能讀到指令;
          2)時(shí)刻t1時(shí)綠色緩沖器被填滿,黃色緩沖器仍為空,F(xiàn)lash控制器繼續(xù)讀取后續(xù)指令;
          3)時(shí)刻t2時(shí)綠色緩沖器還有兩個(gè)字節(jié),黃色緩沖器被填滿;此時(shí)因?yàn)閮蓚€(gè)緩沖器都有數(shù)據(jù),讀取Flash的操作暫停(圖一中的綠色虛線框所示);
          4)當(dāng)黃色緩沖器變空時(shí),綠色緩沖器被復(fù)制到黃色緩沖器,同時(shí)恢復(fù)讀取Flash的操作;
          5)時(shí)刻t3時(shí)緩沖器的狀態(tài)又變?yōu)樯鲜龅?)步的狀態(tài)。
          從以上分析可以看出,CPU的指令執(zhí)行是沒有等待周期的。但當(dāng)執(zhí)行跳轉(zhuǎn)指令時(shí),F(xiàn)lash緩沖器中的內(nèi)容作廢,系統(tǒng)回到了上述第1)步的狀態(tài)。
          圖二是假定每三條指令中有兩條16位的指令和一條32位的指令。這種情況下,如圖所示,CPU的指令執(zhí)行也是沒有等待周期的。
          圖三是假定所有指令都是32位的指令,從圖中可看出,CPU每執(zhí)行兩條指令,要插入一個(gè)等待周期。
          上面的分析只是針對每個(gè)CPU周期都有取指操作的情況,而實(shí)際的操作中情況并沒有這么簡單,因?yàn)镃ortex-M3的指令不都是單周期指令。
          實(shí)際的程序執(zhí)行情況是受很多因素影響的,單純靜態(tài)的分析也是不現(xiàn)實(shí)的,因此才會出現(xiàn)這么多評測的標(biāo)準(zhǔn)和數(shù)據(jù)。我們應(yīng)該以平均的性能指標(biāo)作為參考的依據(jù),而不是簡單的有沒有或有多少等待周期作為判斷的依據(jù)。


          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();