MAXQ內(nèi)核是一個(gè)功能強(qiáng)大的單周期、傳輸觸發(fā)CPU。本文通過(guò)展示整個(gè)指令集如何圍繞簡(jiǎn)單的 MOVE 操作構(gòu)建來(lái)演示這種功能。
MAXQ處理器系列是功能強(qiáng)大的8位、16位和32位單周期微控制器,在一個(gè)時(shí)鐘周期內(nèi)執(zhí)行多個(gè)操作。本文將探討MAXQ20內(nèi)核的內(nèi)部工作原理,并展示其強(qiáng)大的功能。
程序員模型
MAXQ20內(nèi)核為16位CPU,這意味著所有累加器和大多數(shù)工作寄存器(堆棧、數(shù)據(jù)指針、計(jì)數(shù)器)的長(zhǎng)度均為16位。MAXQ20可以尋址64k字的代碼空間(即64kB指令)和64k字(128kB)的數(shù)據(jù)空間(圖1)。
注意,對(duì)于基于MAXQ20內(nèi)核的處理器,大部分內(nèi)存空間將處于空置狀態(tài)。此外,由于實(shí)用程序ROM和數(shù)據(jù)RAM位于代碼空間的上部32kB,因此訪問(wèn)此區(qū)域中的用戶代碼需要內(nèi)核中的特殊功能,這些功能超出了本文的范圍。
圖1.MAXQ20內(nèi)核的編程模型由16個(gè)通用累加器、兩個(gè)環(huán)路計(jì)數(shù)器和一組數(shù)據(jù)指針組成。
蓄電池
16個(gè)寄存器稱(chēng)為“累加器”,形成一個(gè)通用寄存器陣列。累加器指針寄存器 (AP) 指向的寄存器被指定為“活動(dòng)累加器”,它是算術(shù)和邏輯運(yùn)算的目標(biāo)。因此,通過(guò)更改AP寄存器中的值,可以將2個(gè)累加器中的任何一個(gè)指定為算術(shù)邏輯單元(ALU)操作的目標(biāo)。累加器指針控制寄存器 (APC) 使 AP 在訪問(wèn)活動(dòng)累加器時(shí)自動(dòng)遞增或遞減,從而使多精度算術(shù)變得簡(jiǎn)單。在圖 0 中,A[1] 是有源累加器,但任何累加器訪問(wèn)都可以使 A[15] 或 A[<>] 成為有源累加器,具體取決于 APC 寄存器的值。
圖2.活動(dòng)累加器由AP寄存器指定,AP寄存器本身可以通過(guò)累加器訪問(wèn)指令進(jìn)行修改。
遺傳資源注冊(cè)
通用寄存器(GR)有助于從16位字中提取單個(gè)字節(jié)。程序員可以使用GR將字節(jié)組裝成一個(gè)字:將低字節(jié)加載到GRL(通用寄存器-低字節(jié))中,將高字節(jié)加載到GRH(通用寄存器-高字節(jié))中,并在GR中讀取組裝好的字。加載到 GR 中的單詞可以在 GRS(通用寄存器-交換)中以字節(jié)交換格式讀取。最后,加載到GRL寄存器的字節(jié)可以通過(guò)讀取GRXL(通用寄存器低字節(jié))來(lái)符號(hào)擴(kuò)展為一個(gè)字。參見(jiàn)圖 3。
圖3.GR 寄存器支持字節(jié)提取、字節(jié)交換和 16 位符號(hào)擴(kuò)展。
循環(huán)計(jì)數(shù)器
有兩個(gè)環(huán)路計(jì)數(shù)器:環(huán)路計(jì)數(shù)器 0 (LC[0]) 和環(huán)路計(jì)數(shù)器 1 (LC[1])。這些寄存器可用作通用寄存器,但如果計(jì)數(shù)器為非零 (DJNZ) 指令,則用作遞減和跳轉(zhuǎn)的循環(huán)計(jì)數(shù)器。
疊
MAXQ20內(nèi)核具有專(zhuān)用的16電平內(nèi)部堆棧。堆棧指針指示要使用的下一個(gè)堆棧位置,或指示 PUSH 或 CALL 操作。
數(shù)據(jù)存儲(chǔ)指針
MAXQ微控制器具有三個(gè)用于訪問(wèn)數(shù)據(jù)存儲(chǔ)器的指針。兩個(gè),DP[0] 和 DP[1],是簡(jiǎn)單的 16 位指針。第三個(gè)指針是通過(guò)將基址指針 (BP) 添加到 8 位無(wú)符號(hào)偏移量 (OFFS) 來(lái)形成的。
請(qǐng)注意,由三個(gè)數(shù)據(jù)指針之一尋址的數(shù)據(jù)存儲(chǔ)器與由指令指針尋址的代碼存儲(chǔ)器不同。雖然所有MAXQ處理器都包含一個(gè)存儲(chǔ)器管理單元(MMU),允許將任何存儲(chǔ)器段視為代碼或數(shù)據(jù),但代碼和數(shù)據(jù)總線是分開(kāi)的。代碼和數(shù)據(jù)獲取操作的總線分離是MAXQ20技術(shù)的基本要素,允許在單個(gè)時(shí)鐘周期內(nèi)同時(shí)訪問(wèn)代碼和數(shù)據(jù)。
傳輸觸發(fā)架構(gòu)
通過(guò)檢查程序員的模型,可以得出結(jié)論,有一個(gè)傳統(tǒng)的指令獲取-解碼單元,它加載指令,解碼它,然后激活CPU的某些元素。然而,這將是一種誤解。MAXQ架構(gòu)與其他傳統(tǒng)CPU的不同之處在于MAXQ內(nèi)核的傳輸觸發(fā)特性。
傳輸觸發(fā)是一種允許簡(jiǎn)單的 MOVE 指令執(zhí)行 CPU 中可用的每個(gè)功能的技術(shù)。雖然MAXQ匯編器支持30多種指令操作碼,但MAXQ指令集中的每條指令都可以編碼為:
move Ma[b], Mc[d] or move Ma[b], #immediate_value
其中名稱(chēng) Ma[b] 描述寄存器模塊 a 和寄存器子解碼 b。簡(jiǎn)單地說(shuō):每條指令——ADD、位操作、對(duì)外部存儲(chǔ)器的引用——都被編碼為兩個(gè)寄存器之間的移動(dòng)或?qū)⒓磿r(shí)值移動(dòng)到寄存器中。
當(dāng)執(zhí)行MAXQ指令時(shí),目標(biāo)寄存器加載源寄存器的內(nèi)容或即時(shí)值。此外,這種數(shù)據(jù)傳輸可以觸發(fā)其他事件,例如遞增或遞減指針、設(shè)置某些狀態(tài)位或其他函數(shù)。因此,該架構(gòu)是傳輸觸發(fā)的。為了支持這種架構(gòu),需要一個(gè)大的寄存器補(bǔ)充。在MAXQ20內(nèi)核中,共有512個(gè)寄存器地址,分為兩大部分:外設(shè)寄存器空間和系統(tǒng)寄存器空間(圖4)。
前六個(gè)寄存器模塊(模塊 0 到 5)專(zhuān)用于外設(shè)寄存器;最后九個(gè)模塊(模塊7至F)被分配為系統(tǒng)寄存器。(模塊 6 是保留的。當(dāng)外設(shè)寄存器模塊從一種類(lèi)型的MAXQ處理器變?yōu)榱硪环N類(lèi)型的MAXQ處理器時(shí),所有MAXQ處理器的系統(tǒng)寄存器保持不變(圖5)。
圖4.MAXQ20內(nèi)核中的寄存器分配分為兩個(gè)區(qū)域:寄存器組0至5為外設(shè)寄存器,可以從MAXQ器件切換到另一個(gè)MAXQ器件;組7至15是系統(tǒng)寄存器,在所有MAXQ部件上保持相對(duì)固定。
圖5.MAXQ系統(tǒng)寄存器映射由所有基于MAXQ20的處理器中的寄存器和用于實(shí)現(xiàn)指令集的附加解碼組成。
解碼MAXQ指令
因?yàn)槊織lMAXQ指令實(shí)際上都是一個(gè)MOVE,所以每條指令可以分解為三個(gè)字段:一個(gè)SOURCE字段,它指定數(shù)據(jù)從哪里移動(dòng);指定數(shù)據(jù)移動(dòng)到何處的“目標(biāo)”字段;以及一個(gè)格式位,指示源是即時(shí)值(FORMAT == 0)還是寄存器指示符(FORMAT == 1)(圖6)。
圖6.MAXQ指令由三部分組成:源指示符、目標(biāo)指示符和源格式位,用于確定源是直接操作數(shù)還是寄存器操作數(shù)。
以指令操作碼0x0923為例。在此指令中,F(xiàn)ORMAT位是明確的,指示源指示符(23)應(yīng)被視為8位即時(shí)值。目標(biāo)模塊是模塊 9,即累加器陣列。該數(shù)組中的寄存器 0 是累加器 A[0]。因此,指令的作用是將0x0023的值加載到寄存器 A[0] 中。在這種情況下,沒(méi)有與源或目標(biāo)指示符相關(guān)的副作用。
對(duì)于第二個(gè)示例,請(qǐng)考慮0xBF09。在此指令中,設(shè)置了FORMAT位,這意味著源指示符應(yīng)解釋為寄存器。模塊 9 寄存器 0 已在上面介紹:它是累加器 A[0]。在目標(biāo)端,模塊 F 是數(shù)據(jù)指針模塊,寄存器 3(指令中的位 14:12)表示數(shù)據(jù)指針 DP[0]。因此,此指令將 A[0] 的內(nèi)容移動(dòng)到 DP[0]。
請(qǐng)注意,在某些情況下,寄存器模塊內(nèi)的各個(gè)位置可能引用實(shí)際寄存器,也可能不引用實(shí)際寄存器。或者,它們可以引用實(shí)際的寄存器,但在訪問(wèn)該寄存器子解碼時(shí)會(huì)導(dǎo)致一些副作用。例如,讓我們用0xAF09稍微修改前面的示例。只有目標(biāo)子解碼已更改?,F(xiàn)在,指令不是加載寄存器 DP[0],而是遞減 DP[0],然后開(kāi)始對(duì) DP[0] 指向的新內(nèi)存位置進(jìn)行存儲(chǔ)操作。也就是說(shuō),指令在遞減指針上執(zhí)行間接存儲(chǔ)。在MAXQ匯編器中,它被編碼為移動(dòng)@DP[0],A[0],但它可以像移動(dòng)M15[2],M9[0]一樣容易編碼。
前綴寄存器
每個(gè)模塊有 32 個(gè)寄存器,但只有 11 位用于選擇源寄存器,只有 <> 位用于指定目標(biāo)寄存器。乍一看,這意味著無(wú)法讀取一半的寄存器子解碼,并且無(wú)法寫(xiě)入整整四分之三的寄存器子解碼。幸運(yùn)的是,MAXQ架構(gòu)設(shè)計(jì)可以解決這個(gè)問(wèn)題。每個(gè)MAXQ處理器提供一個(gè)前綴寄存器,以提供這些額外的寄存器地址位,并提供字范圍移動(dòng)的高字節(jié)。有關(guān)詳細(xì)信息,請(qǐng)參閱模塊 <> - 前綴部分。
一次創(chuàng)建一個(gè)模塊的MAXQ指令集
以下各節(jié)詳細(xì)介紹了系統(tǒng)寄存器模塊以及它們?nèi)绾谓换ヒ詣?chuàng)建所有記錄和未記錄的指令。我們首先研究MAXQ20內(nèi)核的核心:累加器陣列。
模塊 9 - 蓄能器
MAXQ架構(gòu)最多支持32個(gè)累加器,盡管大多數(shù)型號(hào)只支持16個(gè)。累加器可通過(guò)模塊 9 直接訪問(wèn)。此模塊中的每個(gè)子解碼代表一個(gè)累加器。模塊 9 在概念上是最簡(jiǎn)單的模塊,但還有兩個(gè)模塊會(huì)影響累加器陣列。
模塊 8 - 系統(tǒng)控制
該模塊包含許多寄存器,用于管理系統(tǒng)操作的各個(gè)方面,例如中斷控制和程序狀態(tài)標(biāo)志。其中許多寄存器超出了本文的范圍,因此有關(guān)詳細(xì)信息,請(qǐng)參閱器件規(guī)格。表1列出了其中一些寄存器模塊。
表 1.模塊 8 函數(shù)
子 | 功能 | S/D | 描述 |
0 | 累加器指針寄存器 | S/D | 指定活動(dòng)累加器,即用作 ALU 操作目標(biāo)的累加器。 |
1 | 累加器指針控制寄存器 | S/D | 告訴 AP 如何表現(xiàn)。對(duì)于此討論,它是一個(gè)通用的8位寄存器。 |
4 | 程序狀態(tài)標(biāo)志寄存器 | S/D | 包含用戶可能希望在主程序中監(jiān)視的標(biāo)志(攜帶、零、等于)。寄存器通常用作源,但也可以用作目標(biāo)。請(qǐng)注意,某些位是只讀的(例如,Z 標(biāo)志是活動(dòng)累加器中所有位的邏輯 NOR)。 |
5 | 中斷控制寄存器 | S/D | 管理中斷子系統(tǒng)。 |
6 | 中斷掩碼寄存器 | S/D | 通常包含在模塊級(jí)別屏蔽中斷的位。 |
7 | 比較器寄存器 | DO | 只寫(xiě)子解碼。不是真正的寄存器,因?yàn)樗竺鏇](méi)有實(shí)際的內(nèi)存。寫(xiě)入此子解碼時(shí),如果源操作數(shù)與當(dāng)前累加器的內(nèi)容匹配,則在 PSF 中設(shè)置等于位;否則,將清除等于位。 |
8 | 系統(tǒng)控制寄存器 | S/D | 包含控制系統(tǒng)操作(讀/寫(xiě))方面的位。 |
11 | 中斷識(shí)別寄存器 | SO | 包含標(biāo)識(shí)中斷源的位集合。 |
14 | 時(shí)鐘控制寄存器 | S/D | 包含與系統(tǒng)時(shí)鐘相關(guān)的位。特別是,控制主時(shí)鐘分頻比,以及時(shí)鐘源(如果特定微控制器中存在多個(gè)源)。 |
15 | 看門(mén)狗控制寄存器 | S/D | 控制看門(mén)狗定時(shí)器的操作。大多數(shù)MAXQ器件都包含一個(gè)看門(mén)狗定時(shí)器,如果處理器卡在程序循環(huán)中,該定時(shí)器可以復(fù)位。 |
AP和APC登記冊(cè)值得特別注意。AP 寄存器確定哪個(gè)累加器寄存器是活動(dòng)累加器;也就是說(shuō),它指定算術(shù)、邏輯和按位運(yùn)算的目標(biāo)。它可以指向數(shù)組中的任何累加器。
APC 寄存器包含一組位,用于定義在任何累加器操作后如何修改 AP 寄存器。因此,AP寄存器可以遞增或遞減,計(jì)數(shù)在可選擇的2次冪模數(shù)上滾動(dòng),使多精度運(yùn)算變得簡(jiǎn)單。
模塊 10 - 累加器功能
模塊 10 是完成累加器大部分實(shí)際工作的地方。它提供對(duì)傳統(tǒng) ALU 函數(shù)的訪問(wèn)和對(duì)有源累加器的位級(jí)訪問(wèn)。模塊 10 是唯一的;它的行為有所不同,具體取決于它是用作源、目標(biāo)還是同時(shí)用作源和目標(biāo)(表 2)。
表 2.模塊 10 作為源
子 | 功能 | 描述 |
0 | 有源蓄能器 | 活動(dòng)累加器的內(nèi)容將移動(dòng)到目標(biāo),并且 AP 將根據(jù) APC 進(jìn)行更改。 |
1 | 有源蓄能器 | 活動(dòng)累加器的內(nèi)容將移動(dòng)到目標(biāo),并且 AP 保持不變。 |
如果源是模塊 10,并且目標(biāo)是模塊 10 以外的任何模塊,則累加器的內(nèi)容將移動(dòng)到目標(biāo)。如果子解碼為零,則根據(jù)APC寄存器中的位修改AP寄存器。如果子解碼為 1,則不會(huì)修改 AP 寄存器。
請(qǐng)注意,當(dāng)前版本的宏匯編器不支持子解碼 1。這是因?yàn)闆](méi)有助記符或修飾符來(lái)指定子解碼 1。因此,指令移動(dòng) A[1],ACC 將始終0x990A生成操作碼,并且永遠(yuǎn)不會(huì)0x991A(表 3)。
表 3.模塊 10 作為目的地
子 | 功能 | 描述 |
0 | MOVE | 源將移動(dòng)到累加器。 |
1 | AND | 源的內(nèi)容在邏輯上與累加器一起進(jìn)行。 |
2 | OR | 源的內(nèi)容與累加器進(jìn)行邏輯 OR 運(yùn)算。 |
3 | XOR | 源的內(nèi)容在邏輯上與累加器進(jìn)行 OR。 |
4 | ADD | 源的內(nèi)容以算術(shù)方式添加到累加器中。從 MSB 溢出設(shè)置進(jìn)位。 |
5 | SUB | 源的內(nèi)容從累加器算術(shù)上減去。底流設(shè)置進(jìn)位。 |
6 | ADDC | 源和進(jìn)位的內(nèi)容被添加到累加器中。 |
7 | SUBB | 源和進(jìn)位的內(nèi)容從累加器中減去。 |
當(dāng)模塊 10 被指定為目標(biāo)并且源是即時(shí)值或模塊 10 以外的任何模塊時(shí),源通過(guò) ALU 路由;目標(biāo)取自 ALU 的輸出,而不是直接取自源。這就是算術(shù)和邏輯指令的實(shí)現(xiàn)方式。
請(qǐng)注意,對(duì)可用作源寄存器的內(nèi)容沒(méi)有限制。它可以是即時(shí)值、間接存儲(chǔ)器位置,甚至是堆?;蛲庠O(shè)寄存器上的值(表 4)。
表 4.模塊 10 同時(shí)作為源和目標(biāo)
德斯特亞 | SRC 子 | 功能 | 描述 |
0 | 0 | MOVE | 累加器的內(nèi)容被移動(dòng)到累加器;從邏輯上講,一個(gè)NOP。但是,可以更改 AP 寄存器。 |
1 | .CPL | 累加器按位補(bǔ)充。 | |
2 | SLA | 累加器向左移動(dòng)一位;低階位設(shè)置為零。高階位被復(fù)制到進(jìn)位。 | |
3 | SLA2 | 累加器向左移動(dòng)兩位;低階兩位設(shè)置為零。位 14 被復(fù)制到攜帶。 | |
4 | RL | 蓄能器向左旋轉(zhuǎn)一位,將位 15 復(fù)制到位 0。位 15 也被復(fù)制到攜帶。 | |
5 | RLC | 蓄能器向左旋轉(zhuǎn)一位,將位 15 復(fù)制到進(jìn)位,進(jìn)位復(fù)制到位 0。 | |
6 | SLA4 | 蓄能器向左移動(dòng)四位;低階四位設(shè)置為零。位 12 被復(fù)制到攜帶。 | |
7 | XCHN | 累加器每個(gè)字節(jié)中的半字節(jié)被顛倒;0x1234變得0x2143。 | |
8 | XCH | 累加器的字節(jié)是相反的;0x1234變得0x3412。 | |
9 | NEG | 累加器在算術(shù)上被否定。 | |
10 | SR | 累加器向右移動(dòng)一位。位 15 加載零。位 0 被移動(dòng)到攜帶。 | |
11 | SRA4 | 累加器向右移動(dòng)四位;高階四位設(shè)置為零。位 3 被復(fù)制到攜帶。 | |
12 | RR | 蓄能器向右旋轉(zhuǎn)一位,位 0 復(fù)制到位 15。位 0 也被復(fù)制到攜帶。 | |
13 | RRC | 蓄能器向右旋轉(zhuǎn)一位,位 0 復(fù)制到進(jìn)位,進(jìn)位復(fù)制到位 15。 | |
14 | SRA2 | 累加器向右移動(dòng)兩位;高階兩位設(shè)置為零。位 1 復(fù)制到攜帶。 | |
15 | SRA | 累加器向右移動(dòng)一位;高階位設(shè)置為零。低階位復(fù)制到進(jìn)位。 | |
1 | 位 | 和 C | 進(jìn)位與累加器中的指定位在邏輯上與 AND 運(yùn)算。 |
2 | 位 | 或 C | 進(jìn)位與累加器中的指定位在邏輯上是 OR 運(yùn)算的。 |
3 | 位 | 異或 C | 進(jìn)位與累加器中的指定位進(jìn)行邏輯異或運(yùn)算。 |
5 | 0 | C ← 0 | 進(jìn)位設(shè)置為零。 |
1 | C ← 1 | 進(jìn)位設(shè)置為 1。 | |
2 | C ← C | 進(jìn)位是補(bǔ)充的。 | |
3 | NOP | 保證無(wú)價(jià) | |
6 | 位 | C ← ACC | 蓄能器中的指定位被加載到進(jìn)位中。 |
7 | 位 | ACC ← C | 進(jìn)位被加載到累加器中的指定位中。 |
當(dāng)源和目標(biāo)指定都是模塊 10 時(shí),它要么是僅累加器指令,要么是涉及進(jìn)位的位操作。在所有情況下,源子解碼和目標(biāo)子解碼都用于指定操作。
目標(biāo)子解碼 0 是僅累加器指令的主頁(yè),包括補(bǔ)碼、否定和所有移位、旋轉(zhuǎn)和交換指令。目標(biāo)子解碼 1、2、3、6 和 7 涉及按位加載和使用進(jìn)位的操作。最后,目標(biāo)子解碼 5 具有僅進(jìn)位操作:加載 0 和 1 以及補(bǔ)碼。
請(qǐng)注意,目標(biāo)子解碼 5 的一個(gè)源子解碼是指定的 NOP 指令。雖然任何既沒(méi)有副作用又解決空寄存器位置的操作都可以作為NOP,但MOVE M10[5]、M10[3]特別保證在當(dāng)前或未來(lái)的MAXQ器件中不執(zhí)行任何操作。這是在 NOP 助記符的所有當(dāng)前匯編程序中生成的操作代碼 (0xDA3A)。
模塊 12 — 指令指針
模塊 12 是唯一的,因?yàn)樗S多條件加載操作。如果將模塊 12 用作源模塊,則只需將 IP 復(fù)制到目標(biāo)指示符。但是,如果模塊 12 是目標(biāo),則除非滿足指定的條件,否則不會(huì)執(zhí)行任何操作(表 5)。
表 5.模塊 12 子解碼
子 | 描述 |
0 | 如果源,則從 IP 加載目標(biāo)。如果是目標(biāo),請(qǐng)從源加載 IP。 |
1 | 如果源,則從 IP 加載目標(biāo)。如果是目標(biāo),則僅在 ACC == 0 時(shí)從源加載 IP。 |
2 | 如果源,則從 IP 加載目標(biāo)。如果是目標(biāo),則僅在 C == 1 時(shí)從源加載 IP。 |
3 | 如果源,則從 IP 加載目標(biāo)。如果是目標(biāo),則僅當(dāng)最新的 CMP 指令設(shè)置 EQ 標(biāo)志時(shí),才從源加載 IP。 |
4 | 如果源,則從 IP 加載目標(biāo)。如果是目標(biāo),則僅在設(shè)置了累加器的高階位時(shí)從源加載 IP。 |
5 | 如果源,則從 IP 加載目標(biāo)。如果是目標(biāo),則僅在 ACC == 0 時(shí)從源加載 IP。 |
6 | 如果源,則從 IP 加載目標(biāo)。如果是目標(biāo),則僅在 C == 0 時(shí)從源加載 IP。 |
7 | 如果源,則從 IP 加載目標(biāo)。如果是目標(biāo),則僅當(dāng)最新的 CMP 指令清除了 EQ 標(biāo)志時(shí),才從源加載 IP。 |
模塊 12 也是唯一的,因?yàn)楫?dāng)從 8 位即時(shí)源加載時(shí),源值被解釋為有符號(hào)整數(shù),并添加到指令指針的先前預(yù)遞增內(nèi)容中。這種添加有助于相對(duì)短的跳躍,從而顯著節(jié)省代碼大小。這也意味著任何短跳或跳遠(yuǎn)指令都可以是有條件的。
請(qǐng)注意,此模塊僅支持指令指針寄存器 (IP) 的簡(jiǎn)單加載和存儲(chǔ)。CALL 指令被視為也加載 IP 的堆棧指令,而不是推送到堆棧的 IP 指令。因此,CALL 指令的傳輸在堆棧指針模塊(模塊 13)中。此外,沒(méi)有明確的 RET 指令;這被強(qiáng)制轉(zhuǎn)換為 POP IP。
模塊 13 — 堆棧指針
模塊 13 不僅包含與堆棧指針相關(guān)的寄存器,還包含循環(huán)計(jì)數(shù)器和中斷向量。請(qǐng)注意,多個(gè)子解碼僅作為目標(biāo)有效,一個(gè)(子解碼 8)僅作為源有效(表 6)。
表 6.模塊 13 子解碼
子 | 功能 | S/D | 描述 |
0 | 推/爆 | S/D | 如果是目標(biāo),則遞增堆棧指針并將源操作數(shù)存儲(chǔ)在堆棧上。如果是源,則將堆棧上的值加載到目標(biāo)并遞減堆棧指針。 |
1 | 堆棧指針 | S/D | 指向內(nèi)部專(zhuān)用堆棧上最近使用的位置。 |
2 | 中斷向量 | S/D | 指向程序內(nèi)存中中斷服務(wù)例程所在的位置。 |
3 | CALL | DO | 將當(dāng)前 IP 推送到堆棧,然后從源操作數(shù)加載 IP。如果用作源操作數(shù),將導(dǎo)致不可預(yù)知的結(jié)果。 |
4 | DJNZ LC[0] | DO | 遞減 LC[0] 并使用源 IF LC[0] != 0 加載 IP。如果用作源操作數(shù),將導(dǎo)致不可預(yù)知的結(jié)果。 |
5 | DJNZ LC[1] | DO | 遞減 LC[1] 并使用源 IF LC[1] != 0 加載 IP。如果用作源操作數(shù),將導(dǎo)致不可預(yù)知的結(jié)果。 |
6 | LC[0] | S/D | 數(shù)據(jù)移入/移出循環(huán)計(jì)數(shù)器 0。 |
7 | LC[1] | S/D | 數(shù)據(jù)移入/移出循環(huán)計(jì)數(shù)器 1。 |
8 | SO | 堆棧上的值將復(fù)制到目標(biāo),堆棧點(diǎn)遞減,并清除 IN SERVICE 位。主要用于實(shí)現(xiàn) RETI 操作。 |
子解碼 3、4 和 5 用作 IP 寄存器的代理。Subdecode 3在遞增的指令指針被推送到堆棧后加載指令指針,從而實(shí)現(xiàn)傳統(tǒng)的CALL指令。子解碼 4 和 5 將指定循環(huán)計(jì)數(shù)器的前置版本加載回循環(huán)計(jì)數(shù)器,如果前遞減循環(huán)計(jì)數(shù)器不為零,則還會(huì)使用源操作數(shù)加載指令指針。要加載到此目標(biāo)子解碼中的源可以是任何內(nèi)容;指令 DJNZ LC[0], A[1] 是完全有效的。在這種情況下,如果遞減操作的結(jié)果不為零,則指令將遞減 LC[0] 并跳轉(zhuǎn)到 A[1] 中的地址。
模塊 14 - GR、BP 和 DPC
模塊14包含DPC寄存器、GR寄存器以及與基極指針和偏移寄存器相關(guān)的所有寄存器(表7)。
表 7.模塊 14 子解碼
子 | 功能 | S/D | 描述 | |
0 | @BP[offs] | S/D | 讀取或?qū)懭?BP+off 指向的數(shù)據(jù)存儲(chǔ)器位置 | |
1 |
|
S/D | 如果為 source,則讀取 BP+off 指向的數(shù)據(jù)存儲(chǔ)器位置,然后遞增 off。如果為 target,則遞增,然后將源數(shù)據(jù)存儲(chǔ)在 BP+offs 處。 | |
2 | @BP[offs--] | S/D | 如果為 source,則讀取 BP+off 指向的數(shù)據(jù)存儲(chǔ)器位置,然后遞減。如果是目標(biāo),則遞減,然后將源數(shù)據(jù)存儲(chǔ)在 BP+offs。 | |
3 | offs | S/D | 8位失調(diào)寄存器 | |
4 | DPC | S/D | 數(shù)據(jù)指針控制寄存器定義哪個(gè)數(shù)據(jù)指針是當(dāng)前源指針以及每個(gè)數(shù)據(jù)指針的字/字節(jié)狀態(tài)。 | |
5 | GR | S/D | 16位通用寄存器 | |
6 | GRL | S/D | 16位通用寄存器的低階字節(jié) | |
7 | BP | S/D | 16 位基本內(nèi)存指針 | |
8 | GRS | 所以 | 遺傳資源的字節(jié)交換版本 | |
9 | GRH | S/D | 16位通用寄存器的高階字節(jié) | |
10 | GRXL | 所以 | GR 的符號(hào)擴(kuò)展低字節(jié) | |
11 | BP[offs] | 所以 | 基指針和偏移量的總和 |
數(shù)據(jù)指針控制寄存器 (DPC) 描述數(shù)據(jù)指針的行為方式。特別是,它包含每個(gè)數(shù)據(jù)指針的位,用于定義該指針是在字模式還是字節(jié)模式下運(yùn)行。它還包含一個(gè)字段,用于定義哪個(gè)指針是當(dāng)前源指針。這是必需的,因?yàn)樵诩虞d源指針時(shí)訪問(wèn)源,并且只有一條總線用于操作數(shù)數(shù)據(jù)。
當(dāng) 16 位數(shù)據(jù)需要字節(jié)訪問(wèn)時(shí),GR 寄存器很方便。一旦GR加載了16位數(shù)據(jù),就可以分別通過(guò)GRL和GRH寄存器檢索低階和高階字節(jié)。GRS 寄存器包含 GR 的字節(jié)交換版本;GRXL 寄存器與 GRL 寄存器相同,不同之處在于高字節(jié)是低位字節(jié)的符號(hào)擴(kuò)展。
基極指針寄存器(BP)是MAXQ架構(gòu)中三個(gè)數(shù)據(jù)存儲(chǔ)器指針寄存器之一,也是唯一支持失調(diào)寄存器的寄存器。BP 通常指向數(shù)據(jù)結(jié)構(gòu)的基底,8 位無(wú)符號(hào)偏移寄存器指向結(jié)構(gòu)內(nèi)的數(shù)據(jù)元素。請(qǐng)注意,此寄存器的遞增和遞減版本僅修改偏移寄存器,而不會(huì)修改基寄存器。
模塊 15 - 數(shù)據(jù)指針
模塊15包含MAXQ架構(gòu)中三個(gè)數(shù)據(jù)指針中的兩個(gè)。根據(jù)子解碼,對(duì)此模塊的訪問(wèn)將執(zhí)行直接或間接加載或存儲(chǔ),并可能在間接訪問(wèn)后增加或減少數(shù)據(jù)指針。這些寄存器子解碼可用作源寄存器或目標(biāo)寄存器(表8)。
表 8.模塊 15 子解碼
子 | 功能 | 描述 |
0 | @DP[0] | 讀取或?qū)懭?DP[0] 指向的數(shù)據(jù)存儲(chǔ)器位置。 |
1 | @DP[0]++ | 如果是 source,則讀取 DP[0] 指向的數(shù)據(jù)存儲(chǔ)器位置,然后遞增 DP[0]。如果為 target,則遞增 DP[0],然后將源數(shù)據(jù)存儲(chǔ)在 DP[0]。 |
2 | @DP[0]-- | 如果為 source,則讀取 DP[0] 指向的數(shù)據(jù)存儲(chǔ)器位置,然后遞減 DP[0]。如果為 target,則遞減 DP[0],然后將源數(shù)據(jù)存儲(chǔ)在 DP[0]。 |
3 | DP[0] | 數(shù)據(jù)指針 0 |
4 | @DP[1] | 讀取或?qū)懭?DP[1] 指向的數(shù)據(jù)存儲(chǔ)器位置 |
5 | @DP[1]++ | 如果是 source,則讀取 DP[1] 指向的數(shù)據(jù)存儲(chǔ)器位置,然后遞增 DP[1]。如果為 target,則遞增 DP[1],然后將源數(shù)據(jù)存儲(chǔ)在 DP[1]。 |
6 | @DP[1]-- | 如果是 source,則讀取 DP[1] 指向的數(shù)據(jù)存儲(chǔ)器位置,然后遞減 DP[1]。如果為目的地,則遞減 DP[1]。然后將源數(shù)據(jù)存儲(chǔ)在DP[1]。 |
7 | DP[1] | 數(shù)據(jù)指針 1 |
模塊 7 - 布爾變量操作
布爾變量操作(BVM)模塊(模塊7)允許在典型的MAXQ處理器中對(duì)許多寄存器進(jìn)行位提取和位設(shè)置/清除(圖7)。請(qǐng)注意,并非所有模塊都連接到 BVM 計(jì)算機(jī)。通常,只有外圍模塊連接到 BVM;系統(tǒng)寄存器沒(méi)有。因此,在BVM和系統(tǒng)寄存器之間移動(dòng)數(shù)據(jù)可能會(huì)導(dǎo)致不可預(yù)測(cè)的后果。
圖7.模塊7的子解碼指定要提取或替換的位,如果是源指示符,則指定即時(shí)位值。
作為目的地指示符,BVM 充當(dāng)進(jìn)位的代理。提取源的一個(gè)位并將其復(fù)制到進(jìn)位。如果 BVM 是源指示符,則子解碼的第 3 位(完整源指示符的第 7 位)中給出的值將復(fù)制到目標(biāo)的指定位。
請(qǐng)注意,BVM 僅適用于外設(shè)寄存器的 0 到 7 位。這對(duì)于大多數(shù)外設(shè)寄存器來(lái)說(shuō)是可以接受的,因?yàn)樵S多寄存器(特別是I/O端口)的長(zhǎng)度僅為8位。但是,當(dāng)訪問(wèn)16位外設(shè)寄存器時(shí),只有低階8位可用。
模塊 11 - 前綴
前綴模塊是MAXQ架構(gòu)的一個(gè)獨(dú)特特性,解決了所有16位微控制器的限制。對(duì)于 16 位寄存器,即時(shí)加載指令需要 16 位操作數(shù),這意味著有效的即時(shí)加載指令需要 16 位以上。
針對(duì)這一限制有幾種解決方案,包括可變長(zhǎng)度指令和寄存器,允許獨(dú)立訪問(wèn)低字節(jié)和高字節(jié)(MAXQ GR寄存器就是一個(gè)例子)。沒(méi)有一種解決方案是理想的,因?yàn)樗鼈儠?huì)使解碼邏輯復(fù)雜化或涉及新的寄存器(圖 8)。
圖8.當(dāng)前綴寄存器是目標(biāo)時(shí),8 位即時(shí)源為 16 位即時(shí)操作數(shù)提供高位字節(jié);目標(biāo)子解碼提供額外的位,以允許對(duì)每個(gè)模塊中源和目標(biāo)操作數(shù)的所有 32 個(gè)寄存器進(jìn)行尋址。
前綴機(jī)制以?xún)煞N方式改進(jìn)了此過(guò)程。首先,通過(guò)僅為那些特別需要額外位的指令添加前綴,該機(jī)制可以節(jié)省代碼空間和執(zhí)行時(shí)間。其次,通過(guò)不僅為直接操作數(shù)提供額外的位,而且為寄存器指示符提供額外的位,該機(jī)制保留了整體架構(gòu),同時(shí)擴(kuò)展了寄存器空間的大小。
請(qǐng)記住,雖然每個(gè)寄存器模塊有 32 個(gè)寄存器,但只有 <> 位指定源寄存器,只有 <> 位指定目標(biāo)寄存器。前綴機(jī)制提供這些附加位。
前綴機(jī)制在幾個(gè)方面是唯一的。首先,指令目標(biāo)部分的某些位用作直接源位,用于訪問(wèn)寄存器子解碼,源地址高于15,目標(biāo)地址高于<>。這樣,單個(gè)前綴指令可以提供從任何寄存器或即時(shí)值到任何寄存器子解碼的訪問(wèn)。
其次,前綴寄存器是唯一的,因?yàn)榧虞d到其中的任何值只能存活一個(gè)時(shí)鐘周期。之后,寄存器自動(dòng)清零。這意味著任何移動(dòng)到前綴寄存器的指令都必須是前綴寄存器要修改的指令之前的指令。這也意味著前綴指令是不可中斷的。如果在前綴操作之后發(fā)生中斷,則當(dāng)中斷返回到主函數(shù)時(shí),前綴信息將丟失。
如圖9所示,前綴寄存器中的位進(jìn)入源指示符、目標(biāo)指示符和即時(shí)值。因此,雖然大多數(shù)指令在單個(gè)周期內(nèi)執(zhí)行,但以下指令需要兩個(gè)周期:地址目標(biāo)寄存器子解碼大于 7;地址源寄存器子解碼大于 15;或加載大于 255 的即時(shí)值。
圖9.前綴寄存器提供 16 位即時(shí)操作數(shù)所需的額外位,并將每個(gè)模塊中的所有 32 個(gè)寄存器尋址為源和目標(biāo)。
為了說(shuō)明此過(guò)程,請(qǐng)考慮指令移動(dòng) A[0],#010h。由于這會(huì)將即時(shí)值移動(dòng)到模塊 9 寄存器 0,匯編程序?qū)?chuàng)建以下操作代碼:0910。但是,如果指令是移動(dòng) A[10],#0320h,匯編程序必須自動(dòng)插入前綴指令:2B03 2920。
如果沒(méi)有前綴指令,操作代碼 2920 將轉(zhuǎn)換為移動(dòng) A[2],#020h。但是前綴會(huì)向目標(biāo)說(shuō)明符添加位,為即時(shí)值添加額外的位,允許處理器將任何值加載到任何寄存器子解碼,并且永遠(yuǎn)不會(huì)花費(fèi)超過(guò)兩個(gè)周期。
幾個(gè)例子
獨(dú)特的MAXQ20內(nèi)核架構(gòu)允許一些在其他處理器中根本無(wú)法實(shí)現(xiàn)的操作。
向量中斷
MAXQ20內(nèi)核只有一個(gè)中斷矢量寄存器,有些人可能認(rèn)為這是一個(gè)限制因素。但請(qǐng)考慮具有兩個(gè)外部中斷的系統(tǒng),其中設(shè)備 A 連接到端口 0 位 0,設(shè)備 B 連接到端口 0 位 1?,F(xiàn)在,中斷選擇可以像跳轉(zhuǎn)PI0一樣簡(jiǎn)單。在地址 0 處,代碼為:
0000: IRET 0001: jump SERVICE_DEVICE_A 0002: jump SERVICE_DEVICE_B 0003: jump SERVICE_DEVICE_A
在此示例中,設(shè)備 A 在中斷服務(wù)中具有優(yōu)先級(jí)。也就是說(shuō),如果兩個(gè)中斷請(qǐng)求行都處于活動(dòng)狀態(tài)(端口 0 具有位 0 和 1 個(gè)活動(dòng)狀態(tài)),則為 A 提供服務(wù)。在中斷服務(wù)例程結(jié)束時(shí),設(shè)備A可能不再處于活動(dòng)狀態(tài),并且可以為設(shè)備B提供服務(wù)。
任務(wù)管理器
在許多應(yīng)用程序中,需要循環(huán)瀏覽任務(wù)列表以創(chuàng)建粗略類(lèi)型的多任務(wù)環(huán)境。當(dāng)不需要搶占(或由于實(shí)時(shí)原因而不希望)時(shí),這很有用。MAXQ架構(gòu)使這種過(guò)程變得簡(jiǎn)單:
task_wheel_init: move dp[0], #task_list task_wheel: move dp[0], dp[0] jump @dp[0]++ . . . task_list: dw task_01 dw task_02 dw task_03 dw task_wheel_init
指向任務(wù)列表。在task_wheel例程中,選擇 DP[0] 作為源指針,然后從任務(wù)列表中加載指令指針。當(dāng)每個(gè)任務(wù)完成時(shí),它不會(huì)執(zhí)行 RET,而是簡(jiǎn)單地跳轉(zhuǎn)到task_wheel例程。
執(zhí)行表向量中的最后一個(gè)條目以重新初始化指針,任務(wù)輪將再次開(kāi)始掃描表。
遍歷列表
通常,快速搜索大小不規(guī)則的對(duì)象列表以查找標(biāo)記的條目很有用。這在某些處理器架構(gòu)中很困難,因?yàn)閮?nèi)存訪問(wèn)功能已從 ALU 中刪除。在MAXQ中,這是一項(xiàng)簡(jiǎn)單的任務(wù)。
標(biāo)記 | 基 | 數(shù)據(jù) | |||||||||||||
3樓 | 09 | 00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | |||||
17 | 0E | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 1一 | 1乙 | 1C | 1D |
35 | 07 | 20 | 21 | 21 | 22 | 23 | 24 | 25 |
對(duì)于此示例,假定列表包含由標(biāo)記、長(zhǎng)度和數(shù)據(jù)字符串組成的數(shù)據(jù)對(duì)象。遍歷此列表的例程可能如下所示:在八條指令中,此例程遍歷列表,查找終止列表的匹配項(xiàng)或零條目。在8MHz MAXQ20內(nèi)核上,該例程每秒遍歷<>萬(wàn)個(gè)條目。
item_seek: move acc, @dp[0]++ ;Get tag jump z, item_not_found ;Tag==0 means end of list cmp a[1] ;A[1] has target tag jump e, item_found ;If item==target, exit move acc, @dp[0]++ ;If no match, get data len add dp[0] ;Add to pointer move dp[0], acc ;Store pointer back jump item_seek ;...and seek next item.
結(jié)論
盡管MAXQ內(nèi)核體積小,看似簡(jiǎn)單,但其傳輸觸發(fā)架構(gòu)使其在速度和靈活性方面具有顯著優(yōu)勢(shì)。由于外設(shè)直接通過(guò)寄存器接口尋址,因此通過(guò)嵌入式外設(shè)的數(shù)據(jù)傳輸速度令人印象深刻??傊?,任何形式的MAXQ內(nèi)核都是各種微控制器應(yīng)用的絕佳選擇。
審核編輯:郭婷
POPI |
-
微控制器
+關(guān)注
關(guān)注
48文章
7394瀏覽量
150625 -
處理器
+關(guān)注
關(guān)注
68文章
19032瀏覽量
228446 -
嵌入式
+關(guān)注
關(guān)注
5052文章
18909瀏覽量
300716
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論