STC單片機內部擴展RAM的應用
RAM是用來(lái)在程序運行中存放隨機變量的數據空間,51單片機默認的內部RAM只有128字節,52單片機增加至256字節,STC89C52增加到512字節,STC89C54、55、58、516等增加到1280字節,對于編程者來(lái)說(shuō),一個(gè)芯片的RAM越多,寫(xiě)起程序來(lái)就越容易得心應手,不會(huì )總考慮RAM不夠用而擔心這擔心那,連過(guò)多的變量都不敢定義。
在前面我們寫(xiě)程序時(shí)曾講到過(guò),如果定義一個(gè)變量后,不對這個(gè)變量進(jìn)行初始化,這個(gè)變量默認的初值就是0,其實(shí)這個(gè)結論是需要一定的條件的,在用KEIL編寫(xiě)程序時(shí),總程序中所有變量占用的字節之和小于128字節,并且存儲器模式為small模式的前提下,對定義的變量不進(jìn)行初始化時(shí),編譯器會(huì )默認將變量值設定為0。一旦程序中的總變量超過(guò)128字節,必須對所有變量進(jìn)行初始化,否則,沒(méi)有被初始化的變量默認值將是不確定的。當變量總和超過(guò)128字節時(shí),必須還要在編譯器中重新設定存儲器的存儲模式,存儲器模式一共有3種,分別為small、compact和large模式,在KEIL編譯器中有選項可進(jìn)行選擇,選項表如圖4.4.1所示。它決定了沒(méi)有明確指定存儲類(lèi)型的變量、函數參數等數據的默認存儲區域。如果在某些函數中需要使用非默認的存儲模式,也可以使用關(guān)健字直接說(shuō)明。下面對這三種模式分別做介紹。
1. small模式
small模式中,所有缺省變量參數均裝入單片機內部128字節RAM中,當定義類(lèi)似如:uchar a; float b;等變量時(shí),這些變量都裝入內部128字節RAM中。使用該模式的優(yōu)點(diǎn)是訪(fǎng)問(wèn)速度快,缺點(diǎn)是空間有限,而且是對堆棧的空間分配比較少,難以把握,碰到需要遞歸調用的時(shí)候需要小心。所以這種模式只適用于小程序。
2. compact模式
compact模式中,所有缺省變量均位于單片機內部256字節RAM中,和在small模式中使用關(guān)健字pdata來(lái)定義變量的效果相同,如:uchar pdata a[100];在該種模式下,程序總變量不得超過(guò)256字節,對于只有128字節的單片機,使用此模式定義變量超過(guò)128字節時(shí),程序將出錯。優(yōu)點(diǎn)是空間較small模式寬裕,速度較small慢,但較large要快,是一種中間狀態(tài)。
3. large模式
在large模式中,所有缺省變量可放在多達64KB的RAM區,包括內部RAM和外部RAM,和使用關(guān)健字xdata來(lái)定義變量的效果相同。這種模式的優(yōu)點(diǎn)是空間大,可存變量多,缺點(diǎn)是訪(fǎng)問(wèn)速度慢,尤其對于2個(gè)以上的多字節變量訪(fǎng)問(wèn)速度來(lái)說(shuō)更是如此。
方便起見(jiàn),STC單片機要訪(fǎng)問(wèn)擴展RAM時(shí),可直接用以下方法:首先在編譯器中設置存儲器模式為large模式。
其次,為安全起見(jiàn),當程序中定義多于128字節的其它變量時(shí),最好申明為xdata型,如 uchar xdata table[100];意思為定義一個(gè)100個(gè)字節容量的數組,將其在擴展RAM中分配存儲空間。另外一定要注意,在large模式下,編寫(xiě)程序時(shí),定義的變量總數千萬(wàn)不要超過(guò)對應單片機的內部最大RAM字節數,因為即使超過(guò)了,編譯器也不會(huì )提示錯誤,但是程序必定會(huì )出錯。
評論