時間片輪詢法

2022-07-26 19:00:19 字數 1708 閱讀 5217

時間片輪詢法是一種比較簡單易用的系統架構之一,它對於系統中的任務排程演算法是分時處理。核心思路是把 cpu 的時間分時給各個任務使用。我們常用的定時方法是定時器,把排程器放在定時中,可以簡單的實現時間片輪詢法。

需要注意的是,這種方法的前提是執行的每個任務都是短小精悍的,要不然乙個任務執行的時間過長,大於其它任務設定的時間片值,那其它任務就無法保證按它預設的時間片來執行。

尤其需要注意任務中延時的使用,可能會產生不可預料的結果。如果任務內部需要延時的時候,或者說單個任務過長,需要儲存任務執行到一半的狀態,建議使用狀態機切割長任務。

乙個時間片輪詢應用程式的架構是非常簡單的,包括乙個任務結構體,乙個中斷處理函式,乙個輪詢執行任務函式。

// 任務結構

typedef struct task_info_t;

定時器可以是任意的定時器,這裡採用系統滴答定時器 (systick) 來定時。systick 的配置就不細講,假設定時器的定時中斷為 10ms(可以自行設定,中斷過於頻繁效率就低,中斷太長,實時性差)。

timing_task_tick函式就相當於中斷服務函式,需要在定時器的中斷服務函式中呼叫此函式。

// 為每個任務計時,每次中斷加 10ms

void timing_task_tick(void)

}

下面我就就說說怎樣應用吧,假設我們有三個任務:時鐘顯示,按鍵掃瞄,和工作狀態顯示。

// 計算任務個數

#define array_size(x) (sizeof(x) / sizeof((x)[0]))

// 定義了 3 個任務

static task_info_t timing_task_array =

, // 顯示時鐘

, // 按鍵掃瞄

, // 工作狀態顯示

};

在定義變數時,我們已經初始化了值,這些值的初始化,非常重要,跟具體的執行時間優先順序等都有關係,這個需要自己掌握。

大概意思是,我們有三個任務,每 1s 執行一下時鐘顯示,因為我們的時鐘最小單位是 1s,所以在秒變化後才顯示一次就夠了。

由於按鍵在按下時會引數抖動,而我們知道一般按鍵的抖動大概是 20ms,那麼我們在順序執行的函式中一般是延伸 20ms,而這裡我們每 20ms 掃瞄一次,是非常不錯的出來,即達到了消抖的目的,也不會漏掉按鍵輸入。

為了能夠顯示按鍵後的其他提示和工作介面,我們這裡設計每 30ms 顯示一次,如果你覺得反應慢了,你可以讓這些值小一點。後面的名稱是對應的函式名,你必須在應用程式中編寫這函式名稱和這三個一樣的任務。

//description : 顯示任務

void task_disp_clock_running(void)

//description : 掃瞄任務

void task_scan_key_running(void)

//description : 工作狀態顯示

void task_disp_ws_running(void)

// 任務計畫表,輪詢執行任務

void timing_task_scheduler(void)}}

}

程式陷入死迴圈,依次判斷每個任務是否符合執行要求。如果是,則執行相應的任務函式;否則等待計時。

時間片輪詢

2002年初,筆者著手寫乙個 ic卡預付費電表的工作程式,該電表使用 philips 公司的8位51 擴充套件型微控制器 87lpc764 要求實現很多功能,包括熄顯示 負荷計算與控制 指示閃爍以及電表各種引數的查詢等,總之,要使用時間的單元很多。筆者當時使用 asm51 完成了這個程式的編寫,完成...

RT Thread 執行緒的時間片輪詢排程

優先順序和時間片是執行緒的兩個重要引數,分別描述執行緒競爭處理器資源的能力和持有處理器時間長短的能力。rt thread支援256個優先順序。數值越小,優先順序越高。0為最高優先順序,最低優先順序預留給空閒執行緒。使用者可以通過rt config.h中的rt thread priority max巨...

考研複習 時間片輪轉排程法

一直認為時間片輪轉排程法沒有什麼難度,直到做題的時候才發現這個排程方法有乙個需要注意的點。通常時間片輪轉的步驟是 將程序按照先來先服務的順序組成就緒佇列,後到達的程序從從隊尾插入,再進行時間片輪轉排程。但是實際情況可能是每個程序到達時間不同,會出現乙個執行了一部分的程序和新到達的程序同時存在的情況。...