關于RTX51 TINY的分析與探討
3 共享資源實現[1]
RTX51 TINY由于是一個多任務的操作系統(tǒng),那么就不免會有幾個任務使用同一個資源,這些資源可能是一個變量,也可能是輸入/輸出設備。這就要求一個任務在使用共享資源時必須獨占該資源,否則可能會造成數據被破壞。
在RTX51 TINY中實現共享資源獨占的方法比較多。比如,可以通過TIMESHARING這個變量來禁止時間片輪轉,使其值為0,就可以實現禁止任務切換,從而當前任務就可以獨占共享資源。還可以關閉中斷來實現,使EA=0,定時器T0的中斷被關閉,不能再為時間片輪轉提供基準,從而禁止了任務切換。但這兩種方法都帶有一定的局限性,前一種方法只能適用于實時性要求不高的場合,后一種方法由于T0中斷關閉時間不能太長,只能適用于一些簡單變量操作的場合。基于以上情況,下面通過另一種方法來實現共享資源的使用。
在RTX51 full中可以利用信號量很好地實現對共享資源的操作,也可以把這種思想應用到RTX51 TINY中;而在RTX51 TINY中不支持信號量,這就要求用戶自己定義信號量及其操作過程。以下是部分代碼:
struct signal {//定義信號量結構體
uchar count;//該信號量的當前計數值
uint list_tasks;//等待該信號量任務表
} signal_list[3];
/*初始化信號量 */
void init_signal(uchar task_id,uchar count) {
signal_list[task_id].count=count;
signal_list[task_id].list_tasks=0;
}
/*等待信號量 */
char wait_signal(uchar task_id) {
if(signal_list[task_id].count>0) {
signal_list[task_id].count;//獲取信號量
return(-1);
}
signal_list[task_id].list_tasks|=(1os_running_task_id());//標記為等待狀態(tài)
return(0);
}
void wait_sem(uchar task_id) {
if(wait_signal(task_id==0)
while(os_wait(K_TMO,255,0)!=RDY_EVENT);//等待,直到該任務就緒
}
/*釋放信號量 */
char release_signal(uchar task_id) {
uchar i:
uint temp=1;
if((signal_list[task_id].count>0)||( signal_list[task_id].list_tasks==0)) {
signal_list[task_id].count++; //釋放信號量
return(-1);
}
for(i=0;i16;i++) {
if((signal_list[task_id].list_tasks(temp))!=0){//查找任務表
signal_list[task_id].list_tasks= ~(1i);return(i); //返回等待信號量的任務號
}
temp=1:
}
}
void release_sem(uchar task_id) {
char task_temp;
task_temp=release_signal(task_id);
if(task_temp!=-1) {
os_set_ready(task_temp); //任務task_id進入就緒狀態(tài)
os_switch_task();
}
}
評論