Chan Chen Coding...

          Round Robin

          輪叫調(diào)度(Round-Robin Scheduling)
            輪叫調(diào)度(Round Robin Scheduling)算法就是以輪叫的方式依次將請求調(diào)度不同的服務(wù)器,即每次調(diào)度執(zhí)行i = (i + 1) mod n,并選出第i臺服務(wù)器。算法的優(yōu)點是其簡潔性,它無需記錄當(dāng)前所有連接的狀態(tài),所以它是一種無狀態(tài)調(diào)度。
            在系統(tǒng)實現(xiàn)時,我們引入了一個額外條件,當(dāng)服務(wù)器的權(quán)值為零時,表示該服務(wù)器不可用而不被調(diào)度。這樣做的目的是將服務(wù)器切出服務(wù)(如屏蔽服務(wù)器故障和系統(tǒng)維護),同時與其他加權(quán)算法保持一致。所以,算法要作相應(yīng)的改動,它的算法流程如下:
            輪叫調(diào)度算法流程
            假設(shè)有一組服務(wù)器S = {S0, S1, …, Sn-1},一個指示變量i表示上一次選擇的
            服務(wù)器,W(Si)表示服務(wù)器Si的權(quán)值。變量i被初始化為n-1,其中n > 0。
            j = i;
            do {
            j = (j + 1) mod n;
            if (W(Sj) > 0) {
            i = j;
            return Si;
            }
            } while (j != i);
            return NULL;
            輪叫調(diào)度算法假設(shè)所有服務(wù)器處理性能均相同,不管服務(wù)器的當(dāng)前連接數(shù)和響應(yīng)速度。該算法相對簡單,不適用于服務(wù)器組中處理性能不一的情況,而且當(dāng)請求服務(wù)時間變化比較大時,輪叫調(diào)度算法容易導(dǎo)致服務(wù)器間的負載不平衡。
            雖然Round-Robin DNS方法也是以輪叫調(diào)度的方式將一個域名解析到多個IP地址,但輪叫DNS方法的調(diào)度粒度是基于每個域名服務(wù)器的,域名服務(wù)器對域名解析的緩存會妨礙輪叫解析域名生效,這會導(dǎo)致服務(wù)器間負載的嚴(yán)重不平衡。這里,IPVS輪叫調(diào)度算法的粒度是基于每個連接的,同一用戶的不同連接都會被調(diào)度到不同的服務(wù)器上,所以這種細粒度的輪叫調(diào)度要比DNS的輪叫調(diào)度優(yōu)越很多。

          編輯本段Round-robin

            RTX51 Tiny可以配置成使用round-robin多任務(wù)。Round-robin容許quasi-parallel執(zhí)行多任務(wù)。任務(wù)并不是連續(xù)執(zhí)行的,而是分時間片執(zhí)行的(可用的CPU時間被分成時間片,RTX51 Tiny把時間片分配給各個任務(wù))。時間片的時間很短(以毫秒為單位),所以任務(wù)看起來像連續(xù)執(zhí)行一樣。任務(wù)在分配給他的時間片內(nèi)執(zhí)行(除非放棄)。然后切換到下一個就緒的任務(wù)。這個時間片在RTX51 Tiny Configuration.配置文件中定義.
            下面的例子是一個使用round-robin多任務(wù)的RTX51 Tiny的程序。這個程序中的兩個任務(wù)都是循環(huán)計數(shù)器。RTX51 Tiny執(zhí)行稱為job0的任務(wù)0。這個函數(shù)創(chuàng)建了另一個任務(wù)job1。Job0執(zhí)行完它的時間片后,RTX51 Tiny開始執(zhí)行job1。Job1執(zhí)行完它的時間片后,RTX51 Tiny又返回到j(luò)ob0開始執(zhí)行。然后再切換到j(luò)ob1,如此循環(huán)。
            #include
            int counter0;
            int counter1;
            void job0 (void) _task_ 0 {
            os_create (1); /* mark task 1 as ready */
            while (1) { /* loop forever */
            counter0++; /* update the counter */
            }
            }
            void job1 (void) _task_ 1 {
            while (1) { /* loop forever */
            counter1++; /* update the counter */
            }
            }
            注意:除了一個任務(wù)的時片到時,也可以使用函數(shù)os_wait 或函數(shù)os_switch_task通知RTX51 Tiny可以切換到另一個任務(wù)。函數(shù)os_wait掛起當(dāng)前任務(wù)直到特定的事件發(fā)生。在這期間任何其他的任務(wù)都可以執(zhí)行。
            Cooperative 任務(wù)切換??如果你禁止了round-robin多任務(wù),你必須設(shè)計并執(zhí)行你的任務(wù)從而讓他你們以cooperativ方式工作。特別地,你必須在每個任務(wù)的某個地方調(diào)用。這些函數(shù)告知RTX51 Tiny切換到另一任務(wù)。
            函數(shù)os_wait 和函數(shù)os_switch_task的不同之處在于os_wait可以讓你的任務(wù)等待某一事件的發(fā)生,而函數(shù)os_switch_task直接切換到另一個準(zhǔn)務(wù)就緒的任務(wù)。
            空閑任務(wù)
            當(dāng)沒有任務(wù)需要運行時,RTX51 Tiny執(zhí)行空閑任務(wù)。空閑任務(wù)只是一個簡單的無限循環(huán),比如:
            SJMP $
            有些8051器件提供了空閑模式,通過持起任務(wù)的執(zhí)行以降低功耗,直到出現(xiàn)中斷。在這種模式下,所有外圍設(shè)備包括中斷系統(tǒng)仍然在繼續(xù)工作。
            RTX51 Tiny允許你在空閑任務(wù)中初始化空閑模式(沒有其他任務(wù)需要執(zhí)行)。當(dāng)RTX51 Tiny時鐘節(jié)拍中斷(或任何其他中斷)出現(xiàn),微控制器恢復(fù)執(zhí)行程序。空閑任務(wù)執(zhí)行的代碼可以通過配置文件CONF_TNY.A51進行配置并使能
            堆棧管理
            RTX51 Tiny在8051的IDATA內(nèi)存區(qū)為每個任務(wù)維持一個堆棧。當(dāng)一個任務(wù)執(zhí)行時,給他準(zhǔn)備了最大可能需要地堆棧。當(dāng)任務(wù)切換時,前一個任務(wù)的堆棧被壓棧并重定位,而把當(dāng)前任務(wù)的堆棧被重定位并彈棧。STACK是堆棧的起始地址。在這個例子中,位于堆棧中的對像包括全局變量,寄存器和位地止內(nèi)存,剩下的內(nèi)存用作任務(wù)堆棧。內(nèi)存的頂端在配置文件中定義。

          配置RTX51 Tiny?

            RTX51 Tiny可以由根據(jù)用戶的應(yīng)用來定制。
            配置
            RTX51 Tiny必須根據(jù)你的嵌入式應(yīng)用來配置。所有地配置參數(shù)都在櫝置文件CONF_TNY.A51中,這個文件位于\KEIL\C51\RTXTINY2\文件夾中,文件中的櫝置選可以你做如下事情。
            指定時鐘節(jié)拍中斷寄存器組
            指定時鐘節(jié)拍間隔(多個8051機器周期)
            指定在時鐘節(jié)拍中斷中執(zhí)用的用戶代碼
            指定round-robin溢出時間
            使能禁能round-robin任務(wù)切換
            指定你的應(yīng)用程序包含了長時間的中斷
            指定是否使用了code banking
            定義RTX51 Tiny的棧頂
            指令需要最小的堆棧空間
            指定堆棧錯誤時執(zhí)行代碼
            定義空閑任務(wù)操作
            CONF_TNY.A51的默認配置包含在RTX51 Tiny的庫中。然而,要在就用中使用配置文件,必須把配置文件拷貝到你的工程文件夾并添加到工程中。
            要定制RTX51 Tiny的配置,必須改變CONF_TNY.A51的設(shè)置
            注意:
            如果在工程中不包括配置文件,默認的配置文件將會自動地包含到工程中。后事存在庫中的配置文件可能會對你的應(yīng)用起到相反效果
            硬件時鐘
            以下參數(shù)指定了如何配置制RTX51 Tiny的配件時鐘
            INT_REGBANK 指定制RTX51 Tiny時鐘中斷使用的寄存器組,默認的是寄存器組1
            INT_CLOCK 指定時鐘產(chǎn)生中斷前的周期數(shù)據(jù)。這個值的范圍是1000~65535。較小的值產(chǎn)生中斷較快。這個值用來計算時鐘的重新裝載值(65536-INT_CLOCK)。缺省值是10000。
            HW_TIMER_CODE 是一個宏定義,它用來指定在制RTX51 Tiny時鐘節(jié)拍中斷中執(zhí)的代碼。這個宏缺省的設(shè)置是從中斷中返回(RETI)如:
            HW_TIMER_CODE MACRO
            ; Empty Macro by default
            RETI
            ENDM
            Round-robin
            Round-robin切換是默認使能的,以下參數(shù)用來設(shè)定Round-robin切換的時間或禁能Round-robin切換
            TIMESHARING 指定任務(wù)在進行Round-robin切換前執(zhí)行的RTX51 Tiny時鐘節(jié)拍數(shù)。當(dāng)這個值為0時禁止Round-robin切換。缺省值是5個時鐘節(jié)拍。
            長時間中斷
            一般情況下,中斷服務(wù)程序(ISRs)都要求很快執(zhí)行完畢。有時候,中斷服務(wù)程序可能需執(zhí)行很長一段時間。如果一個高優(yōu)先級的中斷執(zhí)的時間超過了節(jié)拍間隔,RTX51的時鐘中斷就可能被這個更高優(yōu)先級的中斷中斷了,并且被以后的RTX51 時鐘中斷重入了。
            如果使用了需要運行很長時間的高優(yōu)先級中斷,就應(yīng)該考慮減少中斷服務(wù)程序的工作量,改變RTX51 時鐘節(jié)拍的速率,或考使用以下配置。
            LONG_USR_ISR 指定是否使用執(zhí)行時間超過時鐘節(jié)拍的中斷。當(dāng)這個值置為1時,RTX51 Tiny就會把保護RTX51 Tiny時鐘節(jié)拍中斷重入的代碼包含進去。這個值缺省為0
            Code banking
            以下設(shè)置指定RTX51 Tiny應(yīng)用中是否使用code banking
            CODE_BANKING 置1使用code banking,清0不使用code banking。缺省值為0
            注意:L51_BANK.A51的2.2或更高版本需要RTX51 Tiny 程序使用code banking
            堆棧
            堆棧的配置選項有幾個。以下參指定了用于堆棧的內(nèi)存空間的大小和堆棧的最小空間。當(dāng)CPU的堆棧空間不夠時用一個宏指定去執(zhí)行哪一段代碼。
            RAMTOP指定棧頂?shù)刂贰W詈貌灰薷倪@個地址除非你在這個堆棧的上面使用了IDATA變量。
            FREE_STACK指定堆棧上的最少可用空間。當(dāng)切換到一個任務(wù)是時,如果RTX51 Tiny檢測到可用的堆棧空間小于這個值,STACK_ERROR宏就會被執(zhí)行。置為0將禁止對堆棧的檢查,缺省值為20字節(jié)
            STACK_ERROR是一個宏,它代表了一段在堆棧出現(xiàn)錯誤時執(zhí)行的代碼。這個宏的缺省代碼為禁能中斷并進入一個無限循環(huán)。如
            STACK_ERROR MACRO
            CLR EA ; disable interrupts
            SJMP $ ; endless loop if stack space is exhausted
            ENDM
            空閑任務(wù)
            沒有任務(wù)需要執(zhí)行時,RTX51 Tiny就執(zhí)行空閑任務(wù)。空閑任務(wù)什么都不做,只是等待RTX51 Tiny的時鐘節(jié)拍中斷并切換到另一個就緒的任務(wù)。以下參數(shù)用來配置RTX51 Tiny空閑任務(wù)的不同方面
            CPU_IDLE 這是一個宏,代表了在空閑任務(wù)中執(zhí)行的代碼。缺省指令是設(shè)置寄存器PCON的空閑模式位。這樣就可以通過掛起程序節(jié)省能耗。如
            CPU_IDLE MACRO
            ORL PCON,#1 ; set 8051 CPU to IDLE
            ENDM
            CPU_IDLE_CODE 指定CPU_IDLE宏在空閑任務(wù)中是否執(zhí)行。缺省值為0,這樣空閑任務(wù)將不包含CPU_IDLE宏
            庫文件
            RTX51 Tiny包括兩個庫文件
            RTX51TNY.LIB is used for non-banking RTX51 Tiny programs
            RTX51BT.LIB is used for code-banking RTX51 Tiny programs.
            The RTXTINY2.PRJ project found in the \KEIL\C51\RTXTINY2\SOURCECODE\ folder is used to build these two libraries.
            注意:不需要在應(yīng)用顯式地包含這兩個文件。如果你使用μVision2 IDE或command-line linker時這兩個文件會自動地包含進去。
            如果要建立RTX51 Tiny的庫,缺省的配置文件會加入進去。如果不顯式地聲明包含配置文件,默認的配置文件會包含進去。以后對配置文件做的修改會對就用產(chǎn)生意想不到的效果。
            優(yōu)化
            可以通過以下方式優(yōu)化RTX51 Tiny程序
            如果可能,禁能round-robin任務(wù)切換。Round-robin需要13字節(jié)堆棧空間來存儲任務(wù)地址和所有寄存器。如果任務(wù)切換是通過RTX51 Tiny運行時庫(比如os_wait或 os_switch_task)來觸發(fā)的就不需要這些空間了。
            使用os_wait而不是使用round-robin的時間耗盡來切換任務(wù)。這些會提高系統(tǒng)的反應(yīng)時間和任務(wù)的反應(yīng)速度
            避免把系統(tǒng)時鐘節(jié)拍的中斷速率設(shè)的太高。把時鐘溢出的時間設(shè)的比較短增加了每秒的時鐘節(jié)拍數(shù)但是減少了每個任的可用時間,因為每個時鐘節(jié)拍中斷會使用100-200個周期來運行。所以要把湔出時間設(shè)的足夠的小從而減小時鐘節(jié)拍中斷帶來的副作用。
            使用RTX51 Tiny
            要使用RTX51 Tiny,必須成功地生成RTX51程序并編譯連接他們
            編寫程序
            定義RTX51程序使用關(guān)鍵字 _task_
            以RTX51TNY.H的模板使用RTX51 Tiny的內(nèi)核
            包含文件
            RTX51 Tiny只需包含一個文件RTX51TNY.H。所有的運行時庫來常量都在這個頭文件中定義。可以采用以下方式包含它:
            #include <rtx51tny.h>
            編程指南
            使用RTX51 Tiny編程時須遵循下規(guī)則:
            包含文件rtx51tny.h
            不要創(chuàng)建C主函數(shù),RTX51 Tiny有它自已的主要函數(shù)
            程序至少創(chuàng)建一個任務(wù)
            程序必須至少調(diào)用一次RTX51 Tiny運行時庫(如os_wait)。否則,連接器將不會把RTX51 Tiny庫包含進去
            任務(wù)0是你的程序執(zhí)行的第一任務(wù)。必須調(diào)用在任務(wù)0中調(diào)用os_create_task函數(shù)來運行其他任務(wù)
            任務(wù)永不返回或退出。任務(wù)必須使用while(1)或類似的結(jié)構(gòu)。使用os_delete_task函數(shù)可以掛起一個任務(wù)
            必須在μVision2中或在連接編譯命令行中指定RTX51 Tiny
            定義任務(wù)
            實時或多任務(wù)應(yīng)用由一個或多個完成特定功能的任務(wù)組成。RTX51 Tiny支持最多16個任務(wù)
            任務(wù)必須是用_task_聲明的C函數(shù),返回值和參數(shù)都必須是void類型的,如
            void func (void) _task_ task_id
            這里
            func is the name of the task function.
            task_id is a task ID number from 0 to 15
            以下例子定義了函數(shù)job0作為一個任務(wù),任務(wù)編號為0。
            void job0 (void) _task_ 0 {
            while (1) {
            counter0++; /* increment counter */
            }
            }
            注意:所有的任務(wù)都必須通過循環(huán)實現(xiàn),而且永不返回 

          -----------------------------------------------------
          Silence, the way to avoid many problems;
          Smile, the way to solve many problems;

          posted on 2012-05-16 02:57 Chan Chen 閱讀(1417) 評論(0)  編輯  收藏 所屬分類: Architecture

          主站蜘蛛池模板: 开远市| 古浪县| 广东省| 聂拉木县| 淅川县| 修武县| 沂南县| 福清市| 资源县| 抚远县| 丹阳市| 屯昌县| 新绛县| 梧州市| 莆田市| 绩溪县| 丰镇市| 阜南县| 九龙坡区| 昌黎县| 普陀区| 涞源县| 海南省| 武安市| 浏阳市| 社旗县| 广丰县| 新乡县| 苍南县| 鹿泉市| 枣庄市| 鸡西市| 墨江| 韶关市| 宜宾县| 文水县| 临沂市| 鄂州市| 原平市| 临猗县| 南投县|