單片機(jī)flash和ram-ROM的區(qū)別_第1頁(yè)
單片機(jī)flash和ram-ROM的區(qū)別_第2頁(yè)
單片機(jī)flash和ram-ROM的區(qū)別_第3頁(yè)
單片機(jī)flash和ram-ROM的區(qū)別_第4頁(yè)
免費(fèi)預(yù)覽已結(jié)束,剩余1頁(yè)可下載查看

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、單片機(jī)flash和ram/ROM 的區(qū)別常規(guī)上ROM是用來(lái)存儲(chǔ)固化程序的,RAM是用來(lái)存放數(shù)據(jù)的。由于 FLASH ROM普通的RO賊寫速度快,擦寫方便,一般用來(lái)存儲(chǔ)用戶 程序和需要永久保存的數(shù)據(jù)。譬如說(shuō),現(xiàn)在家用的電子式電度表,它 的內(nèi)核是一款單片機(jī),該單片機(jī)的程序就是存放在 ROM!的。電度表 在工作過(guò)程中,是要運(yùn)算數(shù)據(jù)的,要采集電壓和電流,并根據(jù)電壓和 電流計(jì)算出電度來(lái)。電壓和電流時(shí)一個(gè)適時(shí)的數(shù)據(jù),用戶不關(guān)心,它 只是用來(lái)計(jì)算電度用,計(jì)算完后該次采集的數(shù)據(jù)就用完了, 然后再采 集下一次,因此這些值就沒(méi)必要永久存儲(chǔ),就把它放在 RAM!邊。然 而計(jì)算完的電度,是需要永久保存的,單片機(jī)會(huì)定時(shí)

2、或者在停電的瞬 間將電度數(shù)存入到FLASH!。-ROM存放指令代碼和一些固定數(shù)值,程序運(yùn)行后不可改動(dòng);RAMffl于程序運(yùn)行中數(shù)據(jù)的隨機(jī)存取,掉電后數(shù)據(jù)消失.code就是指將數(shù)據(jù)定義在 ROME域,具只讀屬,性,例如一些 LED顯 示的表頭數(shù)據(jù)就可以定義成code存儲(chǔ)在ROMROM (Read Only Memory)程序存儲(chǔ)器在單片機(jī)中用來(lái)存儲(chǔ)程序數(shù) 據(jù)及常量數(shù)據(jù)或變量數(shù)據(jù),凡是c文件及h文件中所有代碼、全局變 量、局部變量、'const '限定符定義的常量數(shù)據(jù)、startup.asm 文件 中的代碼(類似 ARMfr的bootloader或者X86中的BIOS, 一些低端的

3、單片機(jī)是沒(méi)有這個(gè)的)通通都存儲(chǔ)在ROMK RAM (RandomAccess Memory隨機(jī)訪問(wèn)存儲(chǔ)器用來(lái)存儲(chǔ)程序中用到的變量。 凡是整個(gè)程序 中,所用到的需要被改寫的量,都存儲(chǔ)在 RAMfr, “被改變的量”包 括全局變量、局部變量、堆棧段。程序經(jīng)過(guò)編譯、匯編、鏈接后,生成hex文件。用專用的燒錄軟件,通過(guò)燒錄器將 hex文件燒錄到 ROM (究竟是怎樣將hex文件傳輸?shù)組C時(shí)部的ROM的呢?), 因此,這個(gè)時(shí)候的ROW,包含所有的程序內(nèi)容:無(wú)論是一行一行的 程序代碼,函數(shù)中用到的局部變量,頭文件中所聲明的全局變量, const聲明的只讀常量,都被生成了二進(jìn)制數(shù)據(jù),包含在hex文件中, 全

