www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當前位置:首頁 > 單片機 > 單片機
[導讀]Function Declarations函數(shù)聲明Cx51對標準C進行了一定的擴展,使用這些擴展可以:(1)把一個函數(shù)聲明為一個中斷過程(2)選擇使用的寄存器組(3)選擇存儲器模式(4)聲時可重入(5)聲明外部函數(shù)在函數(shù)聲中包含這些

Function Declarations函數(shù)聲明

Cx51對標準C進行了一定的擴展,使用這些擴展可以:

(1)把一個函數(shù)聲明為一個中斷過程

(2)選擇使用的寄存器組

(3)選擇存儲器模式

(4)聲時可重入

(5)聲明外部函數(shù)

在函數(shù)聲中包含這些擴展或?qū)傩?,使用下面的方法聲明Cx51函數(shù)

[return_type]funcname([args]) [{small | compact | large}][reentrant][interruptn][usingn]

這里

return_type 返回值類型

funcname 函數(shù)名稱

args參數(shù)

small, compact, or large 存儲器模式

reentrant 是否可重入

interrupt 是否是中斷函數(shù)

using 使用哪個寄存器組

Function Parameters and the Stack函數(shù)參和堆棧

經(jīng)典的8051堆棧指針只訪問內(nèi)部的數(shù)據(jù)存儲器。Cx51緊接著在所有的數(shù)據(jù)之后放堆棧區(qū)。堆棧指針間接地訪問內(nèi)部數(shù)據(jù)存儲器,可以訪問所有的00-FFH的空間

在經(jīng)典的8051中堆棧的空間是受限制的,最大只有256字節(jié)。除了函數(shù)參數(shù)消耗堆??臻g,Cx51為每個函數(shù)指定了一些固定的內(nèi)存空間。當函數(shù)被調(diào)用時,調(diào)用者必須在進入函數(shù)之前把參數(shù)拷貝到這個固定的空間中。然后函數(shù)從這個固定的空間中讀取并使用這些參數(shù)。在這個過程中只有返回地址存放在堆棧中。中斷函數(shù)會需要更多的堆??臻g,因為程序必須切換寄存器組并且保存一些寄存器的值到堆棧中。

注:Cx51允許使用在某些8051的增強型變種中可用的擴展的堆棧區(qū)。通過這種方式,堆棧區(qū)域的大小可以增加到幾K字節(jié)。

在缺省的情況下,Cx51使用三個寄存器傳遞函數(shù)的參數(shù),這樣可以提高代碼的執(zhí)行速度。

注:有些8051變種僅提供64字節(jié)的片上數(shù)據(jù)存儲器,大多數(shù)器件有256字節(jié)。在使用存儲器模式時應該把這些都考慮進去,畢竟片上的data和idata數(shù)據(jù)存儲器直接影響到堆??臻g的大小。

Passing Parameters in Registers通過寄存器傳遞參數(shù)

Cx51允許使用CPU寄存器傳遞三個參數(shù),由于這種方式不需將參數(shù)寫入存儲器和從存儲器中讀出,所以明顯地提高了系統(tǒng)的性能。參數(shù)的傳遞受上一章講到的REGPARMS 和NOREGPARMS指令控制。

下表列出了用于不同位置參數(shù)和數(shù)據(jù)類型的寄存器。


參數(shù)個數(shù)


Char, 1-yte ptr


Int, 2-byte ptr


Long, float


Generic ptr


1


R7


R6&R7


R4-R7


R1-R3


2


R5


R4&R5


R4-R7


R1-R3


3


R3


R2&R3



R1-R3


沒有可用的寄存器來傳遞參數(shù),則用一個固定的存儲器區(qū)域來傳遞函數(shù)參數(shù)。

Function Return Values函數(shù)返回值

函數(shù)返回值總是使用CPU寄存器。下表列出了返回值的類型和所用的寄存器。


返回值


寄存器


描述


Bit


進位標志



Char, unsigned char, 1-byte ptr


R7



Int, unsigned int, 2-byte ptr


R6&R7


高位字節(jié)為R6,低位字節(jié)為R7


Long, unsigned long


R4-R7


高位字節(jié)為R4,低位字節(jié)為R7


Float


R4-R7


32位IEEE格式


Generic ptr


R1-R3


存儲器類型在R3,高位R2,低位R1


注:如果函數(shù)的第一個參數(shù)是bit類型的,其他的參數(shù)據(jù)是不通過寄存器傳遞的。這是因為能在寄存器中傳遞的參數(shù)與前述的編號方案都不相同。因此,bit類型的參數(shù)應該在參數(shù)列表中末尾聲明。

Specifying the Memory Model for a Function

聲明函數(shù)的存儲器模式

Cx51函數(shù)通常采用缺省的存儲器模式來決定哪個存儲器空間用于函數(shù)的參數(shù)和局部變量。

可以通過包含small, compact,或large在函數(shù)的屬性中來指定函數(shù)的存儲器類型。

如:

int large_func (int i, int k) large /* Large model */

{

return (mtest (i, k) + 2);

}

