回答朋友的問題 系統排程細節

2021-05-24 09:48:02 字數 2209 閱讀 6613

_thread_dispatch_disable_level 這個變數不為0時表示執行緒的排程被禁止。為1表示被禁止了一次,為n表示排程被巢狀禁止了(n-1)次。

_context_switch_necessary變數不為0表示需要進行上下文切換。

一般作業系統排程執行緒時,必須在以下的幾種情況下發生:

1.正在執行的執行緒被阻塞(這種情況比較多,請參考 rtesm c user.pdf中的 task 一章);

2.執行緒被中斷,中斷執行完畢後有乙個更高優先順序別的任務就緒;

3.使用時間片輪轉排程,當前任務的時間片用完了,有其他的同優先順序別的任務就緒。

對於1和3這種情況,直接呼叫上下文切換的**就可以實現執行緒切換。這個是由 _context_switch() 函式實現。不同的處理器上是不一樣的。需要自己去撰寫,一般都是組合語言實現。

對於2,這種情況就相對比較複雜了。rtems 為了快速響應中斷,並從中斷中快速返回。

或者發生中斷巢狀了,必須正確的知道巢狀深度,並在合適的位置進行上下文切換。

以arm為例,/cpukit/score/cpu/arm/cpu_asm.s,中存放著進入異常的**。

但是並未對這些情況做處理,只是簡單的進入中斷異常而已。

中斷異常的處理**必須自己用組合語言撰寫。

arm的中斷異常在:/c/src/lib/libbsp/arm/shared/irq/irq_asm.s中。

會看到對_isr_nest_level、_thread_dispatch_disable_level、_context_switch_necessary這三個變數的操作。

**本身沒有什麼難度,主要理解rtems中斷的處理流程和arm的工作流程。您可以自己學習,我會在部落格中寫出這些**的分析。

您也可以找我討論,謝謝。

抱歉,我沒有將這個解釋透徹。你的理解一部分是正確的,另外一部分缺少了一些細節。

同優先順序的多個任務,時間片輪轉排程方式下,當某個任務的時間片用完後,作業系統會自動執行同優先順序的其它任務.當前任務

是不需要發出排程相關的資訊.當時間中斷到達後,呼叫rtems_clock_tick--> _thread_tickle_timeslice --> _thread_reset_timeslice 在這裡當前任務會被放到任務佇列的末尾,最高優先順序任務更改為佇列中的第乙個任務,上下文切換為true,有必要進行任務切換.

這部分 理解是正確的。但後面的部分就有偏差了。

首先,rtems來了乙個tick後,作業系統就會對進行一些操作,其中包括將每個時間片減1,直到它為0。這部分**您可以在 cpukit/rtems/src/clocktick.c中找到。在這裡我們必須明白,rtems_status_code rtems_clock_tick( void )這個函式是在中斷中執行的。不是使用者手工呼叫的。

中斷這塊**我不知道您仔細閱讀了沒有,這塊有比較多的細節內容。我將

rtems 4.9.4  arm 的 /c/src/lib/libbsp/arm/shared/irq/irq_asm.s 這部分畫成活**

(畫得不好,一些和處理器高度相關的操作我省去了,你湊合著看)。

假設時間片的最後乙個節拍到了,呼叫executeithandler後,即執行了rtems_status_code rtems_clock_tick( void )函式。您在根據這個圖看看,是不是要進行排程了?這部分**的流程比較多,但**本身沒有難度,閱讀時應抓大放小。

呵呵,要我怎麼說呢?你說的這種情況是不存在的。系統的確是通過_thread_dispatch這個函式實現的。但_thread_dispatch_disable_level的初始值在多執行緒開始後,進入第乙個執行的執行緒時清0,否則作業系統是無法排程的。

rtems 的作業系統比較特殊,和uc/os-ii不可同日而語。每個執行緒的入口不是你定義的函式,而是_thread_handler函式,

其中就有:

/**  at this point, the dispatch disable level better be 1.

*/_thread_enable_dispatch();

這時已經將_thread_enable_dispatch_level改為了0,以允許排程。

注意到你說的:在除錯的過程中也驗證了這點.

呵呵,是用printf/printk還是單步除錯?

如果使用printf/printk,

那麼你的列印位置有問題;如果單步執行的話……總之,rtems的**本身難度不大,主要是流程複雜,要在理解流程的前提下,看**。不然很痛苦。

回答朋友關於DBExpress的問題

朋友,你好 dbexpress是borland公司推出的基於單向資料集的資料庫引擎技術。因為是單向資料集,因此連線資料庫非常的快。在borland看來,dbexpress被期望用來取代bde和ado。到目前為止,dbexpress支援如下資料庫,至於更新的版本有待測試 inerbase7.5 mss...

回答朋友關於DBExpress的問題

朋友,你好 dbexpress是borland公司推出的基於單向資料集的資料庫引擎技術。因為是單向資料集,因此連線資料庫非常的快。在borland看來,dbexpress被期望用來取代bde和ado。到目前為止,dbexpress支援如下資料庫,至於更新的版本有待測試 inerbase7.5 mss...

回答朋友關於DBExpress的問題

朋友,你好 dbexpress是borland公司推出的基於單向資料集的資料庫引擎技術。因為是單向資料集,因此連線資料庫非常的快。在borland看來,dbexpress被期望用來取代bde和ado。到目前為止,dbexpress支援如下資料庫,至於更新的版本有待測試 inerbase7.5 mss...