4、部燒錄到了 ROM1面,此時(shí)的ROM包含了程序的所有信息,正是 由于這些信息,“指導(dǎo)” 了 CPU勺所有動(dòng)作。可能有人會(huì)有疑問(wèn),既 然所有的數(shù)據(jù)在ROW,那RAM的數(shù)據(jù)從哪里來(lái)?什么時(shí)候 CPU各 數(shù)據(jù)加載到RAMfr?會(huì)不會(huì)是在燒錄的時(shí)候,已經(jīng)將需要放在RAMfr 數(shù)據(jù)燒錄到了 RAMfr?要回答這個(gè)問(wèn)題,首先必須明確一條:RO塌只讀存儲(chǔ)器,CPU只能從里面讀數(shù)據(jù),而不能往里面寫數(shù)據(jù),掉電后 數(shù)據(jù)依然保存在存儲(chǔ)器中;RA牌隨機(jī)存儲(chǔ)器,CPU既可以從里面讀 出數(shù)據(jù),又可以往里面寫入數(shù)據(jù),掉電后數(shù)據(jù)不保存,這是條永恒的 真理,始終記掛在心。清楚了上面的問(wèn)題,那么就很容易想到,RAM中的數(shù)據(jù)不是在

5、燒錄的時(shí)候?qū)懭氲?,因?yàn)闊浲戤吅?,拔掉電源,?dāng) 再給MCUk電后,CPUtt正常執(zhí)彳f動(dòng)作,RAMK照樣有數(shù)據(jù),這就說(shuō) 明:RAMfr的數(shù)據(jù)不是在燒錄的時(shí)候?qū)懭氲模瑫r(shí)也說(shuō)明,在 CPU云行時(shí),RAMfr已經(jīng)寫入了數(shù)據(jù)。關(guān)鍵就在這里:這個(gè)數(shù)據(jù)不是人為寫 入的,CPU?入的,那CPUZ是什么時(shí)候?qū)懭氲哪兀柯犖益告傅纴?lái)。上回說(shuō)到,RO時(shí)包含所有的程序內(nèi)容,在 MCUt電時(shí),CPUFF始從 第1行代碼處執(zhí)行指令。這里所做的工作是為整個(gè)程序的順利運(yùn)行做 好準(zhǔn)備,或者說(shuō)是對(duì) RAMW初始化(注:RO健只讀不寫的),工作 任務(wù)有幾項(xiàng):1、為全局變量分配地址空間-a如果全局變量已賦 初值,則將初始值從ROW

6、拷貝到RAMfK如果沒(méi)有賦初值,則這個(gè) 全局變量所對(duì)應(yīng)的地址下的初值為 0或者是不確定的。當(dāng)然,如果已 經(jīng)指定了變量的地址空間,則直接定位到對(duì)應(yīng)的地址就行, 那么這里 分配地址及定位地址的任務(wù)由“連接器”完成。2、設(shè)置堆棧段的長(zhǎng) 度及地址一 a用C語(yǔ)言開發(fā)的單片機(jī)程序里面,普遍都沒(méi)有涉及到 堆棧段長(zhǎng)度的設(shè)置,但這不意味著不用設(shè)置。堆棧段主要是用來(lái)在中 斷處理時(shí)起“保存現(xiàn)場(chǎng)”及“現(xiàn)場(chǎng)還原”的作用,具重要性不言而 喻。而這么重要的內(nèi)容,也包含在了編譯器預(yù)設(shè)的內(nèi)容里面,確實(shí)省 事,可并不一定省心。平時(shí)怎么就沒(méi)發(fā)現(xiàn)呢?奇怪。3、分配數(shù)據(jù)段data ,常量段const ,代碼段code的起始地址。代碼段

7、與常量段的 地址可以不管,它們都是固定在 ROM1面的,無(wú)論它們?cè)趺磁帕?,?不會(huì)對(duì)程序產(chǎn)生影響。但是數(shù)據(jù)段的地址就必須得關(guān)心。 數(shù)據(jù)段的數(shù) 據(jù)時(shí)要從RO雌貝到RAMfr去的,而在RAMfK既有數(shù)據(jù)段data,也 有堆棧段stack ,還有通用的工作寄存器組。通常,工作寄存器組的 地址是固定的,這就要求在絕對(duì)定址數(shù)據(jù)段時(shí),不能使數(shù)據(jù)段覆蓋所 有的工作寄存器組的地址。必須引起嚴(yán)重關(guān)注。這里所說(shuō)的“第一 行代碼處”,并不一定是你自己寫的程序代碼,絕大部分都是編譯器代勞的,或者是編譯器自帶的demo程序文件。因?yàn)椋阕约簩懙某?序(C語(yǔ)言程序)里面,并不包含這些內(nèi)容。高級(jí)一點(diǎn)的單片機(jī),這 些內(nèi)容,都

