當(dāng)前位置:首頁(yè) > 嵌入式 > 嵌入式教程
[導(dǎo)讀]用協(xié)處理器提高IJLC/OS n,Il的實(shí)時(shí)性

引 言
   
μC/OS-II最多支持63個(gè)任務(wù),并支持信號(hào)量、郵箱、消息隊(duì)列等多種進(jìn)程間通信機(jī)制;同時(shí),用戶可以根據(jù)需求對(duì)內(nèi)核中的功能模塊進(jìn)行裁剪。將μC/OS-II應(yīng)用到嵌入式系統(tǒng)中,對(duì)于提高產(chǎn)品的質(zhì)量、縮短開(kāi)發(fā)周期和降低成本都有重要的意義。
    為了保證系統(tǒng)的實(shí)時(shí)性,μC/OS-II采用查表策略,使優(yōu)先級(jí)最高的任務(wù)一旦進(jìn)入就緒態(tài)就立刻可以運(yùn)行。這種查表算法與應(yīng)用系統(tǒng)的任務(wù)數(shù)目無(wú)關(guān),執(zhí)行時(shí)間是固定值,從而保證了系統(tǒng)的硬實(shí)時(shí)性。μC/OS-II實(shí)時(shí)內(nèi)核中唯一一個(gè)執(zhí)行時(shí)間受任務(wù)數(shù)目影響的函數(shù)是時(shí)鐘節(jié)拍,時(shí)鐘節(jié)拍的中斷服務(wù)子程序需要遍歷所有使用延遲函數(shù)的任務(wù),故執(zhí)行時(shí)間與任務(wù)數(shù)目有關(guān),為非固定值。此外,時(shí)鐘節(jié)拍的頻率也不能太高,否則會(huì)因?yàn)镃PU頻繁加載中斷服務(wù)子程序,導(dǎo)致加重了CPU負(fù)荷,影響μC/OS-II的實(shí)時(shí)性。
    Freescale公司的16位HCS12X(簡(jiǎn)稱“S12X”)系列單片機(jī)引入了一個(gè)協(xié)處理器,名為“XGATE”。與普通意義上的浮點(diǎn)協(xié)處理器不同,這個(gè)協(xié)處理器主要用來(lái)處理中斷。如果采用協(xié)處理器來(lái)處理μC/OS-II時(shí)鐘節(jié)拍的中斷,那么主CPU無(wú)需頻繁加載中斷服務(wù)子程序,從而保證μC/OS-II內(nèi)核的所有函數(shù)執(zhí)行時(shí)間都為固定值。這樣,μC/OS-II的實(shí)時(shí)性就得到了保證,還能以提高時(shí)鐘節(jié)拍中斷頻率的方法提高應(yīng)用系統(tǒng)定時(shí)的精度。


1 單片機(jī)中的協(xié)處理器
   
HCS12X系列單片機(jī)中的XGATE協(xié)處理器是精簡(jiǎn)指令集(RISC)結(jié)構(gòu)的處理器,它的工作時(shí)鐘頻率是S12X主CPU的2倍。主CPU初始化系統(tǒng)時(shí)可決定使用或禁用XGATE。若使用,則XGATE在初始化后就獨(dú)立地運(yùn)行,并通過(guò)雙端口RAM與CPU交換數(shù)據(jù),必要時(shí)向主CPU發(fā)中斷請(qǐng)求。
    XGATE處理完所有的中斷后進(jìn)入休眠態(tài),停止運(yùn)行,直到下一次中斷發(fā)生。XGATE比較適合響應(yīng)的中斷主要是加載頻率高的中斷,或不帶通信緩沖區(qū)的I/O中斷,例如SCI發(fā)送或接收中斷、PWM輸出中斷等。而對(duì)于本身帶發(fā)送、接收緩沖區(qū)的中斷(如CAN中斷、USB中斷等),采用協(xié)處理器處理中斷優(yōu)勢(shì)不明顯。
    μC/OS-II的時(shí)鐘節(jié)拍中斷是一個(gè)頻繁發(fā)生的中斷,所以很適合采用XGATE來(lái)響應(yīng)。以下重點(diǎn)介紹如何用XGATE協(xié)處理器響應(yīng)μC/0S—II的時(shí)鐘節(jié)拍中斷。


