uc os ii核心原始碼理解 一

2021-07-27 00:10:10 字數 1935 閱讀 6087

使用作業系統,就要使用作業系統相關的資源(訊息郵箱、訊號量、互斥訊號量、訊息佇列、事件等),需要大致了解系統核心原理。

uc/os-ii作業系統配置

uc/os-ii系統配置就是修改os_cfg.h檔案,就是使能或失能某些功能,即系統裁剪(使能開關量)。

系統的裁剪是通過預處理(配置了就編譯,沒配置就不編譯)實現的,預處理直接影響程式編譯的大小。

2. 主函式描述

main函式在裸機和作業系統中都是存在的,main函式是程式的入口函式,uc/os-ii作業系統中重要的三個函式:

(1) void  osinit (void)系統初始化函式

函式體位於os_core.c檔案中。作業系統初始化就是對uc/os-ii系統的初始化,其中包括核心與系統資源的初始化,

void  osinit (void)

前五個函式是系統核心必須初始化部分,有選通開關的時根據系統配置決定是否需要初始化的部分。

系統配置在此處體現出來。如:沒有使能「事件標誌」即沒有使能該選項,那麼程式也不會初始化事件標誌組。

必須類:

與系統、任務緊密相關的初始化。這些初始化就是對變數、結構體等賦初始值。(如:系統執行標誌位初始化暫停執行、最高優先順序指空等)它們的初始化位於系統核心os_core.c裡面。

非必須類:

**前面有乙個預處理標誌位(選通開關),這些標誌位位於os_cfg.h中,當不需要使用這些功能時,它們不會被初始化。

事件標誌組、記憶體管理、訊息佇列等這些屬於非必須類,它們的初始化位於自身的.c檔案中(不位於os_core.c)。

[os_flaginit位於os_flag.c檔案裡面]

(2) ostaskcreate建立任務函式

該函式體位於os_task.c檔案中。建立任務主要是配置及初始化任務入口、任務相關的堆疊、優先順序、以及檢測引數的正確性等。

#if os_task_create_en > 0u

//系統配置使能

int8u  ostaskcreate (void   (*task)(void *p_arg),

void    *p_arg,

os_stk  *ptos,

int8u    prio)

#endif

#if os_arg_chk_en > 0u

if (prio > os_lowest_prio)

#endif

os_enter_critical();

if (osintnesting > 0u)

/*確保任務優先順序未被使用,即就緒態為0*/

if (ostcbpriotbl[prio] == (os_tcb *)0)

} else

return (err); }

os_exit_critical();

return (os_err_prio_exist); }

#endif

注意:在os_cfg.h檔案的任務管理中需要使能「建立任務」

即需要配置:

#define os_task_create_en         1u   /*     include code for ostaskcreate() 建立任務                         */

在主函式中建立任務start_task(開始任務),後面的一些關於應用所需的初始化都是在start_task下面建立的,子任務也是基於該函式建立的。

osstart()開啟任務

該函式體位於os_core.c檔案中。在作業系統初始化、任務建立完成後,呼叫osstart就可以開啟並執行任務了。

該函式屬於核心級,由系統呼叫,主要包含:

1.查詢最高優先順序任務,使其進入就緒;

2.將當前優先順序指向就緒任務的最高優先順序;

3.執行目標**,開始任務(osrunning = os_true)。

void  osstart (void)

}

uC OS II原始碼分析 總體思路一

首先從main函式開始,下面是uc os ii main函式的大致流程 main osinit taskcreate osstart 首先是呼叫osinit進行初始化,然後使用taskcreate建立幾個程序 task,最後呼叫osstart,作業系統就開始執行了。osinit 最先看看osinit...

uC OS II原始碼分析 總體思路一

首先從main函式開始,下面是uc os ii main函式的大致流程 main 首先是呼叫osinit進行初始化,然後使用taskcreate建立幾個程序 task,最後呼叫osstart,作業系統就開始執行了。osinit 最先看看osinit完成哪些初始化 void osinit void o...

uC OS II原始碼分析(四)

核心結構 1,臨界區,os enter critical 和os exit critical 為了處理臨界區 必須關中斷,等處理完畢後,再開中斷。關中斷可以避免其他任務或中斷進入臨界區 uc os ii 定義了這兩個巨集來實現,但注意一條 呼叫 uc os ii 功能函式時,中斷應該總是開著的。1 ...