天天看點

ucos ii 檔案分析1. 平台介紹2. 基本特征3. 任務的建立       4. 中斷與異常處理函數的建立5. 主要檔案說明  

1. 平台介紹

本文檔為基于uCOSII作業系統做開發的人員描述了一些uCOSII作業系統的基本特征。 

1.1 結構圖

圖 1  整體結構圖

2. 基本特征

2.1 uCOSII基本特征

uCOSII作業系統目前支援如下的基本特征:

1. 提供搶占式任務排程服務

2. 提供任務間同步與通信服務(如郵箱、消息隊列、信号量、記憶體管理等)

3. 提供任務管理服務

4. 中斷管理支援嵌套(中斷嵌套層數最多255)

2.2 uCOSII存儲配置

目前uCOSII的配置如下:

配置項 配置值
OS_MAX_EVENTS 10
OS_MAX_FLAGS 5
OS_MAX_MEM_PART 5
OS_MAX_QS 4
OS_MAX_TASKS 20
OS_TASK_TMR_STK_SIZE 128
OS_TASK_STAT_STK_SIZE 128
OS_TASK_IDLE_STK_SIZE 128

在上述配置情況下,在metaWare IDE優化選項為-O1的情況下,代碼大小為19K左右,資料大小為8K左右。

2.3 uCOSII的tick配置

         如無特殊要求,性能功能不受影響情況下,配置1 tick/ms,具體可根據實際應用的性能功能要求和HCLK及Timer0的時鐘情況來調整bsp_os.c中全局變量unsigned int cyc = 0xXXXXX; 的值來改變Tick的頻率。

3. 任務的建立       

1. 任務棧的建立

每個任務都需要自己的棧空間,是以在建立任務之前,先給任務開辟一塊RAM作為該任務的棧空間。示例如下:

OS_STK  task1_stk[TASK_STK_SIZE];

2. 任務實體的編寫

編寫任務函數及實體,一個任務通常是一個無限的循環。示例如下:

static void task1(void * par)

{

#if OS_CRITICAL_METHOD == 3u        

      OS_CPU_SR  cpu_sr = 0u;

#endif

unsigned int cnt = (unsigned int) par;

while(1) {

OSTimeDlyHMSM(0, 0, 0, 3000);

OSTaskResume(TASK2_PRI);

}

}

3. 将任務加入任務管理行列

使用OSTaskCreate接口函數來将任務加入任務管理行列,需要注意,此處要提供任務函數實體的入口位址,任務的棧空間的TOP位址及任務優先級。

初始任務的建立OSTaskCreate必須在OSInit接口函數之後和OSStart接口函數之前,其他任務的建立可在任務實體中調用OSTaskCreate接口函數來建立新任務。示例如下:

OSInit();

os_err = OSTaskCreate(task1, (void *)1, p_task1_stk, TASK1_PRI);

os_err = OSTaskCreate(task2, (void *)2, p_task2_stk, TASK2_PRI);

OSTaskSuspend(TASK2_PRI);

OSStart();

或者如下所示:

static void task1(void * par)

{

#if OS_CRITICAL_METHOD == 3u        

      OS_CPU_SR  cpu_sr = 0u;

#endif

unsigned int cnt = (unsigned int) par;

os_err = OSTaskCreate(task3, (void *)1, p_task3_stk, TASK3_PRI);

os_err = OSTaskCreate(task2, (void *)2, p_task2_stk, TASK2_PRI);

while(1) {

OSTimeDlyHMSM(0, 0, 0, 3000);

OSTaskResume(TASK2_PRI);

}

}

4. 中斷與異常處理函數的建立

4.1 中斷與異常的處理過程

       系統将所有的中斷入口統一為函數cpu_int_entry的入口位址,将所有的異常入口統一為函數cpu_exc_entry的入口位址。使用者無需修改os_cpu_a.s檔案中cpu_int_entry和cpu_exc_entry的函數實體内容。在cpu_int_entry和cpu_exc_entry中,系統做完相關處理後,會根據目前中斷或異常優先級來決定跳轉到中斷異常處理函數清單_kernel_exc_tbl的相應入口去執行中斷或異常處理函數。而中斷異常處理函數清單_kernel_exc_tbl中的具體的函數入口則需要使用者建立。

4.2 使用者的中斷與異常處理函數的建立

1. 中斷與異常處理函數實體的編寫

如下所示:

static void OSTickISR( void )

{

write_aux_reg(ARC_REG_TIMER0_CTRL, TIMER_CTRL_IE | TIMER_CTRL_NH);

OSTimeTick();

}

2. 将函數入口位址加入中斷異常處理函數清單_kernel_exc_tbl中

初始化裝置後,将中斷或異常處理函數的入口加入中斷異常處理函數清單_kernel_exc_tbl中,如下所示:

arc_install_exc(INHNO_TIMER, (EXC_HANDLER)OSTickISR);

其中INHNO_TIMER為Timer在晶片核心中的中斷異常号,OSTickISR則為Timer中斷對應的中斷處理函數入口位址。

然後使能中斷即可。

5. 主要檔案說明  

uCOSII核心又可區分為兩塊:

1. 核心跟移植相關的部分,包括對中斷和異常的處理、任務切換及臨界段等

檔案名 檔案說明
os_cpu_a.s uCOS核心中需要使用者參與修改的部分,包括任務切換代碼、中斷處理代碼、異常處理代碼等(目前已移植完畢,使用者不需要修改)
os_cpu_c.c  uCOS核心中,提供給使用者編寫使用者的鈎子程式的檔案
os_cpu.h 與移植相關的函數聲明
os_cfg_r.h 與移植相關的作業系統資源配置

2.其他的uc/os-ii檔案

uC/OS-II核心與體系結構無關的服務代碼,不需要做任何修改的部分

檔案名 檔案說明
os_dbg.c uCOS核心中,提供給使用者用于配置調試的檔案
os_core.c uCOS核心的功能函數,使用者不需要修改
os_flag.c uCOS提供的時間标志組管理,使用者不需要修改
os_mbox.c uCOS提供的消息郵箱管理,使用者不需要修改
os_mem.c uCOS提供的記憶體管理,使用者不需要修改
os_mutex.c uCOS提供的互斥信号量管理,使用者不需要修改
os_q.c uCOS提供的隊列管理,使用者不需要修改
os_sem.c uCOS提供的信号量管理,使用者不需要修改
os_Task.c uCOS提供的任務管理,使用者不需要修改
os_time.c uCOS提供的時間管理,使用者不需要修改
os_tmr.c uCOS提供的軟Timer管理,使用者不需要修改