0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

解開(kāi)MAXQ的秘密

星星科技指導(dǎo)員 ? 來(lái)源:ADI ? 作者:ADI ? 2023-03-03 13:50 ? 次閱讀

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)核中的特殊功能,這些功能超出了本文的范圍。

pYYBAGQBiq2AKgcgAAAkp0sq53Q630.gif


圖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 寄存器的值。

poYBAGQBiq6ADTwTAAA1yXsQnZc443.gif


圖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。

pYYBAGQBiq-AfsI_AAAOHV6vOeo272.gif


圖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)。

poYBAGQBirCAOW5cAAAoHjZ1UeA185.gif


圖4.MAXQ20內(nèi)核中的寄存器分配分為兩個(gè)區(qū)域:寄存器組0至5為外設(shè)寄存器,可以從MAXQ器件切換到另一個(gè)MAXQ器件;組7至15是系統(tǒng)寄存器,在所有MAXQ部件上保持相對(duì)固定。

pYYBAGQBirGAf6UoAAA40_ljht4962.gif


圖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)。

poYBAGQBirKAavCwAABAWLKEpxw841.gif


圖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
@BP[offs++]
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è)的后果。

pYYBAGQBirOAQifNAAAQe1hhykE483.gif


圖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)。

poYBAGQBirSAP1gtAAAvrKFa2LI010.gif


圖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í)值。

pYYBAGQBirWAZXWvAAAdeEJqF6g508.gif