函數(shù)使用small存儲器模式的好處是函數(shù)的參數(shù)和局部變量都放在8051的RAM中。因此,數(shù)據(jù)訪問效率非常高。然而,內(nèi)部的數(shù)存儲器有限。有時候有限的內(nèi)部數(shù)據(jù)存儲器的大小不能滿足需要,就必須使用其他的存儲器模式。在這種情況下,可以使用上面的方法定義一個函數(shù)使不同的存儲器模式。

通過指定函數(shù)的存儲器模式,可以從三種可能的可重入堆棧和結(jié)構(gòu)指針中擇優(yōu)使用。堆訪問SMALL模式要比訪問LARGE模式快得多。

Specifying the Register Bank for a Function

指定函數(shù)使用的寄存器組

8051系列器件的低32字節(jié)被分成了4個組,每個組8個寄存器。程序可以通過R0-R7訪問這些寄存器。寄存器組可以通過程序狀態(tài)字(PSW)的兩個位選擇。寄存器組對中斷處理或者是使用實時操作系統(tǒng)非常有用。在中斷服務程序中CPU切換寄存器組而不把不當前的寄存器都保存起來。

關(guān)鍵字using用來指定函數(shù)使用的寄存器組:

void rb_function (void) using 3

{

。。。。。。。

}

關(guān)鍵字using的參數(shù)是一個0-3的整型常量,而且表達式中不允許有操作符出現(xiàn)。在函數(shù)的原型中不允許出現(xiàn)using關(guān)鍵字。這個關(guān)鍵詞對函數(shù)代碼有如下影響:

(1)當前選擇的寄存器組在函數(shù)的入口處被保存在堆棧中

(2)指定的寄存器組被設定

(3)前面使用的寄存器組被保存下來直到當前的函數(shù)退出

不能關(guān)鍵字using來聲明一個返回值在寄存器中的函數(shù)。在使用的時候必須非常小心,確保寄存器組切換只出現(xiàn)在謹慎地控制地區(qū)域。稍不小心會得到錯誤的返回值。即使用同一個寄存器組,使用了using關(guān)鍵字聲明了屬性的函數(shù)也不能返回一個bit類型的值。

典型地,using屬性對于聲明了interrupt屬的函數(shù)是非常有用的。為每一個級別的中斷都聲明一個不同寄存器組是比較常見的。因此,你可以在所有非中斷程序中使用一個寄存器組,在高優(yōu)先級中斷中使用一個寄存器組,在低優(yōu)先級中斷中使用一個寄存器組。

Register Bank Access寄存器訪問

Cx51允許在一函數(shù)中定義缺省的寄存器組??刂浦噶頡EGISTERBANK允許程序員在源文件中指定在所有函數(shù)另使用哪一個寄存器組。然而這個指令并不產(chǎn)生切換寄存器的代碼。

復位后,8051在PSW中裝入00h從而選擇寄存器組0。所以缺省地所有非中斷程序代碼都使寄存器組0。要想改變,必須:

(1)修改startup代碼以選擇其他的寄存器組

(2)使用REGISTERBANK指令進行聲明

缺省地,Cx51編譯器生成用絕對地址訪問R0-R7的代碼。這是為了最高的執(zhí)行效率。絕對地址的使用通過指令AREGS和NOAREGS控制。使用絕對址進行寄存器訪問的函數(shù)不能被使用其他寄存器組的函數(shù)調(diào)用。由于調(diào)用者使用了不同的寄存器組,這樣做會引起不可預料的后果。要使用函數(shù)對當前的寄存器組不敏感,函數(shù)必須在編譯前使用控制指令NOAREGS。這對于那種可能在主函數(shù)中調(diào)用,也可能被使用不同寄存器組的中斷程序調(diào)用的函數(shù)很有用。注:Cx51編譯器并不檢查函數(shù)間的寄存器組是否一致。因此,必須確保使用不寄存器組的函數(shù)只調(diào)用那些不指定缺省寄存器組的函數(shù)。


本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動電源

在工業(yè)自動化蓬勃發(fā)展的當下,工業(yè)電機作為核心動力設備,其驅(qū)動電源的性能直接關(guān)系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護是驅(qū)動電源設計中至關(guān)重要的兩個環(huán)節(jié),集成化方案的設計成為提升電機驅(qū)動性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機 驅(qū)動電源

LED 驅(qū)動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設備的使用壽命。然而,在實際應用中,LED 驅(qū)動電源易損壞的問題卻十分常見,不僅增加了維護成本,還影響了用戶體驗。要解決這一問題,需從設計、生...

關(guān)鍵字: 驅(qū)動電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動電源的公式,電感內(nèi)電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設計 驅(qū)動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術(shù)之一是電機驅(qū)動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機驅(qū)動系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動汽車的動力性能和...

關(guān)鍵字: 電動汽車 新能源 驅(qū)動電源

在現(xiàn)代城市建設中,街道及停車場照明作為基礎設施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動電源 LED

LED通用照明設計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機重量也有所下降,所以,現(xiàn)在的LED驅(qū)動電源

關(guān)鍵字: LED 驅(qū)動電源 開關(guān)電源

LED驅(qū)動電源是把電源供應轉(zhuǎn)換為特定的電壓電流以驅(qū)動LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動電源
關(guān)閉