單片機與程序設(shè)計(上)
在此之前,GR-SAKURA電路板(搭載瑞薩電子單片機“RX63N”)的程序設(shè)計是使用Web編譯器來進行的。將通過編譯器搭建的程序(Object Code,結(jié)果代碼)如同寫入U盤一樣將之傳送到GR-SAKURA電路板后再執(zhí)行。那么,問題來了。寫入(傳送到)單片機的程序應(yīng)該保存在哪兒呢?另外,程序又是如何被執(zhí)行的呢?在解答這些問題的同時,讓我們一起來了解一下單片機與程序的關(guān)系吧。
記憶(保存)程序和數(shù)據(jù)的地方即存儲器。存儲器有以下兩種類型。
外置存儲器中的程序需傳送到主存儲器后才能執(zhí)行。
關(guān)于單片機的存儲器,常會看到ROM(Read Only Memory:只讀存儲器)和RAM(Random Access Memory:可讀寫存儲器)等詞匯,其實ROM和RAM僅是表示存儲器性質(zhì),而與存儲器的作用無關(guān)。(請參考單片機入門①,了解單片機的基本結(jié)構(gòu)和操作)
地址空間(內(nèi)存空間)
CPU能夠直接進行讀寫的所有空間被稱為“地址空間(或內(nèi)存空間)”。這個地址空間的每個字節(jié)都標(biāo)注有號碼。這個號碼稱為“地址(address)”,一般以十六進制來表示。上面所介紹過的主存儲器都包含在地址空間內(nèi)。
根據(jù)不同用途,單片機的CPU已開發(fā)出了4位、8位、16位和32位。在GR-SAKURA中使用的RX63N單片機搭載了32位的CPU,因此也被稱為“32位單片機”。那么,單片機所擁有的地址空間容量到底有多少呢?以RX63N為例,由于是32位的CPU,因此最大能夠指定約40億(2的32次方)個地址。確切地說是4,294,967,296(4x1024x1024x1024)個地址。由于一個地址可以記憶一個字節(jié),這時也可以表示為具有 “4GB(千兆字節(jié))的地址空間”。地址空間的容量越大越能搭載大容量的存儲器,也可容納更大的程序。因此能夠?qū)崿F(xiàn)更高功能的應(yīng)用。
32位字節(jié)的CPU所擁有的4G字節(jié)的地址空間示例如圖1所示。左邊所示的是以十六進制標(biāo)示的地址。由于一列保存有4個字節(jié)(=32位),所以左邊所標(biāo)記的地址就是每4個地址的值。
計算機的單位:位、字節(jié)、兆、千兆和兆兆(太)
數(shù)據(jù)的基本單位是位(b=bit),每個位的值為“0”或“1”。8位為1個字節(jié)(B=Byte)。例如,3個字節(jié)(3×8位)等同于24位。
電腦存儲設(shè)備的容量所使用的單位,大家耳熟能詳?shù)挠蠯B(千字節(jié))、MB(兆字節(jié))、GB(千兆字節(jié))和TB(太字節(jié))等。一般情況下會說 1GB=1000MB或者這樣寫出來,但在計算機的世界里,此單位并非為1000倍,而是1024倍(2的10次方),因此正確的表示如下:
1KB(千字節(jié))=2的10次方 = 1,024 字節(jié)
1MB(兆字節(jié))=1,024KB = 2的20次方 1,048,576 字節(jié)
1GB(千兆字節(jié))=1,024MB = 2的30次方 = 1,073,741,824 字節(jié)
1TB(太字節(jié))=1,024GB = 2的40次方 = 1,099,511,627,776字節(jié)
表示地址的十六進制指的是什么?
地址空間內(nèi)的地址以16進制來表示。例如,擁有16位(2的16次方)大小的地址空間中,如果以10進制來表示,就是“從地址0到地址65535”,如果以16進制來表示,則是從“地址0h到地址FFFFh”。在10進制中,每一位所取的值都在0到9之間,而在16進制中,則是0到F(相當(dāng)于10進制的15)。以16進制表示的數(shù),最后都有一個“h”,標(biāo)明是以16進制來表示的。
程序保存在哪兒呢?(向量表)
那么,程序被保存在地址空間的什么地方,又是怎么樣開始工作的呢?單片機復(fù)位后便開始執(zhí)行最優(yōu)先程序。復(fù)位是在接通電源或接收到復(fù)位信號時發(fā)生。實際上,這種“開始執(zhí)行最優(yōu)先程序”處理中,有如下所示的兩種方法。
即開始執(zhí)行程序時,有將執(zhí)行程序的起始地址設(shè)為固定的CPU及將之設(shè)為可變地址的CPU。
在將起始地址設(shè)為固定的CPU中,大多是從地址0(地址空間中最小的地址)開始執(zhí)行。這就是程序開始的地點。而且,有時要事先在地址0中實現(xiàn)寫入“下一個要執(zhí)行的是地址○○”的跳轉(zhuǎn)(Jump)指令,并將程序預(yù)先放置在“地址○○”中。如果改寫“地址○○”,將可獲得與將起始地址設(shè)為可變地址同樣的效果。
將起始地址設(shè)為可變地址的CPU將起始地址寫入被稱為“向量表”的部分中(圖2)。向量表是只存放地址空間中各種起始地址的特定區(qū)域的名稱。一般來說是它放置在地址空間中最大地址的部分。
以RX63N為例,由于地址是以32位來顯示的,為了保存它就需要4個字節(jié)。這就意味著圖3中的“復(fù)位”部分表示從地址FFFFFFFCh到地址 FFFFFFFFh的4個字節(jié)中保存了程序的起始地址。CPU復(fù)位后將讀取保存于此的地址,并從作了標(biāo)記的地址開始執(zhí)行。被寫入向量表的不僅是復(fù)位后的起始地址,向量表中還保存發(fā)生中斷時程序的起始地址和異常處理(Exception Handling)的起始地址。也正因為保存了發(fā)生中斷及異常處理等因多種事由的起始地址,所以才被稱為“表(Table)”。
我們來設(shè)想一下使用了向量表的程序處理的情況。圖3表示出了發(fā)生非屏蔽中斷(NMI) (*1) 時的處理流程例。
(1)產(chǎn)生NMI,
(2)讀取寫在向量表的NMI的起始地址(此例中為10000000h),
(3)執(zhí)行所讀取地址(10000000h)中的NMI程序。
評論