初學MCU,C語言等知識的時候,對總線地址,ROM、RAM,flash,特殊暫存器等等都只是表面理解,突然想總結一下這幾年的理解,
RAM:
首先RAM是我們常人理解的運行記憶體,存盤在這里面的內容斷電以后就沒了,再次上點以后就要重新開始了,
那么我們思考再寫單片機程式的時候,哪些東西是掉電以后就沒了呢,
自然是我們的變數,但要只是是可以讀寫的變數哦,如果是只讀變數也就是常量是存盤在ROM空間的,
那我們再分一下可以讀寫的變數包含哪些;
不同的關鍵字修飾它可能就會不太一樣,
常用的static變數,全域變數,區域變數這些都是再RAM內,但是RAM可以分為三個區域,堆、堆疊、靜態存盤區;
1、堆 由程式員自動分配(malloc)以及釋放,這里的釋放很關鍵,一定要在使用完成后釋放記憶體(free)!!!
2、堆疊 編譯器自動分配的,我們的區域變數,函式的一些形參都會存盤在這個區域
3、靜態存盤區:這里存放的就是初始化的全域變數和static修飾的變數,這里注意只要是static修飾的變數都是存放在靜態存盤區的,
ROM/FLASH
關于ROM和flash,flash是ROM的一種;
所有的常量,只讀變數,還有代碼都是存盤在flash的,
大師匈碰到的問題:
前段時間在用一家國產的MCU,RAM空間比較小,大師兄在做一個加密演算法的時候碰到了空間不夠用的情況,
通過計算代碼的RAM占用情況,應該是夠用的,但是結果卻不夠用,
是因為原廠把flash分為了倆個區域,編譯器不能自動分配這倆個地址池,需要加關鍵字bank去修飾,程式員自己去分配,
還有就是因為編譯器做的不好,所以在C語言的情況下,有很多比較方便的寫法,但是涉及到直接尋址和間接尋址的關系,需要比較啰嗦,分開去寫,效率會更高,印象很深的是要注意不能多次傳參,受到他們堆疊級數的約束,
所以要參考他們給到的一些示意例程去寫,提高效率合理使用,
國產MCU或者是芯片這方面還需要加油,,,,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/198954.html
標籤:其他
下一篇:邊緣計算與物聯網
