ucos ii 文件分析
1.?平臺(tái)介紹
本文檔為基于uCOSII操作系統(tǒng)做開(kāi)發(fā)的人員描述了一些uCOSII操作系統(tǒng)的基本特征。?
1.1?結(jié)構(gòu)圖
?
圖 1 ?整體結(jié)構(gòu)圖
2.?基本特征
2.1?uCOSII基本特征
uCOSII操作系統(tǒng)目前支持如下的基本特征:
1.?提供搶占式任務(wù)調(diào)度服務(wù)
2.?提供任務(wù)間同步與通信服務(wù)(如郵箱、消息隊(duì)列、信號(hào)量、內(nèi)存管理等)
3.?提供任務(wù)管理服務(wù)
4.?中斷管理支持嵌套(中斷嵌套層數(shù)最多255)
2.2?uCOSII存儲(chǔ)配置
當(dāng)前uCOSII的配置如下:
| 配置項(xiàng) | 配置值 |
| 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優(yōu)化選項(xiàng)為-O1的情況下,代碼大小為19K左右,數(shù)據(jù)大小為8K左右。
2.3?uCOSII的tick配置
?????????如無(wú)特殊要求,性能功能不受影響情況下,配置1 tick/ms,具體可根據(jù)實(shí)際應(yīng)用的性能功能要求和HCLK及Timer0的時(shí)鐘情況來(lái)調(diào)整bsp_os.c中全局變量unsigned int cyc = 0xXXXXX;?的值來(lái)改變Tick的頻率。
3.?任務(wù)的建立???????
1.?任務(wù)棧的建立
每個(gè)任務(wù)都需要自己的棧空間,因此在建立任務(wù)之前,先給任務(wù)開(kāi)辟一塊RAM作為該任務(wù)的棧空間。示例如下:
OS_STK ?task1_stk[TASK_STK_SIZE];
2.?任務(wù)實(shí)體的編寫(xiě)
編寫(xiě)任務(wù)函數(shù)及實(shí)體,一個(gè)任務(wù)通常是一個(gè)無(wú)限的循環(huán)。示例如下:
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.?將任務(wù)加入任務(wù)管理行列
使用OSTaskCreate接口函數(shù)來(lái)將任務(wù)加入任務(wù)管理行列,需要注意,此處要提供任務(wù)函數(shù)實(shí)體的入口地址,任務(wù)的棧空間的TOP地址及任務(wù)優(yōu)先級(jí)。
初始任務(wù)的創(chuàng)建OSTaskCreate必須在OSInit接口函數(shù)之后和OSStart接口函數(shù)之前,其他任務(wù)的創(chuàng)建可在任務(wù)實(shí)體中調(diào)用OSTaskCreate接口函數(shù)來(lái)建立新任務(wù)。示例如下:
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.?中斷與異常處理函數(shù)的建立
4.1?中斷與異常的處理過(guò)程
???????系統(tǒng)將所有的中斷入口統(tǒng)一為函數(shù)cpu_int_entry的入口地址,將所有的異常入口統(tǒng)一為函數(shù)cpu_exc_entry的入口地址。用戶無(wú)需修改os_cpu_a.s文件中cpu_int_entry和cpu_exc_entry的函數(shù)實(shí)體內(nèi)容。在cpu_int_entry和cpu_exc_entry中,系統(tǒng)做完相關(guān)處理后,會(huì)根據(jù)當(dāng)前中斷或異常優(yōu)先級(jí)來(lái)決定跳轉(zhuǎn)到中斷異常處理函數(shù)列表_kernel_exc_tbl的相應(yīng)入口去執(zhí)行中斷或異常處理函數(shù)。而中斷異常處理函數(shù)列表_kernel_exc_tbl中的具體的函數(shù)入口則需要用戶建立。
4.2?用戶的中斷與異常處理函數(shù)的建立
1.?中斷與異常處理函數(shù)實(shí)體的編寫(xiě)
如下所示:
static void OSTickISR( void )
{
/* clear timer interrupt */
write_aux_reg(ARC_REG_TIMER0_CTRL, TIMER_CTRL_IE | TIMER_CTRL_NH);
OSTimeTick();
}
2.?將函數(shù)入口地址加入中斷異常處理函數(shù)列表_kernel_exc_tbl中
初始化設(shè)備后,將中斷或異常處理函數(shù)的入口加入中斷異常處理函數(shù)列表_kernel_exc_tbl中,如下所示:
arc_install_exc(INHNO_TIMER, (EXC_HANDLER)OSTickISR);
其中INHNO_TIMER為Timer在芯片內(nèi)核中的中斷異常號(hào),OSTickISR則為Timer中斷對(duì)應(yīng)的中斷處理函數(shù)入口地址。
然后使能中斷即可。
5.?主要文件說(shuō)明??
uCOSII內(nèi)核又可區(qū)分為兩塊:
1. 內(nèi)核跟移植相關(guān)的部分,包括對(duì)中斷和異常的處理、任務(wù)切換及臨界段等
| 文件名 | 文件說(shuō)明 |
| os_cpu_a.s | uCOS內(nèi)核中需要用戶參與修改的部分,包括任務(wù)切換代碼、中斷處理代碼、異常處理代碼等(目前已移植完畢,用戶不需要修改) |
| os_cpu_c.c? | uCOS內(nèi)核中,提供給用戶編寫(xiě)用戶的鉤子程序的文件 |
| os_cpu.h | 與移植相關(guān)的函數(shù)聲明 |
| os_cfg_r.h | 與移植相關(guān)的操作系統(tǒng)資源配置 |
2.其他的uc/os-ii文件
uC/OS-II內(nèi)核與體系結(jié)構(gòu)無(wú)關(guān)的服務(wù)代碼,不需要做任何修改的部分
| 文件名 | 文件說(shuō)明 |
| os_dbg.c | uCOS內(nèi)核中,提供給用戶用于配置調(diào)試的文件 |
| os_core.c | uCOS內(nèi)核的功能函數(shù),用戶不需要修改 |
| os_flag.c | uCOS提供的時(shí)間標(biāo)志組管理,用戶不需要修改 |
| os_mbox.c | uCOS提供的消息郵箱管理,用戶不需要修改 |
| os_mem.c | uCOS提供的內(nèi)存管理,用戶不需要修改 |
| os_mutex.c | uCOS提供的互斥信號(hào)量管理,用戶不需要修改 |
| os_q.c | uCOS提供的隊(duì)列管理,用戶不需要修改 |
| os_sem.c | uCOS提供的信號(hào)量管理,用戶不需要修改 |
| os_Task.c | uCOS提供的任務(wù)管理,用戶不需要修改 |
| os_time.c | uCOS提供的時(shí)間管理,用戶不需要修改 |
| os_tmr.c | uCOS提供的軟Timer管理,用戶不需要修改 |
總結(jié)
以上是生活随笔為你收集整理的ucos ii 文件分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: qt开发环境 - 简易二进制文件打开,串
- 下一篇: python用pip安装numpy(如何