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管理,使用者不需要修改 |