資源描述:
《ucos_ii移植過程詳解(移植原理)》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫(kù)。
1、uCOS-II移值過程實(shí)例講解我將uCOS-II移植到了EPONS的C33209的平臺(tái)上,接下來我就基于我移植好的代碼講解如何將uCOS-II從一種MCU移植到另一種MCU。首先介紹uCOS-II的文件,如下表:ucos_ii.hos_cfg.hos_cpu.hos_core.cos_dbg_r.cos_flag.cos_mbox.cos_mem.cos_mutex.cos_q.cos_sem.cos_task.cos_time.cucos_ii.cos_cpu_c.cos_cpu_a.asm其中我們和硬件平臺(tái)相關(guān)的文件的文件名被加粗了,也就是說若要將uCOS-II移
2、植到新的平臺(tái)上只要關(guān)心以上四個(gè)文件就行了。當(dāng)然你也可以根據(jù)需要再添加你自己的和平臺(tái)相關(guān)的文件,事實(shí)上我也是這么做的。在我移植的例子中就添加了四個(gè)和平臺(tái)相關(guān)的文件,文件如下表:crt0.cdrv_rtc.cvector.cext.scrt0.c是用來初始化系統(tǒng)的比如說MCU的一些特殊寄存器、設(shè)置外圍的總線接口,等。drv_rtc.c是用來初始化系統(tǒng)中的一個(gè)RTC的,這個(gè)RTC可以為內(nèi)核提供必要的基于時(shí)間片調(diào)度的時(shí)基。同時(shí)提供了對(duì)RTC開始和停止的操作函數(shù)。在我的例子中RTC會(huì)每秒產(chǎn)生32次中斷。vector.c顧名思義,它是系統(tǒng)上電后為系統(tǒng)提供矢量入口表的文件,當(dāng)然也包
3、括中斷向量表。ext.s是為uc/OS-II提供OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()函數(shù)的具體實(shí)現(xiàn)以及在用戶程序的中斷函數(shù)出入時(shí)要調(diào)用的狀態(tài)保護(hù)和狀態(tài)恢復(fù)函數(shù)OS_SAVEALL()和OS_RESTOREALL()。前面兩個(gè)函數(shù)的功能是:OS_ENTER_CRITICAL()屏蔽中斷;OS_EXIT_CRITICAL()恢復(fù)原來的中斷使能狀態(tài)。1.os_cpu_a.asm的說明要想順利的移植首先要了解uCOS-II的一些基本概念。uCOS-II實(shí)質(zhì)上是一個(gè)嵌入式操作系統(tǒng)內(nèi)核,她只負(fù)責(zé)管理各個(gè)任務(wù),為每個(gè)任務(wù)分配CPU時(shí)間,并且負(fù)
4、責(zé)任務(wù)之間的通訊。內(nèi)核提供的基本服務(wù)是任務(wù)切換。這是個(gè)很重要的概念,可以說你只要掌握了任務(wù)切換的本質(zhì),可以說你就掌握了移植uCOS-II的技術(shù)。至于任務(wù)之間的通訊他們是建立在任務(wù)切換之上的或者說和系統(tǒng)平臺(tái)關(guān)系不大(當(dāng)然這也和操作系統(tǒng)通訊機(jī)制的實(shí)現(xiàn)相關(guān),至少uCOS-II是這樣的)。接下來我們就有針對(duì)性的介紹什么是uCOS-II里的任務(wù)。一個(gè)任務(wù)通常是一個(gè)無限循環(huán),如下程序所示。voidTask1(void*data){INT8Uerr;char*rxmsg;data=data;/*Preventcompilerwarning*/while(1)//這是一個(gè)無限循環(huán){r
5、xmsg=(char*)OSMboxPend(MAIL1,0,&err);/*WaitformessagefromTask#2*/OSTimeDlyHMSM(0,0,1,0);/*Wait1second*/OSMboxPend(MAIL3,0,&err);/*WaitformessagefromTask#3*/OSMboxPost(MAIL2,(void*)1);/*Acknowledgereceptionofmsg*/}}可以通過內(nèi)核的專用函數(shù)來建立、刪除、掛起、激活任務(wù),在這里我們的重點(diǎn)在如何移植,所以具體的使用方式和原理可以看JEANJ.LABROSSE著、邵貝
6、貝譯的《uCOS-II—源碼共開的實(shí)時(shí)嵌入式系統(tǒng)》一書。(1).OSCtxSw()函數(shù)在上面的例子里你也看到了任務(wù)和其他的C函數(shù)一樣,有函數(shù)的返回類型,有形式參數(shù)變量,只是任務(wù)是絕不會(huì)返回。事實(shí)上任務(wù)也就是一個(gè)函數(shù),內(nèi)核在調(diào)度時(shí)是以這個(gè)函數(shù)為基礎(chǔ)的,為了和其他函數(shù)區(qū)分,我們給了她另外一個(gè)名字——任務(wù)。也正因她是一個(gè)特殊的函數(shù),而且和內(nèi)核調(diào)度直接相關(guān),所以不能隨便返回和被用戶調(diào)用,而要用內(nèi)核的專用函數(shù)來“建立”和“刪除”。所謂的“建立任務(wù)”其實(shí)是在內(nèi)核處對(duì)該函數(shù)進(jìn)行注冊(cè)和相關(guān)數(shù)據(jù)結(jié)構(gòu)的填充,比如該函數(shù)的入口地址、為函數(shù)分配專門的堆??臻g(為什么要為函數(shù)分配專門的地址空間
7、呢?我們馬上就會(huì)談到)?!叭蝿?wù)調(diào)度”就是根據(jù)情況(比如時(shí)間片被用完),來調(diào)用另一個(gè)被稱為任務(wù)的函數(shù)(我們暫時(shí)稱之為函數(shù)TA),同時(shí)停止當(dāng)前的一個(gè)任務(wù)(其實(shí)也是一個(gè)函數(shù),我們稱之為TB)。問題出來了,若內(nèi)核象普通函數(shù)那樣直接調(diào)用TA,那么當(dāng)內(nèi)核要重新調(diào)用TB時(shí)怎么知道剛才TB執(zhí)行到哪里了呢?若內(nèi)核為TA和TB分配專用的兩塊空間,當(dāng)內(nèi)核要調(diào)用其他任務(wù)(其實(shí)就是函數(shù))的時(shí)候先將當(dāng)前任務(wù)(函數(shù))運(yùn)行的地址和狀態(tài)保存起來,然后當(dāng)要返回前再恢復(fù),當(dāng)然每個(gè)被稱之為任務(wù)的函數(shù)都要有自己獨(dú)立的保存運(yùn)行地址和狀態(tài)的空間,以免混亂。那問題就很好解決了。這也就是為什么任務(wù)都