由flash引發對ARM架構的思考

2021-09-10 10:16:30 字數 2163 閱讀 4395

前言:1.stm32f7***x系統架構

帶著整體的框架結構去看問題、分析問題會清晰一些,首先了解一下系統結構:

圖1.1

2.nor flash為什麼可以執行**?

這句話分解一下有三點:什麼是執行?什麼是nor flash? 為什麼可以執行?

2.1.先了解下什麼是執行?

這裡的執行並不是指真正的「執行」的概念,cpu執行**的過程是流水線(pipeline)的,採用流水線的工作方式主要是為了提高計算機的執行效能(提高效能的設計方式還有並行、**,並行的概念在匯流排矩陣中有應用)。**流水線指的是:取指、解碼、執行,後兩步其實都是在cpu核心(cortex-m7)中動作的,也就是arm公司的內部技術。這裡著重分析一下取指令的過程:取指令是需要與外部互動的,arm公司也是留了介面出來,以供其他晶元廠商使用。如圖1.1中,cortex-m7留的介面有axim、ahbp、dtcm、itcm、ahbs,這些匯流排介面就是cpu與外部連線的通道,當然有取指令的通道。

說到這裡,就很有必要深究一下匯流排到底是怎麼把各個模組聯絡上的,任何cpu能訪問的位址,都是對映在這些匯流排上的。圖中上方的裝置為匯流排主裝置,右方的裝置為匯流排從裝置,它們之間有直接由匯流排連線,也有通過匯流排矩陣(並行執行,提高效能),拿其中的flash舉例說明一下過程:1. cpu取指可以通過axim匯流排和itcm匯流排,而且會將快取的指令存放在cache中,由於是哈弗結構,cache分為資料cache和指令cache,分別存放資料和指令;2.cpu是基於位元組為單位來讀寫指令的。

所以,這裡的執行,其實是cpu能夠通過匯流排以位元組為單位來讀取指定位址中的指令。

2.2什麼是nor flash?

flash 儲存器又稱為快閃儲存器,它也是可重複擦寫的儲存器。根據儲存單元電路的不同,flash儲存器又分為 nor flash(非易失性快閃儲存器) 和 nand flash,其二者特性對比如表所示:

圖2.1

2.3為什麼可以執行?而由於 nand 的資料和位址線共用,只能按「塊」來讀寫資料,假如 nand 上儲存了**指令, cpu 給 nand 位址後,它無法直接返回該位址的資料,所以不符合取指要求。 即不支援立即執行的特性(execute in place),若**儲存在nand上,可以先把它載入到ram儲存器上,再由cpu取指解碼執行。

3. 誰來管理和組織儲存裝置和外設呢?

3.1 arm公司預留了匯流排介面,那麼st公司怎麼去使用呢?晶元使用者又如何使用呢?

匯流排是主裝置(cortex-m7, dma1, dma2, mac, usb otg hs, lcd-tft)和從裝置(sram1, sram2, flash, ahbp, apb1, apb2)之間的連線線,st公司將其製作為匯流排矩陣的方式,提高了整體效能。在使用開發中,我們使用這些從裝置和外設時,需要去配置相對應的匯流排,對外設暫存器的訪問也是通過對應的匯流排來實現資料的互動。

3.2 位址是如何分布的?

arm公司將4g的實體地址空間預先定義好了粗線條的位址分類,細節的位址分布由下一級的晶元公司(st, samsung, ti……)來決定,不同的位址區域由不同的匯流排來訪問。

圖3.1

4.內部的sram分布

這裡需要注意的是:368k的sram1(基位址0x20020000) + 16k的sram2(基位址0x2007c000) + 128k的dtcm(基位址0x2000000)一起組成了512k的內部系統sram。其中的資料緊耦合儲存區是不需要經過i-cache和d-cache的(但是要經過i-code,d-code匯流排),執行時也是非常的高效能,通常放一些對時間要求較高的**;sram1/sram2是用來存放全域性資料,棧和堆中的資料,通過匯流排矩陣以及cache來訪問資料。

由記憶體分割槽引發對堆疊的思考

前言 在c語言程式設計中,程式中的不同 和資料在編譯或者執行時處於ram的不同位置,是大家熟悉的記憶體分割槽的概念。1.stm32f769晶元內的sram整體分割槽情況 區和常量區是唯讀,在執行過程中是不能進行寫操作的,可以將其放在nor flash中,而棧區 堆區 全域性區中的資料是可讀可寫,而且...

由 引發的思考

前陣子在乙個移動專案中,通過 的方式 繫結click 事件來提交乙個表單,由於表單資訊比較敏感,於是採用的post 同步提交的方式,原本到也沒有什麼。後來萬惡的pm說 你這個按鈕呀,要固定在底部比較好 於是乎就通過 position fixed 固定到底部了。那麼,問題來了 在ios 下,虛擬鍵盤是...

由Typedef引發的問題

由typedef 引發的問題 自 用來宣告乙個別名,typedef 後面的語法,是乙個宣告。本來筆者以為這裡不會產生什麼誤解的,但結果卻出乎意料,產生誤解的人不在少數。罪魁禍首又是那些害人的教材。在這些教材中介紹 typedef 的時候通常會寫出如下形式 typedef int para 這種形式跟...