2 用XGATE實(shí)現(xiàn)μC/OS-II的時(shí)鐘節(jié)拍
   
μC/0S-11的時(shí)鐘節(jié)拍中斷可以采用單片機(jī)的實(shí)時(shí)中斷(Real-Time Interrupt,RTI)來(lái)實(shí)現(xiàn)。當(dāng)然也可以使用定時(shí)器中的計(jì)數(shù)器來(lái)產(chǎn)生時(shí)鐘節(jié)拍,原理相同,方法近似。使用XGATE來(lái)響應(yīng)RTI中斷,實(shí)現(xiàn)時(shí)鐘節(jié)拍時(shí),XGATE協(xié)處理器和主CPU的分工如表1所列。

    XGATE負(fù)責(zé)響應(yīng)RTI中斷,實(shí)現(xiàn)時(shí)鐘節(jié)拍,并完成任務(wù)延時(shí)計(jì)數(shù);在任務(wù)延時(shí)完成后,通知CPU進(jìn)行任務(wù)調(diào)度。另外,XGATE還用來(lái)響應(yīng)其他中斷,在需要任務(wù)調(diào)度時(shí)通知CPU。主CPU則只負(fù)責(zé)運(yùn)行任務(wù)(包括系統(tǒng)任務(wù))和任務(wù)調(diào)度,只有在需要任務(wù)調(diào)度時(shí)才會(huì)加載中斷服務(wù)子程序。使用XGATE來(lái)實(shí)現(xiàn)時(shí)鐘節(jié)拍的具體設(shè)置步驟如下所述。
2.1 將RTI中斷的控制權(quán)交給XGATE
   
為了將RTI中斷交由XGATE來(lái)處理,系統(tǒng)初始化時(shí)需要設(shè)置S12X單片機(jī)中RTI中斷對(duì)應(yīng)的中斷控制寄存器。中斷控制寄存器組成如下:

    在S12X單片機(jī)中,每一個(gè)I/O中斷都有一個(gè)中斷控制寄存器與之對(duì)應(yīng)。中斷控制寄存器控制相應(yīng)的中斷是由S12X CPU響應(yīng)還是由XGATE來(lái)響應(yīng),以及該中斷的優(yōu)先級(jí)。
    中斷控制寄存器中,RQST位為1時(shí),中斷由XGATE來(lái)響應(yīng);為0時(shí),中斷由S12X CPU響應(yīng)。為了使用XGATE來(lái)響應(yīng)RTI中斷,需要將RTI中斷對(duì)應(yīng)的中斷控制寄存器的RQST位置1。PRIOLVL[2:0]保存的是對(duì)應(yīng)中斷的優(yōu)先級(jí),值越大,對(duì)應(yīng)中斷的優(yōu)先級(jí)越高。如果這3位均為0,那么對(duì)應(yīng)中斷會(huì)被禁用。
    設(shè)置中斷控制寄存器可以調(diào)用編譯器提供的一個(gè)函數(shù)ROUTE_INTERRUPT。這個(gè)函數(shù)需要的參數(shù)是對(duì)應(yīng)中斷的中斷向量相對(duì)中斷向量表基址(0xFF00)的偏移量,以及中斷控制寄存器的值。設(shè)置RTI中斷控制寄存器的代碼如下:
    RUUTE_INTERRUPT (0xF0,0x81);
    其中,0xF0是RTI中斷向量相對(duì)中斷向量表基址的偏移量,0x81是要設(shè)置的中斷控制寄存器的值。
2.2 XGATE與S12X CPU的數(shù)據(jù)共享
   
