當(dāng)前位置:首頁 > 技術(shù)學(xué)院 > 技術(shù)前線
[導(dǎo)讀]ROM和RAM是人盡皆知的概念。即:RAM(random access memory)隨機存儲內(nèi)存 ,這種bai存儲器在斷電時du將丟失其存儲內(nèi)容,故主要用于存儲短時間使用的程序。ROM(Read-Only Memory)只讀內(nèi)存 ,是一種只能讀出事先所存數(shù)據(jù)的固態(tài)半導(dǎo)體存儲器。

一個嵌入式項目在立項時,其中有個重要的環(huán)節(jié)就是對系統(tǒng)所需的RAMROM用量進行評估,在滿足系統(tǒng)需求的前提下,盡量降低硬件成本,據(jù)說同等大小的RAM價格大概是ROM的6倍。

ROM和RAM是人盡皆知的概念。即:RAM(random access memory)隨機存儲內(nèi)存 ,這種bai存儲器在斷電時du將丟失其存儲內(nèi)容,故主要用于存儲短時間使用的程序。

ROM(Read-Only Memory)只讀內(nèi)存 ,是一種只能讀出事先所存數(shù)據(jù)的固態(tài)半導(dǎo)體存儲器。

而當(dāng)一個嵌入式項目在立項時,其中有個重要的環(huán)節(jié)就是對系統(tǒng)所需的RAM和ROM用量進行評估。

在滿足系統(tǒng)需求的前提下,盡量降低硬件成本,據(jù)說同等大小的RAM價格大概是ROM的6倍。

大部分的資料都宣稱程序分為RO、DATA、BSS等段,RO段應(yīng)該放在ROM里,DATA段放在RAM里云云。對于DATA、BSS,這些段因為有頻繁的寫操作,所肯定要放到RAM里,但是只讀數(shù)據(jù)(包括代碼段)必須放在ROM里嗎?答案是不一定。

RAM和ROM等存儲單元的物理地址映射是由做硬件的數(shù)字工程師確定,他們在劃分時主要會考慮電路的延遲,將這些儲存單元按照一定的方式掛在同一條AHB總線上。而嵌入式平臺軟件工程師可以通過修改鏈接腳本來設(shè)置哪些數(shù)據(jù)、代碼在程序運行時放在ROM里,哪些放在RAM里.

這里多說一句,RAM在系統(tǒng)剛上電的時候,其內(nèi)容是隨機的。所謂的數(shù)據(jù)、代碼放在RAM里,是指在初始化時,CPU從flash里讀下載的bin文件,也有的平臺下載的是hex文件,找出其中的ram段,以類似于memcpy的方式將數(shù)據(jù)從bin文件里的對應(yīng)位置拷貝到RAM映射到的物理地址里,這才是所謂的放在RAM里.

RAM分為很多種,關(guān)于SRAM、DDR、SDRAM、PSRAM等等的概念請自行百度,從軟件的角度籠統(tǒng)一點,分為片內(nèi)和片外ram。對于軟件工程師的來說,它們的區(qū)別就是訪問速度,片內(nèi)ram一般用TCM(Tightly Coupled Memory)的方式集成在CPU芯片內(nèi)部,有單獨的數(shù)據(jù)通道,它的訪問速度可以和cache相媲美,而片外ram的訪問要麻煩一些,CPU發(fā)出想訪問的地址給AHB總線控制器,它會知道對應(yīng)的地址是在片外RAM里,將訪問請求遞給RAM控制器,再由RAM控制器訪問RAM后將數(shù)據(jù)返回。

大體上片內(nèi)的訪問速度是片外RAM的1.5~2倍。片內(nèi)ram集成在CPU芯片內(nèi)部,它是在CPU設(shè)計時就加上的,它使用和CPU幾乎一樣的制作工藝和材料,而且增加了芯片的大小,所以成本比較高,一般也就只有幾十K字節(jié),好鋼當(dāng)然要用在刀刃上,片內(nèi)ram用來存放中斷處理handler、RTOS調(diào)度器、任務(wù)上下文切換、內(nèi)存分配釋放等使用頻率最高的代碼和中斷堆棧這種讀寫頻率極高的內(nèi)存區(qū),如果有多余的部分也可以放一些經(jīng)常被引用到的全局變量。

片外RAM一般就是采購的市面上的成品,如Samsung,Hynix,Apmemory等,價格相對便宜,其容量的可選范圍也較為寬松,從幾M到幾G的都有,它可以用來存儲全局變量,bss,以及我們常用到的malloc所分配的堆空間等。 還有一點不同的是:片內(nèi)Ram上電就可以直接使用,而片外的RAM都需要一個硬件控制器完成對其時序的控制,軟件人員則需要對該控制器編寫專用的控制驅(qū)動

ROM一般是有兩種,一種是指集成在CPU芯片內(nèi)部的一塊只讀存儲區(qū)域,一般是幾K到幾十K字節(jié)大小,用來存儲系統(tǒng)剛上電時對cpu和一些核心外設(shè)(如時鐘,串口,MMU、DRAM、Flash等)進行初始化的代碼,它在程序運行中也是不可寫的,要對它執(zhí)行寫操作只能使用硬件燒寫器進行,也就是一般所說的下載程序,這部分的代碼在芯片測試階段可以進行編程器下載更新,量產(chǎn)后一般就會固化,不能做任何修改的。

