資料介紹
摘要 在許多系統(tǒng)資源非常緊張的單片機(jī)應(yīng)用中,使用實(shí)時(shí)操作系統(tǒng)進(jìn)行任務(wù)調(diào)度來實(shí)現(xiàn)實(shí)時(shí)多任務(wù)系統(tǒng)時(shí),由操作系統(tǒng)帶來的系統(tǒng)開銷往往是不可接受的。通過升級(jí)硬件來改善系統(tǒng)資源緊張,意味著成本的增加,降低產(chǎn)品的競(jìng)爭(zhēng)力。本文介紹采用Protothread在非常小的系統(tǒng)開銷下實(shí)現(xiàn)實(shí)時(shí)多任務(wù)系統(tǒng)的方法。
關(guān)鍵詞 Protothread 實(shí)時(shí) 多任務(wù) 線程模型
嵌入式程序框架一般類似于程序1所示結(jié)構(gòu):系統(tǒng)中有3個(gè)任務(wù)——TaskA、TaskB、TaskC,均放置于主循環(huán)內(nèi),在每一個(gè)循環(huán)周期內(nèi)都被執(zhí)行一次。在這種結(jié)構(gòu)中,能滿足系統(tǒng)實(shí)時(shí)性要求的條件是: (當(dāng)且僅當(dāng))TaskA 、TaskB、TaskC三個(gè)任務(wù)的運(yùn)行時(shí)間之和要小于系統(tǒng)實(shí)時(shí)響應(yīng)的時(shí)間要求。在系統(tǒng)較為簡(jiǎn)單、任務(wù)運(yùn)行時(shí)間能滿足實(shí)時(shí)要求的情況下,可以采用這種最簡(jiǎn)單、最直接的順序執(zhí)行方式。但是更多的情形是,系統(tǒng)不僅要對(duì)一些事件做出實(shí)時(shí)響應(yīng),并且還要承擔(dān)很多其他的非實(shí)時(shí)任務(wù),并且這些非實(shí)時(shí)任務(wù)的運(yùn)行時(shí)間要遠(yuǎn)遠(yuǎn)超出了實(shí)時(shí)響應(yīng)時(shí)間的要求。傳統(tǒng)的這種程序結(jié)構(gòu)顯然不能滿足系統(tǒng)的實(shí)時(shí)性要求。通常的解決方案是,引入實(shí)時(shí)操作系統(tǒng),由操作系統(tǒng)進(jìn)行任務(wù)的調(diào)度,優(yōu)先執(zhí)行實(shí)時(shí)任務(wù),達(dá)到滿足系統(tǒng)實(shí)時(shí)性的要求。
程序1嵌入式程序框架
void main(void) {
Init();
while(1) {
TaskA();
TaskB();
TaskC();
}
}
void Interrupt_1(void) interrupt 1 {
…
}
void Interrupt_2(void) interrupt 2 {
…
}
一般來說,在嵌入式系統(tǒng)開發(fā)中引入實(shí)時(shí)操作系統(tǒng)有諸多優(yōu)點(diǎn):
◆ 更好地支持多任務(wù),實(shí)時(shí)性要求能夠得以保障;
◆ 程序開發(fā)更加容易,也更便于維護(hù);
◆ 有利于提高系統(tǒng)的穩(wěn)定性和可靠性。但是,操作系統(tǒng)的引入也將帶來較多的系統(tǒng)開銷:
◆ 實(shí)時(shí)操作系統(tǒng)往往使用定時(shí)器中斷來切換任務(wù),需要消耗不少的CPU處理時(shí)間;
◆ 實(shí)時(shí)操作系統(tǒng)在切換任務(wù)時(shí)需要保護(hù)當(dāng)前任務(wù)的執(zhí)行現(xiàn)場(chǎng),這就需要為每個(gè)任務(wù)準(zhǔn)備足夠多的RAM空間來實(shí)現(xiàn)任務(wù)切換;
◆ 實(shí)時(shí)操作系統(tǒng)的本身也需要占用相當(dāng)數(shù)量的Flash空間和RAM空間。
如果這些系統(tǒng)開銷都在可承受的范圍內(nèi),那么采用實(shí)時(shí)操作系統(tǒng)將是最佳的選擇。但是在很多應(yīng)用的場(chǎng)合,特別是系統(tǒng)的資源非常緊張的單片機(jī)應(yīng)用,實(shí)時(shí)操作系統(tǒng)帶來的系統(tǒng)開銷往往是不可接受的。而更換速度更快、RAM更大、Flash更多的CPU意味著成本的增加,且會(huì)降低產(chǎn)品的競(jìng)爭(zhēng)力。當(dāng)系統(tǒng)中的任務(wù)不須進(jìn)行非常復(fù)雜的優(yōu)先級(jí)調(diào)度,而且其任務(wù)也相對(duì)簡(jiǎn)單時(shí),引入實(shí)時(shí)操作系統(tǒng)似有殺雞用牛刀之嫌。
1 Protothread的特點(diǎn)
Protothread是專為資源有限的系統(tǒng)設(shè)計(jì)的一種耗費(fèi)資源特別少并且不使用堆棧的線程模型,其特點(diǎn)是:
◆ 以純C語言實(shí)現(xiàn),無硬件依賴性;
◆ 極少的資源需求,每個(gè)Protothread僅需要2個(gè)額外的字節(jié);
◆ 可以用于有操作系統(tǒng)或無操作系統(tǒng)的場(chǎng)合;
◆ 支持阻塞操作且沒有棧的切換。
使用Protothread實(shí)現(xiàn)多任務(wù)的最主要的好處在于它的輕量級(jí)。每個(gè)Protothread不需要擁有自已的堆棧,所有的Protothread共享同一個(gè)堆棧空間,這一點(diǎn)對(duì)于RAM資源有限的系統(tǒng)尤為有利。相對(duì)于操作系統(tǒng)下的多任務(wù)而言,每個(gè)任務(wù)都有自已的堆??臻g,這將消耗大量的RAM資源,而每個(gè)Protothread僅使用一個(gè)整型值保存當(dāng)前狀態(tài)。
2 Protothread的阻塞運(yùn)行機(jī)制
以下是一個(gè)典型的Protothread程序示例:
程序2Protothread程序示例
PT_THREAD(radio_wake_thread(struct pt *pt)) {
PT_BEGIN(pt);
while(1) {
radio_on();
timer_set(&timer, T_AWAKE);
PT_WAIT_UNTIL(pt, timer_expired(&timer));
timer_set(&timer, T_SLEEP);
if(!communication_complete()) {
PT_WAIT_UNTIL(pt, communication_complete()‖timer_expired(&timer));
}
if(!timer_expired(&timer)) {
radio_off();
PT_WAIT_UNTIL(pt, timer_expired(&timer));
}
}
PT_END(pt);
}
這是一個(gè)非常簡(jiǎn)單的無線通信的狀態(tài)切換程序①,展開Protothread的宏定義,便可以得到程序3所示的展開代碼:
程序3Protothread宏展開代碼
void radio_wake_thread(struct pt *pt) {
switch(pt﹥lc) {
case 0:
while(1) {
radio_on();
timer_set(&timer, T_AWAKE);
pt﹥lc = 8;
case 8:
if(!timer_expired(&timer)) {
return;
}
timer_set(&timer, T_SLEEP);
if(!communication_complete()) {
pt﹥lc = 13;
case 13:
if(?。╟ommunication_complete() ||timer_expired(&timer))) {
return;
}
}
if(!timer_expired(&timer)) {
radio_off();
pt﹥lc = 18;
case 18:
if(!timer_expired(&timer)) {
return;
}
}
}
}
}
當(dāng)Protothread程序運(yùn)行到PT_WAIT_UNTIL時(shí),判斷其運(yùn)行條件是否滿足,若不滿足,則阻塞。通過比對(duì)程序2和程序3的程序代碼可以得知,Protothread的阻塞其實(shí)質(zhì)就是函數(shù)返回,只不過在返回前保存了當(dāng)前的阻塞位置,待下一次Protothread被調(diào)用時(shí),直接跳到阻塞位置執(zhí)行,再次判斷運(yùn)行條件是否滿足,并執(zhí)行后續(xù)程序或繼續(xù)阻塞。
3 利用Protothread構(gòu)造實(shí)時(shí)多任務(wù)系統(tǒng)
與操作系統(tǒng)下的多任務(wù)不同,操作系統(tǒng)下的每個(gè)任務(wù)可在任意時(shí)刻被打斷并阻塞,Protothread僅能在程序員指定位置阻塞。用Protothread實(shí)現(xiàn)實(shí)時(shí)多任務(wù),正是利用了Protothread在指定位置阻塞的特點(diǎn),讓出執(zhí)行權(quán)限給更高優(yōu)先級(jí)的任務(wù)先運(yùn)行
關(guān)鍵詞 Protothread 實(shí)時(shí) 多任務(wù) 線程模型
嵌入式程序框架一般類似于程序1所示結(jié)構(gòu):系統(tǒng)中有3個(gè)任務(wù)——TaskA、TaskB、TaskC,均放置于主循環(huán)內(nèi),在每一個(gè)循環(huán)周期內(nèi)都被執(zhí)行一次。在這種結(jié)構(gòu)中,能滿足系統(tǒng)實(shí)時(shí)性要求的條件是: (當(dāng)且僅當(dāng))TaskA 、TaskB、TaskC三個(gè)任務(wù)的運(yùn)行時(shí)間之和要小于系統(tǒng)實(shí)時(shí)響應(yīng)的時(shí)間要求。在系統(tǒng)較為簡(jiǎn)單、任務(wù)運(yùn)行時(shí)間能滿足實(shí)時(shí)要求的情況下,可以采用這種最簡(jiǎn)單、最直接的順序執(zhí)行方式。但是更多的情形是,系統(tǒng)不僅要對(duì)一些事件做出實(shí)時(shí)響應(yīng),并且還要承擔(dān)很多其他的非實(shí)時(shí)任務(wù),并且這些非實(shí)時(shí)任務(wù)的運(yùn)行時(shí)間要遠(yuǎn)遠(yuǎn)超出了實(shí)時(shí)響應(yīng)時(shí)間的要求。傳統(tǒng)的這種程序結(jié)構(gòu)顯然不能滿足系統(tǒng)的實(shí)時(shí)性要求。通常的解決方案是,引入實(shí)時(shí)操作系統(tǒng),由操作系統(tǒng)進(jìn)行任務(wù)的調(diào)度,優(yōu)先執(zhí)行實(shí)時(shí)任務(wù),達(dá)到滿足系統(tǒng)實(shí)時(shí)性的要求。
程序1嵌入式程序框架
void main(void) {
Init();
while(1) {
TaskA();
TaskB();
TaskC();
}
}
void Interrupt_1(void) interrupt 1 {
…
}
void Interrupt_2(void) interrupt 2 {
…
}
一般來說,在嵌入式系統(tǒng)開發(fā)中引入實(shí)時(shí)操作系統(tǒng)有諸多優(yōu)點(diǎn):
◆ 更好地支持多任務(wù),實(shí)時(shí)性要求能夠得以保障;
◆ 程序開發(fā)更加容易,也更便于維護(hù);
◆ 有利于提高系統(tǒng)的穩(wěn)定性和可靠性。但是,操作系統(tǒng)的引入也將帶來較多的系統(tǒng)開銷:
◆ 實(shí)時(shí)操作系統(tǒng)往往使用定時(shí)器中斷來切換任務(wù),需要消耗不少的CPU處理時(shí)間;
◆ 實(shí)時(shí)操作系統(tǒng)在切換任務(wù)時(shí)需要保護(hù)當(dāng)前任務(wù)的執(zhí)行現(xiàn)場(chǎng),這就需要為每個(gè)任務(wù)準(zhǔn)備足夠多的RAM空間來實(shí)現(xiàn)任務(wù)切換;
◆ 實(shí)時(shí)操作系統(tǒng)的本身也需要占用相當(dāng)數(shù)量的Flash空間和RAM空間。
如果這些系統(tǒng)開銷都在可承受的范圍內(nèi),那么采用實(shí)時(shí)操作系統(tǒng)將是最佳的選擇。但是在很多應(yīng)用的場(chǎng)合,特別是系統(tǒng)的資源非常緊張的單片機(jī)應(yīng)用,實(shí)時(shí)操作系統(tǒng)帶來的系統(tǒng)開銷往往是不可接受的。而更換速度更快、RAM更大、Flash更多的CPU意味著成本的增加,且會(huì)降低產(chǎn)品的競(jìng)爭(zhēng)力。當(dāng)系統(tǒng)中的任務(wù)不須進(jìn)行非常復(fù)雜的優(yōu)先級(jí)調(diào)度,而且其任務(wù)也相對(duì)簡(jiǎn)單時(shí),引入實(shí)時(shí)操作系統(tǒng)似有殺雞用牛刀之嫌。
1 Protothread的特點(diǎn)
Protothread是專為資源有限的系統(tǒng)設(shè)計(jì)的一種耗費(fèi)資源特別少并且不使用堆棧的線程模型,其特點(diǎn)是:
◆ 以純C語言實(shí)現(xiàn),無硬件依賴性;
◆ 極少的資源需求,每個(gè)Protothread僅需要2個(gè)額外的字節(jié);
◆ 可以用于有操作系統(tǒng)或無操作系統(tǒng)的場(chǎng)合;
◆ 支持阻塞操作且沒有棧的切換。
使用Protothread實(shí)現(xiàn)多任務(wù)的最主要的好處在于它的輕量級(jí)。每個(gè)Protothread不需要擁有自已的堆棧,所有的Protothread共享同一個(gè)堆棧空間,這一點(diǎn)對(duì)于RAM資源有限的系統(tǒng)尤為有利。相對(duì)于操作系統(tǒng)下的多任務(wù)而言,每個(gè)任務(wù)都有自已的堆??臻g,這將消耗大量的RAM資源,而每個(gè)Protothread僅使用一個(gè)整型值保存當(dāng)前狀態(tài)。
2 Protothread的阻塞運(yùn)行機(jī)制
以下是一個(gè)典型的Protothread程序示例:
程序2Protothread程序示例
PT_THREAD(radio_wake_thread(struct pt *pt)) {
PT_BEGIN(pt);
while(1) {
radio_on();
timer_set(&timer, T_AWAKE);
PT_WAIT_UNTIL(pt, timer_expired(&timer));
timer_set(&timer, T_SLEEP);
if(!communication_complete()) {
PT_WAIT_UNTIL(pt, communication_complete()‖timer_expired(&timer));
}
if(!timer_expired(&timer)) {
radio_off();
PT_WAIT_UNTIL(pt, timer_expired(&timer));
}
}
PT_END(pt);
}
這是一個(gè)非常簡(jiǎn)單的無線通信的狀態(tài)切換程序①,展開Protothread的宏定義,便可以得到程序3所示的展開代碼:
程序3Protothread宏展開代碼
void radio_wake_thread(struct pt *pt) {
switch(pt﹥lc) {
case 0:
while(1) {
radio_on();
timer_set(&timer, T_AWAKE);
pt﹥lc = 8;
case 8:
if(!timer_expired(&timer)) {
return;
}
timer_set(&timer, T_SLEEP);
if(!communication_complete()) {
pt﹥lc = 13;
case 13:
if(?。╟ommunication_complete() ||timer_expired(&timer))) {
return;
}
}
if(!timer_expired(&timer)) {
radio_off();
pt﹥lc = 18;
case 18:
if(!timer_expired(&timer)) {
return;
}
}
}
}
}
當(dāng)Protothread程序運(yùn)行到PT_WAIT_UNTIL時(shí),判斷其運(yùn)行條件是否滿足,若不滿足,則阻塞。通過比對(duì)程序2和程序3的程序代碼可以得知,Protothread的阻塞其實(shí)質(zhì)就是函數(shù)返回,只不過在返回前保存了當(dāng)前的阻塞位置,待下一次Protothread被調(diào)用時(shí),直接跳到阻塞位置執(zhí)行,再次判斷運(yùn)行條件是否滿足,并執(zhí)行后續(xù)程序或繼續(xù)阻塞。
3 利用Protothread構(gòu)造實(shí)時(shí)多任務(wù)系統(tǒng)
與操作系統(tǒng)下的多任務(wù)不同,操作系統(tǒng)下的每個(gè)任務(wù)可在任意時(shí)刻被打斷并阻塞,Protothread僅能在程序員指定位置阻塞。用Protothread實(shí)現(xiàn)實(shí)時(shí)多任務(wù),正是利用了Protothread在指定位置阻塞的特點(diǎn),讓出執(zhí)行權(quán)限給更高優(yōu)先級(jí)的任務(wù)先運(yùn)行
下載該資料的人也在下載
下載該資料的人還在閱讀
更多 >
- 一種實(shí)時(shí)嵌入式多任務(wù)微內(nèi)核的分析與改進(jìn)
- C51下的RTX-51實(shí)時(shí)多任務(wù)操作系統(tǒng)的種類和詳細(xì)資料概述 50次下載
- 基于實(shí)時(shí)操作系統(tǒng)的單片機(jī)多任務(wù)應(yīng)用程序設(shè)計(jì) 49次下載
- 實(shí)時(shí)多任務(wù)嵌入式軟件的架構(gòu)方式的設(shè)計(jì)應(yīng)用 1次下載
- 基于DSP的實(shí)時(shí)多任務(wù)調(diào)度內(nèi)核設(shè)計(jì) 7次下載
- 基于LabVIEW平臺(tái)的多任務(wù)實(shí)時(shí)測(cè)控系統(tǒng)的實(shí)現(xiàn)_劉為玉 9次下載
- DSP實(shí)時(shí)多任務(wù)操作系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn) 0次下載
- 基于TMS320LF2407的多任務(wù)實(shí)時(shí)處理系統(tǒng)設(shè)計(jì) 5次下載
- 基于TMS320LF2407控制器的實(shí)時(shí)多任務(wù)系統(tǒng)研究 15次下載
- 基于VxWorks的實(shí)時(shí)多任務(wù)軟件設(shè)計(jì)
- 一種基于比特表的實(shí)時(shí)多任務(wù)新調(diào)度算法
- 實(shí)時(shí)多任務(wù)系統(tǒng)中的一些基本概念
- 基于VxWorks的實(shí)時(shí)多任務(wù)軟件設(shè)計(jì)
- VxWorks操作系統(tǒng)及實(shí)時(shí)多任務(wù)程序設(shè)計(jì)
- 基于任務(wù)鏈的實(shí)時(shí)多任務(wù)軟件可靠性建模
- 愛普科技PSRAM加速wisun無線模塊多任務(wù)處理 267次閱讀
- 航電實(shí)時(shí)測(cè)試系統(tǒng)解決方案 1.2k次閱讀
- 淺析FreeRTOS實(shí)時(shí)操作系統(tǒng)的任務(wù)通信 3.4k次閱讀
- 基于M16C62單片機(jī)實(shí)現(xiàn)實(shí)時(shí)多任務(wù)系統(tǒng)的設(shè)計(jì)方案 1.3k次閱讀
- 基于時(shí)間觸發(fā)多任務(wù)調(diào)度器的嵌入式系統(tǒng)設(shè)計(jì)與應(yīng)用 2.7k次閱讀
- 基于多任務(wù)信息流的CAN總線驅(qū)動(dòng)設(shè)計(jì) 1.5k次閱讀
- 單片機(jī)多任務(wù)處理方案 1w次閱讀
- 嵌入式操作系統(tǒng)它有什么特點(diǎn) 2.9k次閱讀
- 遷移學(xué)習(xí)、多任務(wù)學(xué)習(xí)領(lǐng)域的進(jìn)展 4.5k次閱讀
- 關(guān)于基于VxWorks的星務(wù)管理系統(tǒng)軟件多任務(wù)實(shí)時(shí)性調(diào)度設(shè)計(jì) 5.8k次閱讀
- ABB機(jī)器人怎樣多任務(wù)?ABB機(jī)器人多任務(wù)使用方法步驟詳解 3.3w次閱讀
- Contiki調(diào)用protothread程序設(shè)計(jì) 4k次閱讀
- NLP多任務(wù)學(xué)習(xí)案例分享:一種層次增長(zhǎng)的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu) 5.7k次閱讀
- 基于ARM9和μC/OSII高速實(shí)時(shí)多任務(wù)數(shù)據(jù)采集的智能化設(shè)計(jì) 1.1k次閱讀
- 基于高檔數(shù)控系統(tǒng)的實(shí)時(shí)多任務(wù)實(shí)現(xiàn) 3.3k次閱讀
下載排行
本周
- 1冷柜-電氣控制系統(tǒng)講解
- 13.68 MB | 4次下載 | 10 積分
- 2安川A1000變頻器中文版說明書
- 20.16 MB | 3次下載 | 3 積分
- 3直流電路的組成和基本定律
- 1.67 MB | 2次下載 | 免費(fèi)
- 4丹佛斯2800系列變頻器說明書
- 8.00 MB | 1次下載 | 5 積分
- 5PC8011同步開關(guān)型降壓3.5A單節(jié)鋰電池充電管理電路技術(shù)手冊(cè)
- 0.74 MB | 1次下載 | 免費(fèi)
- 6ES7243E+ES8311音頻錄制與播放電路資料
- 0.06 MB | 1次下載 | 5 積分
- 7SDM02 激光測(cè)距模塊產(chǎn)品手冊(cè)
- 0.43 MB | 1次下載 | 免費(fèi)
- 8SDFM 激光測(cè)距模塊模組手冊(cè)
- 0.54 MB | 1次下載 | 免費(fèi)
本月
- 1CH341編程器軟件NeoProgrammer_2.2.0.10
- 20.47 MB | 170次下載 | 1 積分
- 22025智能家居傳感器市場(chǎng)分析及創(chuàng)新應(yīng)用
- 3.11 MB | 43次下載 | 免費(fèi)
- 3RV1126B系列開發(fā)板產(chǎn)品資料
- 4.19 MB | 18次下載 | 免費(fèi)
- 4CH341編程軟件下載
- 2.50 MB | 16次下載 | 5 積分
- 5全志系列-米爾基于T153核心板開發(fā)板 四核異構(gòu)、3路千兆網(wǎng),賦能多元化工業(yè)場(chǎng)景
- 3.05 MB | 12次下載 | 免費(fèi)
- 6【開源】60余套STM32單片機(jī)、嵌入式Linux、物聯(lián)網(wǎng)、人工智能項(xiàng)目案例及入門學(xué)習(xí)資源包
- 10.55 MB | 8次下載 | 免費(fèi)
- 7冷柜-電氣控制系統(tǒng)講解
- 13.68 MB | 4次下載 | 10 積分
- 8特斯拉MODEL S車載充電機(jī)主電路回路原理圖
- 0.81 MB | 4次下載 | 3 積分
總榜
- 1matlab軟件下載入口
- 未知 | 935137次下載 | 10 積分
- 2開源硬件-PMP21529.1-4 開關(guān)降壓/升壓雙向直流/直流轉(zhuǎn)換器 PCB layout 設(shè)計(jì)
- 1.48MB | 420064次下載 | 10 積分
- 3Altium DXP2002下載入口
- 未知 | 233094次下載 | 10 積分
- 4電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191448次下載 | 10 積分
- 5十天學(xué)會(huì)AVR單片機(jī)與C語言視頻教程 下載
- 158M | 183356次下載 | 10 積分
- 6labview8.5下載
- 未知 | 81604次下載 | 10 積分
- 7Keil工具M(jìn)DK-Arm免費(fèi)下載
- 0.02 MB | 73824次下載 | 10 積分
- 8LabVIEW 8.6下載
- 未知 | 65991次下載 | 10 積分
電子發(fā)燒友App





創(chuàng)作
發(fā)文章
發(fā)帖
提問
發(fā)資料
發(fā)視頻
上傳資料賺積分
評(píng)論