XGATE實(shí)現(xiàn)μC/OS-II的時(shí)鐘節(jié)拍和S12X CPU實(shí)現(xiàn)任務(wù)調(diào)度,都需要訪問(wèn)與系統(tǒng)的任務(wù)控制塊鏈表相關(guān)的變量,因此這些變量需要聲明為XGATE和S12X CPU的共享變量。共享變量的聲明需要加上“volatile”類型聲明,并使用“#pragma”預(yù)處理命令將其放在共享內(nèi)存中。

    S12 CPU的程序中聲明如下:


    在XGATE的程序中,需要使用extern聲明這些變量,具體語(yǔ)句如下:


2.3 XGATE與S12X CPU的指針變量變換
   
因?yàn)閄GATE的內(nèi)存空間編址與S12X CPU的內(nèi)存空間編址不一樣,所以在指針變量共享時(shí)會(huì)存在問(wèn)題。CPU的內(nèi)存空間和XGATE的內(nèi)存空間的差別如圖1所示。

    從圖1中可以看出,在S12X CPU的尋址空間中,0x1000~0x3FFF為RAM空間;而對(duì)XGATE來(lái)說(shuō),RAM空間的地址范圍為Ox8000~0xFFFF。如果XGATE的程序直接使用CPU的指針變量,則會(huì)導(dǎo)致XGATE訪問(wèn)地址空間0x1000~0x3FFF,該區(qū)域?qū)τ赬GATE是Flash,從而出錯(cuò)。為了正確地共享指針變量,在XGATE中使用S12x CPU的指針變量時(shí),需要對(duì)指針變量進(jìn)行變換。S12X系列中不同單片機(jī)成員的地址分配可能有所不同。以MC9S12XDT512單片機(jī)為例,其內(nèi)部共有8 KB非分頁(yè)RAM,可全都設(shè)為S12X CPU和
XGATE的共享內(nèi)存。這8 KB RAM在S12X CPU中的地址為0x2000~0x3FFF;而在XGATE中的地址為0xE000~0xFFFF,地址偏差為0xC000。因此,在XGATE使用S12X CPU的指針變量時(shí),將指針變量的值加偏移量0xC000,就可以在XGATE程序中正常使用。
    下面是XGATE程序中一個(gè)指針變量變換的代碼:


    在XGATE協(xié)處理器中有8個(gè)寄存器,編譯器使用其中的R1來(lái)傳遞參數(shù),上面程序中的R2、R3是8個(gè)寄存器中的另外2個(gè)。
2.4 XGATE與S12X CPU的通信
   
XGATE處理RTI中斷時(shí)先完成指針變換,然后遍歷μC/OS-II的所有任務(wù)控制塊鏈表,對(duì)需要延時(shí)的任務(wù)進(jìn)行延時(shí)計(jì)數(shù)器減1操作。若無(wú)需任務(wù)調(diào)度,則XGATE回到休眠態(tài),直到響應(yīng)下一次中斷。僅當(dāng)某任務(wù)延時(shí)計(jì)數(shù)器遞減到零時(shí),該任務(wù)進(jìn)入就緒態(tài),需要任務(wù)調(diào)度時(shí)才通知S12X CPU進(jìn)行任務(wù)切換。
    在XGATE的中斷服務(wù)子程序中,中斷標(biāo)志指令SIF用于向S12X CPU發(fā)出中斷請(qǐng)求。該指令置位中斷標(biāo)志位,請(qǐng)求S12X CPU繼續(xù)響應(yīng)本次RTI中斷。在XGATE的中斷服務(wù)子程序中使用SIF 指令的代碼如下(其中R5是協(xié)處理器XGATE的8個(gè)寄存器之一):


    由于遍歷任務(wù)控制塊鏈表和各任務(wù)延時(shí)計(jì)數(shù)器減1的操作,以及無(wú)需任務(wù)調(diào)度的RTI中斷響應(yīng)都由XGATE完成了,S12X CPU只需要響應(yīng)確實(shí)需要進(jìn)行任務(wù)調(diào)度的RTI中斷,使其中斷服務(wù)子程序大大簡(jiǎn)化:


    這樣,CPU的RTI中斷服務(wù)子程序所要執(zhí)行的代碼是固定的,每次的運(yùn)行時(shí)間也是固定值,因而μC/OS-II的實(shí)時(shí)性得到了確切的保證。
    S12X CPU和XGATE的程序流程如圖2所示。

