1. 程式人生 > >RT-Thread 讀後感6 ——實現排程器(排程器初始化,啟動排程器)

RT-Thread 讀後感6 ——實現排程器(排程器初始化,啟動排程器)

1. 排程器初始化

排程器是作業系統的核心,主要功能是實現執行緒的切換,即從就緒列表中找到優先順序最高的執行緒,然後執行該執行緒。關於排程器的程式碼,RT-Thread在scheduler.c檔案中實現。

排程器初始化:排程器在使用前必須初始化,具體程式碼如下:

/* 初始化系統排程器 */
void rt_system_scheduler_init(void)
{
    register  rt_base_t  offset;
	 /* 執行緒就緒列表初始化 */
	 for(offset =0; offset<RT_THREAD_PRIORITY_MAX;offset++)
	{
	   rt_list_init(&rt_thread_priority_table[offset]);
	}
	/* 初始化當前執行緒控制塊指標 */
	rt_current_thread = RT_NULL;
}

程式碼中  register  rt_base_t  offset;  定義了一個區域性變數,用 register修飾,防止編譯器優化。初始化完後整個就緒列表為空。

rt_current_thread = RT_NULL; 初始化當前執行緒控制塊為空,rt_current_thread 是在scheduler.c檔案中定義的一個struct rt_thread 型別的全域性指標,用於指向當前正在執行的執行緒控制塊。

排程器的初始化放在硬體初始化之前,具體程式碼如下:

     /*硬體初始化*/
	
	 /* 硬體初始化*/

	 /*排程器初始化*/
	 rt_system_scheduler_init();

2. 啟動排程器

排程器的啟動由函式rt_system_scheduler_start()來實現,具體程式碼如下:

/* 啟動系統排程器 */
void rt_system_scheduler_start(void)
{
   register struct rt_thread *to_thread;
	
	 /* 手動指定第一個執行的執行緒 */
	 to_thread = rt_list_entry(rt_thread_priority_table[0].next,
	                           struct rt_thread,
														 tlist);
	 rt_current_thread = to_thread;
		
   /* 
			切換到第一個執行緒,改函式在context_rvds.S中實現,
      在rthw.h宣告,用於實現第一次執行緒切換。
      當一個彙編函式在C檔案中呼叫的時候,如果有形參,
      則執行的時候會將形參傳入CPU暫存器r0 
	 */												 
   rt_hw_context_switch_to((rt_uint32_t)&to_thread->sp);  														 
}

排程器在啟動的時候會從就緒列表中取出優先順序最高的執行緒的執行緒控制塊,然後切換到該執行緒。目前的執行緒還不支援優先順序,可以手動指定第一個執行的執行緒為就緒列表下標為0這條連結串列裡面掛著的執行緒。