圖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

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 微控制器
    +關(guān)注

    關(guān)注

    48

    文章

    7394

    瀏覽量

    150625
  • 處理器
    +關(guān)注

    關(guān)注

    68

    文章

    19032

    瀏覽量

    228446
  • 嵌入式
    +關(guān)注

    關(guān)注

    5052

    文章

    18909

    瀏覽量

    300716
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    MAXQ1850評(píng)估套件(EV kit)和面向MAXQ30的CrossWorks編譯器的設(shè)計(jì)方案

    本應(yīng)用筆記介紹怎樣針對(duì)MAXQ1850高性能、RISC、安全微控制器開(kāi)發(fā)、構(gòu)建并調(diào)試應(yīng)用程序。實(shí)例采用了MAXQ1850評(píng)估套件(EV kit)和Rowley Associates公司提供
    發(fā)表于 12-24 09:23

    MAXQ8913芯片結(jié)束資料分享

    MAXQ8913概述  MAXQ8913是一款單芯片伺服控制器,為雙軸光學(xué)圖像防抖(OIS)裝置提供完整的解決方案。該器件組合了傳感器信號(hào)調(diào)理所需的所有元件,包括:模/數(shù)轉(zhuǎn)換器、支持?jǐn)?shù)字伺服算法
    發(fā)表于 09-28 10:22

    USB收發(fā)器的微控制電路MAXQ612相關(guān)資料下載

    MAXQ612采用LQFP64腳封裝和TQFN44腳封裝。為低功耗、16位MAXQ?低功耗、高吞吐率、16位RISC微控制器。串行外設(shè)包括兩個(gè)通用同步/異步接收-發(fā)送器(USART)、兩個(gè)SPI?主
    發(fā)表于 04-19 07:37

    MAXQ3120電表參考設(shè)計(jì)的定制功能是什么

    MAXQ3120電表參考設(shè)計(jì)的定制功能是什么數(shù)字的顯示順序是什么?如何定制DSP程序?
    發(fā)表于 05-12 06:21

    MAXQ610 pdf,MAXQ610 datasheet

    The MAXQ610 is a low-power, 16-bit MAXQ® microcontroller designed for low-power applications
    發(fā)表于 10-10 08:20 ?16次下載

    MAXQ7665,MAXQ7665A, MAXQ7665B

    The MAXQ7665,MAXQ7665A, MAXQ7665B smart systems-on-a-chip (SoC) are data-acquisition systems based
    發(fā)表于 01-22 16:23 ?32次下載

    MAXQ7665C, MAXQ7665D pdf datas

    The MAXQ7665A–MAXQ7665D smart systems-on-a-chip (SoC) are data-acquisition systems based on a
    發(fā)表于 01-22 16:25 ?15次下載

    MAXQ610 16-Bit MAXQ® Micro

    MAXQ610 16-Bit MAXQ® Microcontroller Greatly Extends Battery Life in Portable Equipment
    發(fā)表于 02-06 13:37 ?1147次閱讀

    MAXQ揭密

    摘要:MAXQ內(nèi)核是功能強(qiáng)大的、單周期、基于傳遞觸發(fā)的CPU。本文通過(guò)演示如何根據(jù)簡(jiǎn)單的MOVE操作建立整個(gè)指令集來(lái)證明MAXQ的強(qiáng)大性能。 MAXQ處理器家族包括功能強(qiáng)大的
    發(fā)表于 04-23 16:26 ?1364次閱讀
    <b class='flag-5'>MAXQ</b>揭密

    MAXQ612, MAXQ622 具有紅外模塊和USB (可

    MAXQ612, MAXQ622 具有紅外模塊和USB (可選)功能的16位微控制器 概述 The MAXQ612/MAXQ622 are l
    發(fā)表于 03-03 22:28 ?846次閱讀
    <b class='flag-5'>MAXQ</b>612, <b class='flag-5'>MAXQ</b>622 具有紅外模塊和USB (可

    基于MAXQ3180/MAXQ3183的電能表參考設(shè)計(jì)

      參考設(shè)計(jì)為電能表使用MAXQ3180/MAXQ3183   摘要:MAXQ
    發(fā)表于 10-28 08:57 ?1694次閱讀
    基于<b class='flag-5'>MAXQ</b>3180/<b class='flag-5'>MAXQ</b>3183的電能表參考設(shè)計(jì)

    MAXQ612/MAXQ622低功耗、16位MAXQ微控制器

    MAXQ612/MAXQ622低功耗、16位MAXQ?微控制器設(shè)計(jì)用于通用遙控器、消費(fèi)類(lèi)電子和白色家電等低功耗產(chǎn)品。兩款器件均采用低功耗、高吞吐率、16位RISC微控制器
    發(fā)表于 05-28 11:47 ?1288次閱讀
    <b class='flag-5'>MAXQ</b>612/<b class='flag-5'>MAXQ</b>622低功耗、16位<b class='flag-5'>MAXQ</b>微控制器

    解開(kāi)程序員面試筆試的秘密-C語(yǔ)言深度解剖 陳正沖 編著

    電子發(fā)燒友網(wǎng)站提供《解開(kāi)程序員面試筆試的秘密-C語(yǔ)言深度解剖 陳正沖 編著.txt》資料免費(fèi)下載
    發(fā)表于 12-08 11:22 ?0次下載

    C語(yǔ)言深度解剖_解開(kāi)程序員面試筆試的秘密-陳正沖編著

    電子發(fā)燒友網(wǎng)站提供《C語(yǔ)言深度解剖_解開(kāi)程序員面試筆試的秘密-陳正沖編著.txt》資料免費(fèi)下載
    發(fā)表于 01-22 17:00 ?0次下載

    MAXQ1065EVKIT: Evaluation Kit for the MAXQ1065 Data Sheet MAXQ1065EVKIT: Evaluation Kit for the MAXQ1065 Data Sheet

    電子發(fā)燒友網(wǎng)為你提供ADI(ADI)MAXQ1065EVKIT: Evaluation Kit for the MAXQ1065 Data Sheet相關(guān)產(chǎn)品參數(shù)、數(shù)據(jù)手冊(cè),更有
    發(fā)表于 10-17 18:31
    <b class='flag-5'>MAXQ</b>1065EVKIT: Evaluation Kit for the <b class='flag-5'>MAXQ</b>1065 Data Sheet <b class='flag-5'>MAXQ</b>1065EVKIT: Evaluation Kit for the <b class='flag-5'>MAXQ</b>1065 Data Sheet