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