2.5 設(shè)置XGATE向量表
   
為了使XGATE正常響應(yīng)中斷,需要把XGATE的RTI中斷服務(wù)子程序地址寫(xiě)到XGATE的中斷向量表中。XGATE的中斷向量表的寫(xiě)法與CPU的中斷向量寫(xiě)法類似,只是XGATE的中斷子程序可代入一個(gè)參數(shù),需要將這個(gè)參數(shù)也寫(xiě)入中斷向量表。
    在XGATE中斷向量表的確定位置,寫(xiě)入RTI中斷服務(wù)子程序地址和參數(shù)變量,就可以使XGATE在響應(yīng)RTI中斷時(shí)進(jìn)入RTI中斷服務(wù)子程序。
    XGATE的中斷向量表的寫(xiě)法如下:


    其中,OSTCBList是XGATE響應(yīng)RTI中斷時(shí)需要帶入的參數(shù),這里這個(gè)參數(shù)是μC/OS-II任務(wù)控制塊鏈表的首地址;XGATE_TableEntry是一個(gè)編譯器自定義的結(jié)構(gòu)體變量類型;XGATE_VectorTable[]是XGATE的中斷向量表。寫(xiě)好XGATE的中斷向量表后,使用XGATE實(shí)現(xiàn)μC/OS-II時(shí)鐘節(jié)拍的設(shè)置過(guò)程就完成了。


3 效果測(cè)試與分析
   
為了驗(yàn)證用協(xié)處理器處理時(shí)鐘節(jié)拍中斷的效果,進(jìn)行如下測(cè)試:在同-S12x單片機(jī)上,分別使用和不使用XGATE處理μC/OS-II的時(shí)鐘節(jié)拍中斷。在兩種情況下,建立同樣的10個(gè)任務(wù),時(shí)鐘節(jié)拍中斷服務(wù)子程序中同樣只進(jìn)行任務(wù)控制塊鏈表遍歷和延時(shí)計(jì)數(shù)器減1,不做任務(wù)調(diào)度。這樣,μC/OS-II中會(huì)有一個(gè)任務(wù)總處于就緒態(tài)并一直運(yùn)行,這個(gè)一直運(yùn)行的任務(wù)會(huì)通過(guò)循環(huán)計(jì)數(shù)的方法在一個(gè)I/O端口上輸出一個(gè)方波。在同樣的總線時(shí)鐘和同樣頻率的時(shí)鐘節(jié)拍下,比較兩種μC/OS-II輸出的方波周期的差別。
    測(cè)試的目的是,觀察μC/OS-II的時(shí)鐘節(jié)拍中斷服務(wù)子程序的加載,對(duì)正在系統(tǒng)中運(yùn)行的任務(wù)的影響。為了與XGATE處理任務(wù)控制塊鏈表遍歷和延時(shí)計(jì)數(shù)器減1進(jìn)行對(duì)比,未使用XGATE的μC/OS-II中,S12X CPU的時(shí)鐘節(jié)拍中斷服務(wù)子程序只保留與XGATE同樣的操作。沒(méi)有任務(wù)調(diào)度,也方便對(duì)系統(tǒng)中正在運(yùn)行的任務(wù)輸出的方波進(jìn)行觀察。
    在不使用的XGATE的μC/OS-II中,S12X CPU的RTI中斷的中斷服務(wù)子程序代碼如下:


    以上S12X CPU中斷服務(wù)子程序共有220條指令,需運(yùn)行538個(gè)周期。測(cè)試中采用了16 MHz的總線時(shí)鐘和16 kHz的μC/OS-II時(shí)鐘節(jié)拍。可以估算出,每次中斷服務(wù)子程序在S12X CPU中的運(yùn)行時(shí)間為33.6 μs,約相當(dāng)于62.5μs時(shí)鐘節(jié)拍的53%,即S12X CPU需要用一多半的時(shí)間響應(yīng)時(shí)鐘節(jié)拍中斷,這顯然是不可取的。
    在μC/OS-II中用XGATE處理時(shí)鐘節(jié)拍中斷時(shí),當(dāng)無(wú)需做任務(wù)調(diào)度時(shí),XGATE遍歷10個(gè)任務(wù)的控制塊鏈表,執(zhí)行延時(shí)計(jì)數(shù)器減1操作,共需要148條指令。由于XGATE是RISC結(jié)構(gòu)的處理器,指令執(zhí)行時(shí)間多為1~2個(gè)周期,故執(zhí)行148條指令共需要218個(gè)周期。在32MHz時(shí)鐘頻率下,執(zhí)行時(shí)間大約7μs,僅相當(dāng)于62.5 μs時(shí)鐘節(jié)拍的11%。這說(shuō)明,即使使用短至62.5μs的時(shí)鐘