另一種指的就是flash。首先需要說明的是,很多做嵌入式應(yīng)用開發(fā)的同學(xué)一直把flash比作PC上的硬盤,其實它們指的是Nand flash,而對于很多小型的嵌入式系統(tǒng),就只有一個2M或者4M的Nor Flash,它和硬盤有一個顯著的區(qū)別:flash里存放的代碼是可以由CPU直接取指并執(zhí)行的,而PC上硬盤里的程序都需要加載到內(nèi)存里才能運行。

flash并不是絕對的運行時不可寫,有時候應(yīng)用程序需要保存一些配置信息到flash里,類似于PC程序的配置文件,以保證掉電了之后它的內(nèi)容不會丟失,下次開機時可以直接從flash讀取到。

不過,flash的寫操作要比RAM麻煩的多了,flash在寫之前需要發(fā)送多個命令字來握手,還要先對即將要寫的地址所在的扇區(qū)進行整體擦除,就是把該扇區(qū)里的內(nèi)容全設(shè)為1,所謂寫flash就是把其中的一些bit設(shè)為0;更要命的是,flash的每個獨立bit位的寫次數(shù)是有上限的,市面上大部分的產(chǎn)品都只能寫10~100萬次。多說一句,每個bit位的壽命是獨立的,如果一個bit位在擦除和寫的動作中,它的值始終為1,則不會有影響;例如反復(fù)對一個地址寫0xF0,則不會影響高4bit的壽命,而低4bit每次都要先擦成1,再寫入0,這樣就會降低其壽命。

現(xiàn)在我們討論一下RO、DATA、BSS到底應(yīng)該放在RAM里還是ROM里。

首先考慮一下,有沒有什么東西必須放在ROM里? 當(dāng)然有,引導(dǎo)程序(系統(tǒng)的初始化代碼)就必須放到ROM里。在CPU剛上電時,只能去一個默認的地址去取第一條指令,開始干活,這個地址都是映射到片內(nèi)的ROM里,原因很簡單,此時,作為外設(shè)的flash和DDR等都還沒有初始化,CPU根本無法從它們那里讀寫數(shù)據(jù),片內(nèi)ROM里的這些代碼就需要完成這些模塊的初始化。另外,一個項目的處理器和主要外設(shè)確定了以后,這部分初始化代碼在很長的時間里,都不需要做任何修改的。

那有沒有什么東西必須放RAM里?當(dāng)然也有,應(yīng)用程序經(jīng)常讀寫的全局變量,堆、棧等等,都需要放在RAM里,根據(jù)訪問的頻率,將頻率最高的少量數(shù)據(jù)放到片內(nèi)ram。

只讀數(shù)據(jù)(代碼段、程序里的const、字符串等)應(yīng)該放在哪?一般來說,這些數(shù)據(jù)應(yīng)該放在Flash里,因為它們不需要被修改,而且前面提到過,rom要比ram便宜的多??赡苡腥藭幸蓡?,放在flash里,會不會讀取的速度很慢?讀ROM的速度是比讀RAM的數(shù)據(jù)要慢一點,但是不要忘了,現(xiàn)代CPU都有強大的cache,而且數(shù)據(jù)Dcache和指令I(lǐng)cache都是分開的,在系統(tǒng)運行中,cache的命中率可以高達80~90%,所以大部分時候CPU都可以在第一時間就拿到想要的指令和數(shù)據(jù)。

最后分享兩個案例:

1 前面提到片內(nèi)Ram是一塊非常寶貴的空間,它的優(yōu)點就是CPU可以在第一時間取到里面的數(shù)據(jù)。但是處于成本考慮,它的空間往往都非常有限。如果用戶有兩種比較耗時的業(yè)務(wù),需要頻繁的大量取指,但重點是它們不會同時運行。這種情況下,就可以在鏈接腳本里開辟的片內(nèi)Ram空間,將該段的鏈接選項加上NOCROSSREFS,再將這片空間的大小定義為這兩個耗時業(yè)務(wù)代碼占空間較大的那個(例,業(yè)務(wù)一有1K代碼,業(yè)務(wù)二有2K代碼,這片空間就定義為2K),在業(yè)務(wù)一開始時,將其代碼拷貝到這塊片內(nèi)ram里(一般是用DMA的方式),運行業(yè)務(wù)一的代碼;當(dāng)業(yè)務(wù)二開始時,也是拷貝其代碼到片內(nèi)ram里。這樣,兩種業(yè)務(wù)的耗時操作在運行中都可以在第一時間里取到指令,對耗時業(yè)務(wù)做了很好的優(yōu)化。

2 曾經(jīng)遇到過這樣一個運行時死機,查看CPU寄存器可以看到是報一個取指了令異常,可是查看PC寄存器對應(yīng)的地址,發(fā)現(xiàn)CPU正在取的一條指令是正常的,起初十分費解。后來通過仔細分析其死機前的運行情況才定位出原因,死機前一個task正在寫flash,這時候來了一個中斷,中斷里調(diào)用了一個函數(shù),其地址就在flash里,而此時flash處于一個不可讀的狀態(tài),CPU在執(zhí)行中斷里的函數(shù)就拿不到指令,只能死機。

解決問題的辦法有2種:一是在寫flash的過程中屏蔽所有中斷,這是一種很裸的方法,對于響應(yīng)時間很敏感的嵌入式系統(tǒng),一般都不允許隨便關(guān)中斷。二是將這個在flash里存儲的函數(shù)放到RAM里,避免訪問flash的沖突。

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