8、是在startup的文件里面。仔細(xì)閱讀,有好處的。通常的 做法是:普通的flashMCU是在上電時(shí)或復(fù)位時(shí),PC指針里面的存放 的是“0000”,表示CPU從ROM勺0000地址開始執(zhí)行指令,在該地 址處放一條跳轉(zhuǎn)指令,使程序跳轉(zhuǎn)到_main函數(shù)中,然后根據(jù)不同的 指令,一條一條的執(zhí)行,當(dāng)中斷發(fā)生時(shí)(中斷數(shù)量也很有限,25個(gè)中斷),按照系統(tǒng)分配的中斷向量表地址,在中斷向量里面,放置一 條跳轉(zhuǎn)到中斷服務(wù)程序的指令,如此如此,整個(gè)程序就跑起來(lái)了。決 定CPUS樣做,是這種ROM吉構(gòu)所造成的。其實(shí),這里面,C語(yǔ)言編 譯器作了很多的工作,只是,你不知道而已。如果你仔細(xì)閱讀編譯器 自帶的help文件就會(huì)

9、知道很多的事情,這是對(duì)編譯器了解最好的途 徑。I/O 口寄存器:也是可以被改變的量,它被安排在一個(gè)特別的 RAM*址,為系統(tǒng)所訪問(wèn),而不能將其他變量定義在這些位置。中斷 向量表:中斷向量表是被固定在 MC的部的ROMfc址中,不同的地址 對(duì)應(yīng)不同的中斷。每次中斷產(chǎn)生時(shí),直接調(diào)用對(duì)應(yīng)的中斷服務(wù)子程序, 將程序的入口地址放在中斷向量表中。ROM勺大小問(wèn)題:對(duì)于flash類型的MCU ROMS間的大小通常都是整字節(jié)的,即為 ak*8bits 。這 很好理解,一眼就知道,ROM勺空間為aK。但是,Xt于某些OT陵型 的單片機(jī),比如holtek或者sonix公司的單片機(jī),經(jīng)常看到數(shù)據(jù)手 冊(cè)上寫的是 “

10、OTP progarming ROM 2k*15bit?!保赡軙?huì)產(chǎn)生疑惑,這個(gè)“ 15bit ”認(rèn)為是1個(gè)字節(jié)有余,2個(gè)字節(jié)又不足,那這個(gè)ROMg間究竟是2k,多于2k,還是4k但是少了一點(diǎn)點(diǎn)呢?這里要 明確兩個(gè)概念:一個(gè)是指令的位寬,另一個(gè)是指令的長(zhǎng)度。指令的位 寬是指一條指令所占的數(shù)據(jù)位的寬度;有些是 8位位寬,有些是15 位位寬。指令長(zhǎng)度是指每條指令所占的存儲(chǔ)空間,有 1個(gè)字節(jié),有2 個(gè)字節(jié)的,也有3個(gè)字節(jié)甚至4個(gè)字節(jié)的指令。這個(gè)可以打個(gè)形象的 比方:我們做廣播體操時(shí),有很多動(dòng)作要做,但是每個(gè)復(fù)雜的動(dòng)作都 可以分解為幾個(gè)簡(jiǎn)單的動(dòng)作。例如,當(dāng)做伸展運(yùn)動(dòng)時(shí),我們只聽到廣 播里面喊“ 2、2、3、4、5、6、7、8”,而這里每一個(gè)數(shù)字都代表一 個(gè)指令,聽到“ 3”這個(gè)指令后,我們的頭、手、腰、腿、腳分別作 出不同的動(dòng)作:兩眼目視前方,左手叉腰,右手往上抬起,五指伸直 自然并攏打開,右腿伸直,左腿成弓步等等一系列的分解動(dòng)作,而要做完這些動(dòng)作的指令只有一個(gè)“ 3”,要執(zhí)行的動(dòng)作卻 又很多,于是將多個(gè)分解動(dòng)作合并成一個(gè)指令,而每個(gè)分解動(dòng)作的“位寬”為15bits。實(shí)事上也確實(shí)如此,當(dāng)在反

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論