相比較其他排程演算法而言,時間片的輪轉更多的注重公平性。但是,任務與任務之間也是有先後之分的,有的任務我們希望多安排一些時間片,而有的任務我們則希望少安排一些時間片。比較說,如果我們在上網的話,我們就希望上網的操作響應的更快一些;如果我們在進行gui操作,我們當然就希望圖形響應更快一些。這些都是可以理解的,下面我們就緒要對資料結構進行一些修改。
typedef struct _task_info
task_info;
這裡的priority就是當前執行緒的優先順序,所以最簡單的方法就是根據priority直接分配對應的time_slice。也就是這個函式,
void reset_time_slice ()
所以,以後每次排程的時候,我們就首先尋找當前最高優先順序的任務,看看當前任務安排的時間片是否用完了,沒有用完就繼續執行。如果當前優先順序的任務已經沒有時間片了,那麼此時就可以安排低優先順序的任務進行排程了。
void signal_handler(int m)
galltask[index].time_slice --;
current_thread_id = index;
swap(&old, &galltask[current_thread_id].context);
}
下面,我們就根據任務優先順序挑選下乙個需要執行的thread了,
int find_next_thread()
return index;
}
整個**的流程也不複雜,大家可以執行、單步除錯一把,試試看。
#include #include #include #include #include #include #include #define uint32 unsigned int
#define stack_length 512
#define thread_max_number 10
typedef struct _task_info
task_info;
static struct itimerval oldtv;
uint32 old = 0;
uint32 count = 0;
uint32 task_stack[thread_max_number][stack_length] = ;
task_info galltask[thread_max_number] = ;
uint32 current_thread_id = 0;
void set_timer()
void swap(uint32* prev, uint32* next)
void hello()
}int find_next_thread()
return index;
}void reset_time_slice ()
void task_init(int index)
void signal_handler(int m)
galltask[index].time_slice --;
current_thread_id = index;
swap(&old, &galltask[current_thread_id].context);
}void set_all_task()
}int main()
exit(0);
return 1;
}
嵌入式作業系統核心原理和開發(中斷)
在我個人看來,中斷是cpu最重要的特色。從某種意義上來說,沒有中斷就沒有嵌入式作業系統。一旦你明白了中斷的真正含義,你對作業系統的了解就算真正入門了。什麼是中斷呢?我們可以看看微控制器下面是怎麼做的。include sbit led p1 6 unsigned int led enable 0 vo...
嵌入式作業系統核心原理和開發(開篇)
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!作業系統是很多人每天必須打交道的東西,因為在你開啟電腦的一剎那,隨著bios自檢結束,你的windows系統已經開始執行了。如果問大家作業系統是什麼?可能有的人會說作業系統就是windows,就是那些可以放大 縮小 移動的視窗。對曾經是計算機專業的...
linux 嵌入式作業系統核心原理和開發總結
01 嵌入式作業系統核心原理和開發 優先順序的修改 02 嵌入式作業系統核心原理和開發 改進的鍊錶記憶體分配演算法 03 嵌入式作業系統核心原理和開發 等值block記憶體池設計 04 嵌入式作業系統核心原理和開發 執行緒狀態 05 嵌入式作業系統核心原理和開發 實時系統中的定時器 06 嵌入式作業...