節(jié)拍,對(duì)XGATE的占用率也并不高。
    通過(guò)以上測(cè)試可看出,由單一CPU運(yùn)行μC/OS-II,16 kHz的時(shí)鐘節(jié)拍導(dǎo)致S12X CPU頻繁地加載中斷服務(wù)子程序,占用超過(guò)了50%,嚴(yán)重地影響了任務(wù)的實(shí)時(shí)運(yùn)行。故對(duì)于單一CPU,一般采用的時(shí)鐘節(jié)拍頻率不高于100 Hz,此時(shí)計(jì)時(shí)精度為±10 ms,以避免時(shí)鐘節(jié)拍中斷占用大量CPU運(yùn)行時(shí)間。
    在用XGATE處理μC/OS-II的時(shí)鐘節(jié)拍時(shí),16 kHz的時(shí)鐘節(jié)拍并未對(duì)S12X CPU的任務(wù)運(yùn)行產(chǎn)生影響,這個(gè)頻率的時(shí)鐘節(jié)拍使μC/OS-II的定時(shí)精度高于±62.5 μs。利用協(xié)處理器XGATE來(lái)處理μC/OS-II的時(shí)鐘節(jié)拍,使主CPU的執(zhí)行時(shí)間為固定值,因而保證了任務(wù)的實(shí)時(shí)運(yùn)行,提升了系統(tǒng)實(shí)時(shí)性,高頻率的時(shí)鐘節(jié)拍也提高了計(jì)時(shí)精度。


4 結(jié) 論
   
μC/OS-II中,時(shí)鐘節(jié)拍中斷服務(wù)子程序需要遍歷整個(gè)任務(wù)控制塊鏈表,不同應(yīng)用中任務(wù)數(shù)目不同,遍歷整個(gè)任務(wù)控制塊鏈表所花費(fèi)的時(shí)間就不同。時(shí)鐘節(jié)拍中斷所帶來(lái)的不確定性是影響μC/OS-II實(shí)時(shí)性指標(biāo)的唯一因素。采用協(xié)處理器來(lái)實(shí)現(xiàn)μC/OS-II的時(shí)鐘節(jié)拍可以很好地解決這個(gè)問(wèn)題。
    如果使用協(xié)處理器來(lái)響應(yīng)μC/OS-II的時(shí)鐘節(jié)拍中斷,那么μC/OS—II任務(wù)控制塊鏈表的遍歷和延時(shí)計(jì)數(shù)器減1操作均由協(xié)處理器完成。主CPU只有在需要做任務(wù)調(diào)度時(shí)才會(huì)進(jìn)入相應(yīng)的中斷服務(wù)子程序,因此主CPU運(yùn)行中斷服務(wù)子程序的時(shí)間是固定值。由于主CPU的運(yùn)行時(shí)間不會(huì)被時(shí)鐘節(jié)拍中斷占用,因而可以采用很高頻率的時(shí)鐘節(jié)拍來(lái)提高μC/OS-II的計(jì)時(shí)精度。

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

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開(kāi)發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開(kāi)幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