走進倉庫(記憶體)

2021-09-26 04:51:15 字數 2687 閱讀 1798

前面寫完**後,直接送到車間就可以執行。arm是流水線工作,記憶體只是存放**的場所,那麼cpu是如何跟記憶體打交道的呢?(計算機組成原理知識)

組成原理很理論的描述了它們之間的關係。但是並沒有針對arm做分析。其實只需要搞懂下面幾個問題:

① 記憶體如何存放程式(擺放)

② cpu如何訪問記憶體(讀寫)

晶元結構圖:

cpu不會直接與外設打交道,它只管發指令,中間還隔了乙個記憶體控制器(秘書),秘書會將cpu指令發到合適的控制器上,例如:gpio控制器負責控制引腳的輸入輸出。sdram等由於是記憶體,所以直接接收記憶體控制器發出的命令。咦?會不會畫錯呢,為什麼sdram等於nandflash不同呢,是的,nandflash雖然是儲存器,但是它不參與cpu統一編址。

自問自答:

記憶體控制器如何管理這些介面呢?這個跟晶元特性有關。

圖中分為程式使用nandflash和程式不使用nandflash的記憶體對映

當選擇nor flash啟動時,cpu發出的指令的位址範圍處於0x0000000 - 0x06000000,記憶體控制器就會使ngcs0處於低電平(片選引腳被選中),nor flash被選中。

當cpu發出的指令的位址範圍處於0x20000000 - 0x26000000,記憶體控制器就會使ngcs4處於低電平(片選引腳被選中),網絡卡被選中。

當cpu發出的指令的位址範圍處於0x30000000 - 0x36000000,記憶體控制器就會使ngcs6處於低電平(片選引腳被選中),sdram被選中。

記憶體控制器根據不同的位址位址範圍,發出不同的片選引腳,只有被片選引腳選中的晶元才能正常工作,不被選中的晶元就像不存在一樣,不工作。

gpio/閘電路介面、協議類介面、記憶體類介面都屬於cpu的統一編址。對於nand flash,在原理圖上它的位址線並沒有連線到cpu,因此它不參與cpu的統一編址。但它的資料線也接到了資料匯流排上,為了防止干擾,它也有乙個片選訊號(ce)。當cpu訪問nand flash時,nand flash控制器才會片選nand flash,讓其接收資料匯流排上的資料。

關於記憶體與cpu關係的理論知識就談這麼多,還是從實踐中學習吧!!!

記憶體與晶元之間又該如何連線呢?

看到沒有,僅乙個norflash就需要這麼多位址線,這個位址線跟記憶體大小有關。還有其它的記憶體模組,它們也是需要位址線的。所以設定記憶體控制器不是沒有道理的。

光知道怎麼連線時沒有任何鳥用的,如何用起來才是關鍵。對於這種有晶元手冊的,需要看外設本身的手冊,還有看處理器的手冊。

看外設本身的手冊時為了確定命令時序,如何讀寫都是在這個裡面規定的。

看處理器手冊是確定哪些暫存器來控制時序。

norflash讀時序

處理器時序產生圖

這兩個圖怎樣理解呢?

處理器給出的時序圖是通用的時序圖,具體要操作哪個外設需要根據外設給出的時間特性來設定其中對應的值。

**描述了各個時間引數的意義。

trc表示在位址發出多長時間後資料有效,也就是說,發出位址資料後需要等待70ns以上

結合nor flash晶元的兩張圖,可以得到如下資訊:

為了簡單我們把位址資料(addresses),片選訊號(ce#),讀訊號(oe#),同時發出,然後讓它們都等待70ns(等待訊號有效)。對應s3c2440的nor flash控制器的讀時序圖,需要讓位址訊號a[24:0]、片選訊號ngcs、讀訊號noe同時發出,保持tacc大於等於70ns。

查閱s3c2240的參考手冊,nor flash是接在bankcon0上的,因此只需要設定bankcon0即可。

可以看到tacc上電初始值是111,對應14個clocks。系統上電採用12mhz的晶振,hclk=12mhz,tacc=(1000/12*14)≈1166ns,這個值很大,幾乎可以滿足所有nor flash的要求。

啟動後,將hclk設定為100mhz,t=1000/100=10ns,tacc需要大於等於70ns,因此設定tacc等於101,8個clocks即可。

**很簡單

#include "s3c2440_soc.h"

void bank0_tacc_set(int val)

#include "s3c2440_soc.h"

#include "uart.h"

#include "init.h"

int main(void)

else

}return 0;

}

boost庫記憶體池使用

記憶體池 memory pool 是一種記憶體分配方式。通常我們習慣直接使用new malloc等api申請分配記憶體,這樣做的缺點在於 由於所申請記憶體塊的大小不定,當頻繁使用時會造成大量的記憶體碎片並進而降低效能。記憶體池則是在真正使用記憶體之前,先申請分配一定數量的 大小相等 一般情況下 的記...

git 忽略已在倉庫內的檔案

gitignore作用於未新增入庫的檔案 資料夾 意為 git 假裝看不到該檔案的改動 作用於本地不想上傳的檔案,僅在本地適用,如個人的配置檔案等。git update index assume unchanged git update index no assume unchanged 將檔案徹底...

Git本地倉庫內部基本結構

git本地倉庫 本文不涉及遠端倉庫 的內部結構簡單如下圖 1.objects目錄存放的是實際的檔案,當git add命令執行的時候,檔案已經被存到了objects目錄下。git objects目錄下的物件都有乙個40位的id,前兩位作為目錄名,後38位作為檔名 git objects ls00 06...