初學mcu,c語言等知識的時候,對匯流排位址,rom、ram,flash,特殊暫存器等等都只是表面理解。突然想總結一下這幾年的理解。
首先ram是我們常人理解的執行記憶體。儲存在這裡面的內容斷電以後就沒了,再次上點以後就要重新開始了。
那麼我們思考再寫微控制器程式的時候,哪些東西是掉電以後就沒了呢。
自然是我們的變數,但要只是是可以讀寫的變數哦,如果是唯讀變數也就是常量是儲存在rom空間的。
那我們再分一下可以讀寫的變數包含哪些;
不同的關鍵字修飾它可能就會不太一樣。
常用的static變數,全域性變數,區域性變數這些都是再ram內,但是ram可以分為三個區域。堆、棧、靜態儲存區;
1、堆 由程式設計師自動分配(malloc)以及釋放,這裡的釋放很關鍵,一定要在使用完成後釋放記憶體(free)!!!
2、棧 編譯器自動分配的,我們的區域性變數,函式的一些形參都會儲存在這個區域
3、靜態儲存區:這裡存放的就是初始化的全域性變數和static修飾的變數,這裡注意只要是static修飾的變數都是存放在靜態儲存區的。
關於rom和flash,flash是rom的一種;
所有的常量,唯讀變數,還有**都是儲存在flash的。
前段時間在用一家國產的mcu,ram空間比較小。大師兄在做乙個加密演算法的時候碰到了空間不夠用的情況。
通過計算**的ram占用情況,應該是夠用的,但是結果卻不夠用。
是因為原廠把flash分為了倆個區域,編譯器不能自動分配這倆個位址池。需要加關鍵字bank去修飾,程式設計師自己去分配。
還有就是因為編譯器做的不好,所以在c語言的情況下,有很多比較方便的寫法,但是涉及到直接定址和間接定址的關係,需要比較囉嗦,分開去寫,效率會更高。印象很深的是要注意不能多次傳參,受到他們堆疊級數的約束。
所以要參考他們給到的一些示意例程去寫。提高效率合理使用。
國產mcu或者是晶元這方面還需要加油。。。。
go語言的一些經驗理解
注 go build是將原始碼檔案編譯成乙個二進位制的可執行檔案,如go build test.go可以在test.go所在的imooc檔案目錄下生成乙個test可執行檔案。只需.test便可輸出執行結果。go run則是將程式直接執行並輸出結果,不會生成二進位制可執行檔案。2 我們要保證我們執行編...
關於C語言記憶體的一些理解
記憶體這個大話題 key 心裡一定要有記憶體的邏輯圖。程式是什麼?程式 資料 放在flash中 段,可變的資料 全域性變數 區域性變數 放在記憶體中。執行程式的目的是什麼?得到執行結果 關注執行過程 既要結果又要過程 為什麼需要記憶體?程式中有可變資料 全域性變數 區域性變數 這些可變資料就是放在記...
堆疊的一些理解
堆疊是一種執行 後進先出 演算法的資料結構。設想有乙個直徑不大 一端開口一端封閉的竹筒。有若干個寫有編號的小球,小球的直徑比竹筒的直徑略小。現在把不同編號的小球放到竹筒裡面,可以發現一種規律 先放進去的小球只能後拿出來,反之,後放進去的小球能夠先拿出來。所以 先進後出 就是這種結構的特點。堆疊就是這...