嵌入式作業系統核心原理和開發(改進型優先順序排程)

2021-08-26 22:36:40 字數 2519 閱讀 9339

上面的一篇部落格說到了優先順序排程,但是那個優先順序排程演算法比較極端。打個比方說,現在王先生有三個小孩,分別是老大、老

二、老三。假設現在到了飯點,王先生需要給三個小孩餵飯。此時如果是時間片輪轉的話,那麼就是絕對公平,王先生每人一口不停地進行餵飯。如果是優先順序排程,那麼王先生首先自己有乙個優先順序考量,比如說三個小孩按照年齡順序優先順序是逐漸提高的,畢竟小孩需要更多的照顧嘛。這個時候如果需要進行餵飯的話,那麼王先生需要首先伺候好最小的那個小孩老三,才會有時間照顧老二,至於老大什麼時候才能得到照顧那就看造化了。

現在,我們打算重新換一種方法。假設三個小孩的優先順序分別是1、2、3,其中年齡越小優先順序越高,3代表高優先順序。接著,我們按照優先順序給三個小孩安排時間片,分別是1、2、3。同時,這個時間片不光代表了當前可用的剩餘時間,還代表了小孩此時的臨時優先順序。

(1)首先王先生給老三餵飯,時間片降低1,即臨時優先順序為2;

(2)接著王先生判斷當前優先順序最高的仍為老三,畢竟老二的優先順序也沒有超過老三,所以老三的時間片降1,臨時優先順序為1;

(3)王先生獲知當前優先順序最高的為老二,老二獲得時間片;

(4)此時王先生發現三個孩子的臨時優先順序都一樣,那麼就會按照固定優先順序的大小依次對老

三、老二、老大進行餵飯。

我們發現,這中間受益最大的就是老二。當然,我們可以做進一步推論,如果老王的孩子越多,那麼優先順序處於中間的孩子在時間片的分配上將更加均勻,響應也會更加及時,互動性也會變得很好。

根據以上的想法,我們重新改寫了優先順序排程演算法,修改為改進型優先順序排程演算法,

int find_next_thread()

}if(0 == value)

choice = -1;

return choice;

}

當然,加上原來的時間片輪轉排程、通用優先順序排程方法,此時就存在三種排程方法了。我們可以自己設定巨集,通過巨集的設定靈活選用排程演算法,

#define time_round_schedule     0

#define hard_priority_schedule 0

#define soft_priority_schedule 1

這些**都是可以在系統中共存的。選用什麼演算法,取決於實際情況是什麼樣的情形。

#include #include #include #include #include #include #include #define uint32 unsigned         int

#define stack_length 512

#define thread_max_number 10

#define time_round_schedule 0

#define hard_priority_schedule 0

#define soft_priority_schedule 1

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()

}#if hard_priority_schedule

int find_next_thread()

return index;

}#endif

#if soft_priority_schedule

int find_next_thread()

}if(0 == value)

choice = -1;

return choice;

}#endif

void reset_time_slice ()

void task_init(int index)

#if time_round_schedule

void signal_handler(int m)

#else

void signal_handler(int m)

galltask[index].time_slice --;

current_thread_id = index;

swap(&old, &galltask[current_thread_id].context);

}#endif

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 嵌入式作業...