嵌入式系統(tǒng)第八章 嵌入式實時操作系統(tǒng)cos -ii_第1頁
嵌入式系統(tǒng)第八章 嵌入式實時操作系統(tǒng)cos -ii_第2頁
嵌入式系統(tǒng)第八章 嵌入式實時操作系統(tǒng)cos -ii_第3頁
嵌入式系統(tǒng)第八章 嵌入式實時操作系統(tǒng)cos -ii_第4頁
嵌入式系統(tǒng)第八章 嵌入式實時操作系統(tǒng)cos -ii_第5頁
已閱讀5頁,還剩61頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、8.1 嵌入式操作系統(tǒng)概述 嵌入式操作系統(tǒng)(EOS):在嵌入式系統(tǒng)環(huán)境下運行的操作系統(tǒng)。嵌入式操作系統(tǒng)的功能: 進程管理 存儲管理 I/O設備管理 文件管理第8章 嵌入式實時操作系統(tǒng) C/OS -II常見的嵌入式操作系統(tǒng) VxWorks 目前較好的商業(yè)操作系統(tǒng) Linux 當今最重要開源免費操作系統(tǒng) uCOS-II 最適合學習的操作系統(tǒng) WinCE 微軟開發(fā)的一個Windows兼容 操作系統(tǒng)1、C/OSMicro Controller O S, (微控制器操作系統(tǒng))美國人Jean Labrosse 1992年完成應用面覆蓋了諸多領域,如照相機、醫(yī)療器械、音響設備、發(fā)動機控制、高速公路 系統(tǒng)、自

2、動提款機等 1998年C/OS-II,目前的版本C/OS2000年,得到美國航空管理局(FAA)的認證,可以用于飛行器中8.2 COS簡介公開源代碼可移植性好 絕大部分 C/OS-II的源碼是用移植性很強的ANSI C寫的。只有和微處理器硬件相關的那部分是用匯編語言寫的,使得 C/OS-II便于移植到其他微處理器上。可固化 C/OS-II是為嵌入式應用而設計的,這就意味著,只要有固化手段(C編譯、連接、下載和固化), C/OS-II可以嵌入到讀者的產(chǎn)品中成為產(chǎn)品的一部分。2. C/OS的特點:可裁剪 可以只使用 C/OS-II中應用程序需要的那些系統(tǒng)服務。也就是說某產(chǎn)品可以只使用很少幾個 C/

3、OS-II調(diào)用,而另一個產(chǎn)品則使用了幾乎所有 C/OS-II的功能,這樣可以減少產(chǎn)品中的 C/OS-II所需的存儲器空間(RAM和ROM)。這種可剪裁性是靠條件編譯實現(xiàn)的。占先式內(nèi)核 總是讓優(yōu)先級最高的就緒任務處于運行狀態(tài)多任務管理 C/OS-II可以管理64個任務,然而,目前這一版本保留8個給系統(tǒng)。應用程序最多可以有56個任務可確定性好 全部 C/OS-II的函數(shù)調(diào)用與服務的執(zhí)行時間具有可確定性。任務棧每個任務有自己單獨的棧, C/OS-II允許每個任務有不同的??臻g,以便壓低應用程序對RAM的需求。系統(tǒng)服務C/OS-II提供很多系統(tǒng)服務,例如郵箱、消息隊列、信號量、塊大小固定的內(nèi)存的申請與

4、釋放、時間相關函數(shù)等。中斷管理中斷可以使正在執(zhí)行的任務暫時掛起,如果優(yōu)先級更高的任務被該中斷喚醒,則高優(yōu)先級的任務在中斷嵌套全部退出后立即執(zhí)行,中斷嵌套層數(shù)可達255層。穩(wěn)定性與可靠性好3. C/OS-II提供的系統(tǒng)服務任務管理信號量任務間無沖突共享資源的方式消息信箱任務間傳遞單個數(shù)據(jù)的方式消息隊列任務間傳遞多個數(shù)據(jù)的方式事件任務間進行通信的方式內(nèi)存管理時鐘管理的結構 應用軟件 uCOS II 的系統(tǒng)服務 (與處理器無關的代碼) u OS_MBOX.C u OS_MUTEX.C OS uCOS II的設置 (與應用相關代碼) uCOS-II 的移植(與處理器相關的代碼) CPU 時鐘軟件硬件1

5、. 任務的基本概念COS-II的任務是一個線程,就是用來解決應用問題的C語言函數(shù)和與之關聯(lián)的數(shù)據(jù)結構而構成的一個實體。 COS-II的任務一般由任務程序代碼、任務堆棧、 任務控制塊三部分構成。 C/OS版本支持64個任務,每個任務有 一個特定的優(yōu)先級(是0-63之間的數(shù),用符號 Prio代表)。優(yōu)先級越高,數(shù)字越小。8.3 COS-II中的任務任務的構成任務的鏈表任務控制塊任務的代碼任務的堆棧2. 任務的五種狀態(tài)任務用戶任務由用戶定義的任務系統(tǒng)任務由操作系統(tǒng)定義的任務,例如空閑 任務,當無用戶任務時操作系統(tǒng)調(diào) 用該任務。 COS-II有8個系統(tǒng)任務。3. 任務的類型典型的任務一個無限循環(huán)。vo

6、id mytask(void *pdata) /定義任務 for (;) 可以中斷的用戶代碼 ; OS_ENTER_CRITICAL() ;/關中斷 不可以中斷的用戶代碼 ; OS_EXIT_CRITICAL();/開中斷 可以中斷的用戶代碼 ; 4. C/OS-II的任務代碼與應用程序的一般結構(1)任務(task)代碼的一般結構(2)用戶應用程序的一般結構Void Mytask1 (void*pdata) /定義任務1 for(; ;) Void Mytask2 (void*pdata) /定義任務2 for(; ;) /定義N個任務void main ( ) /主函數(shù) OSInit (

7、) ; / uCOS-II 初始化 OSTaskCreate (MyTask1, &MyTask1Agu,) ; /創(chuàng)建任務1 OStaskCreate (MyTask2, &MyTask1Agu ,) ; /創(chuàng)建任務2 /創(chuàng)建任務N OSStart ( ) ; /啟動任務 注意:用戶的主函數(shù)main( )程序只負責創(chuàng)建任務和啟動任務, 而由操作系統(tǒng)負責調(diào)度運行它們5. C/OS-II的任務堆棧每個任務為了進行任務切換與響應中斷時保護現(xiàn)場的需要都要定義自己的堆棧。例:#define STACKSIZE 64 /定義任務堆棧的大小OS_STK Task1_Stack STACKSIZE; /用數(shù)

8、組作為堆棧OS_STK Task1_Stack STACKSIZE=0;/堆棧賦初值(1)任務堆棧的定義6. C/OS-II的任務控制塊及任務控制塊鏈表任務控制塊 OS_TCB是一個數(shù)據(jù)結構,保存該任務的相關參數(shù),包括任務堆棧指針,狀態(tài),優(yōu)先級,任務表位置,任務鏈表指針等。 C/OS-II用控制鏈表來管理任務控制塊。 在調(diào)用C/OS-II的初始化函數(shù)OSInit( ) 進行初始化時建立空任務鏈表被建立(所 有的任務控制塊還沒分配任務); 在調(diào)用函數(shù)OSTaskCreate( )創(chuàng)建任務時 給空任務鏈表賦值,既給任務控制塊分配 任務。COS-II是采用占先式算法來調(diào)度任務的,優(yōu)先級最高的任務一旦

9、準備就緒,則擁有CPU的所有權開始投入運行。任務就緒的判斷是依據(jù)任務就緒表進行。7. C/OS-II的任務調(diào)度多任務操作系統(tǒng)的一項重要任務就是對任務的調(diào)度,所謂調(diào)度就是通過一種算法在多個任務中確定哪個任務來運行。任務的調(diào)度要完成兩項工作,一是在任務就緒表中查找具有最高優(yōu)先級別的就緒任務;二是實現(xiàn)任務的切換,這些工作是由COS-II的函數(shù)OSSched( )來實現(xiàn)的。8. C/OS-II任務的創(chuàng)建COS-II提供兩個創(chuàng)建任務函數(shù):一個是普通創(chuàng)建任務函數(shù) OSTaskCreate( );另一個是擴展創(chuàng)建任務函數(shù) OSTaskCreateExt( ),可以使用這兩個函數(shù)之一來創(chuàng)建任務。創(chuàng)建任務的方法

10、在啟動任務之前創(chuàng)建各任務在啟動任務之前,先創(chuàng)建一個起始任務,將它賦予最高的優(yōu)先級,然后再在起始任務中創(chuàng)建其它任務(1)在啟動任務之前創(chuàng)建各任務具體應用程序流程 1)頭文件# /包含uCOS-II頭文件#include “./”/包含uCOS-II附加頭文件#include ./inc/drivers.h/包含驅動頭文件#include ./inc/sys/lib.h/包含頭文件#include /包含C標準庫函數(shù)文件#include /包含C標準庫函數(shù)文件例:包含在程序中用到的頭文件 2)任務聲明定義任務1堆棧任務1函數(shù)聲明定義任務1的優(yōu)先權定義任務2堆棧任務2函數(shù)聲明定義任務2的優(yōu)先權定義任

11、務N堆棧任務N函數(shù)聲明定義任務N的優(yōu)先權OS_STK task1_StackSTACKSIZE=0; /定義任務1堆棧void Task1(void *Id); /任務1函數(shù)聲明#define Task1_Prio 12 /定義任務1的優(yōu)先權OS_STK task2_StackSTACKSIZE=0; /定義任務2堆棧void Task2(void *Id); /任務2函數(shù)聲明#define Task2_Prio 15 /定義任務2的優(yōu)先權任務聲明的例子: 3)定義主函數(shù)例:int main (void) ARMTargetInt( );/目標板初始化; OSInit( ) ; /ucos-i

12、i 初始化; OSTaskCreate(任務1名,任務1參數(shù),任務1棧指針, 任務1優(yōu)先權); OSTaskCreate(任務2名,任務2參數(shù),任務2棧指針, 任務2優(yōu)先權); OSAddTask_Init(0); /系統(tǒng)任務初始化 OSStart( ); /啟動任務 return 0 ; Void Mytask1 (void*pdata) /定義任務1 for(; ;) Void Mytask2 (void*pdata) /定義任務2 for(; ;) 4)定義各任務(2)先建立啟動任務的方法Void main (void) /主函數(shù) OSInit( ); /對C/OS-II進行初始化 OS

13、TaskCreate( TaskStart , ); /創(chuàng)建起始任務 OSStart( ); / 啟動操作系統(tǒng)任務調(diào)度Void TaskStart(Viod *pdata ) /起始任務 /起始任務初始化 OSTaskCreate( Task2 , ); /創(chuàng)建任務2 /創(chuàng)建其它任務 for (; ;) /起始任務的具體代碼 例:試在操作系統(tǒng)C/OS-II下創(chuàng)建兩個任務, 在C/OS-II管理下運行,要求T1每運行 2次T2運行1次,并將運行的情況傳送到 在PC機的超級終端上顯示。/*uCOS-II在ARM上多任務應用程序的頭文件*/#include./ucos-ii/includes.h /

14、包含uCOS-II頭文件#include ./ucos-ii/add/osaddition.h/包含uCOS-II頭文件#include ./inc/drivers.h/包含驅動頭文件#include ./inc/sys/lib.h/包含/頭文件#include /包含C標準庫函數(shù)文件#include /包含C標準庫函數(shù)文件#pragma import(_use_no_semihosting_swi) /不使用SWI/*任務定義*/OS_STK T1_StackSTACKSIZE=0; /定義任務1堆棧void T1(void *Id); /任務1函數(shù)說明#define T1_Prio 12

15、/定義任務1的優(yōu)先權OS_STK T2_StackSTACKSIZE=0; /定義任務2堆棧void T2(void *Id); /任務2函數(shù)說明#define T2_Prio 15 /定義任務2的優(yōu)先權/*主函數(shù)*/int main(void)ARMTargetInit(); /目標板初始化OSInit(); / uCOS-II初始化OSTaskCreate(T1, (void *)0, (OS_STK *)&T1StackSTACKSIZE-1, T1Prio);/創(chuàng)建任務1OSTaskCreate(T2, (void *)0, (OS_STK *)&T2 StackSTACKSIZE-1

16、, T2 Prio);/創(chuàng)建任務2OSAddTask_Init(0); /系統(tǒng)任務初始化OSStart(); /啟動任務return 0; /返回/*定義任務1*/void T1(void *Id) for(;)printf(運行任務1n); /傳送并顯示運行任務1OSTimeDly(1000); /延時 /*定義任務2*/void T2(void *Id) for(;)printf(運行任務2n); /傳送并顯示運行任務2OSTimeDly(2000); /延時 1. 基本概念C/OS-II是一多任務管理系統(tǒng),多任務的協(xié)調(diào)工作需要解決兩個基本問題:(1)多個任務無沖突共享資源(稱為任務間的同

17、步問題);(2)任務之間傳遞數(shù)據(jù)(稱為任務間的通信問題)。使用信號量來解決多個任務無沖突共享資源及任務同步使用消息信箱來實現(xiàn)任務間傳遞一個(組)數(shù)據(jù)C/OS-II使用消息隊列來實現(xiàn)任務間傳遞多個(組)數(shù)據(jù)8.4 任務間的同步與通信2. 信號量信號量表示共享資源被占用情況的標 志信號,在程序中是全局變量。兩個任務使用信號量實現(xiàn)無沖突共享資源示意圖兩個任務使用消息信箱傳遞數(shù)據(jù)示意圖3. 消息信箱消息信箱為了實現(xiàn)任務間傳遞數(shù)據(jù)在內(nèi)存設置 一個消息緩沖區(qū),用來傳遞消息緩沖 區(qū)指針的數(shù)據(jù)結構稱為消息信箱。兩個任務使用消息隊列傳遞數(shù)據(jù)示意圖4. 消息隊列消息隊列為了實現(xiàn)任務間傳遞多個數(shù)據(jù)在內(nèi)存設置多個消息

18、緩沖區(qū),同時定義一個指針數(shù)組,每個數(shù)組元素存放一個消息緩沖區(qū)指針,這種用來傳遞多個消息的的數(shù)據(jù)結構稱為消息隊列。5.C/OS-II的信號量的操作函數(shù)及應用C/OS-II提供了6個對信號量操作函數(shù)創(chuàng)建信號量函數(shù)OSSemCreate( )請求信號量函數(shù)OSSemPend( )無等待請求信號量函數(shù)OSSemAccept( )發(fā)送信號量函數(shù)OSSemPost( )查詢信號量當前狀態(tài)函數(shù)OSSemQuery( )刪除信號量函數(shù)OSSemDel( )C/OS-II的消息郵箱的編程舉例試編制信號量演示程序,在一個任務task1中用OSSemPost( )來發(fā)送信號量,在另一個任務task2中用OSSemP

19、end()函數(shù)來接收信號量,并將信號量顯示出來。/*頭文件包含*/#include./ucos-ii/includes.h /包含C/OS-頭文件#include ./ucos-ii/add/osaddition.h/包含C/OS-頭文件#include ./inc/drivers.h ” /包含驅動頭文件#include ./inc/sys/lib.h/包含/頭文件#include /包含C標準庫函數(shù)文件#include /包含C標準庫函數(shù)文件#pragma import(_use_no_semihosting_swi) /不使用SWI /*任務定義*/OS_STK task1_StackS

20、TACKSIZE=0;/定義任務1堆棧OS_STK task2_StackSTACKSIZE=0; /定義任務2堆棧void task1(void *Id);/定義任務1void task2(void *Id);/定義任務2OS_EVENT *sem; /定義信號量事件指針U8 err;/*主函數(shù)*/int main()ARMTargetInit(); OSInit();sem=OSSemCreate(1);/創(chuàng)建信號量 OSTaskCreate(task1, (void*)0, (OS_STK*)&task1_StackSTACKSIZE-1,5); OSTaskCreate(task2,(

21、void*)0, (OS_STK*)&task2_StackSTACKSIZE-1,6);OSAddTask_Init(0); OSStart(); return 0; /操作系統(tǒng)管理任務時永不返回,程序結束時返回 /*任務1函數(shù)*/void task1(void *Id)/任務1while(1)OSSemPost(sem);/發(fā)送信號量printf(t任務1運行,發(fā)出信號量n);OSTimeDly(1000);OSTaskDel(5);/刪除任務1 /*任務2函數(shù)*/void task2(void *Id) U16 value; while(1) value=OSSemAccept(sem)

22、; /查看資源是否可以使用 printf(t任務2運行,接收信號量n); printf(value=%dn,value); OSSemPend(sem,0,&err); /等待接收信號才往下執(zhí)行任務 OSTimeDly(1000);/延時6.C/OS-II的消息郵箱的操作函數(shù)及應用C/OS-II提供了6種消息郵箱操作函數(shù)創(chuàng)建消息郵箱函數(shù) OSMboxCreate( )等待消息函數(shù) OSMboxPend( )發(fā)送消息函數(shù) OSMboxPost( )無等待地獲得消息函數(shù) OSMboxAccept( )查詢消息郵箱的狀態(tài)函數(shù) OSMboxQuery( )刪除消息郵箱函數(shù) OSMboxDel( )使用

23、它們就可實現(xiàn)消息郵箱的功能試編制消息信箱演示程序,task0通過OSMboxPost(Come,&buffer)向消息信箱發(fā)送消息,然后在task1中通過OSMboxPend接收消息,并將接收到的消息顯示出來。C/OS-II的消息郵箱的編程舉例#include./ucos-ii/includes.h /包含C/OS-頭文件#include ./ucos-ii/add/osaddition.h/包含C/OS-頭文件#include ./inc/drivers.h/包含驅動頭文件#include ./inc/sys/lib.h/包含/頭文件#include /包含C標準庫函數(shù)文件#include

24、/包含C標準庫函數(shù)文件#pragma import(_use_no_semihosting_swi) /不使用SWI/*任務定義*/OS_STK task0_StackSTACKSIZE=0;/定義1任務堆棧OS_STK task1_StackSTACKSIZE=0; /定義任務2堆棧void task0(void *dat);/定義任務0void task1(void *dat); /定義任務1OS_EVENT *Come; /定義消息信箱事件指針U8 err;/*主函數(shù)*/int main()ARMTargetInit(); OSInit(); Come=OSMboxCreate(void

25、 *)0);/建立消息郵箱OSTaskCreate(task0,(void*)0,(OS_STK *)&task0_StackSTACKSIZE-1,5);/創(chuàng)建任務task0OSTaskCreate(task1,(void*)0,(OS_STK *)&task1_StackSTACKSIZE-1,6);/創(chuàng)建任務task1OSAddTask_Init(0);OSStart();return 0;/*任務0函數(shù)*/void task0(void *dat) /任務0 U16 buffer=0 x0FFF;/要發(fā)送的信息int i=0;while(1) OSMboxPost(Come,&buff

26、er);/通過消息郵箱發(fā)送信息給任務 printf(tTask0 is runningn); OSTimeDly(2000); if(i3) i+; else printf(Task0運行結束,釋放任務資源n); OSTaskDel(5);/刪除任務0 /*任務1函數(shù)*/void task1(void *dat) U16 *msg; U16 c; while(1) msg=OSMboxPend(Come,0,&err);/等待接收郵箱信息 c=*msg; printf(tTask1 is runningn);/獲得指針指向的變量 printf(獲取到的消息為:%ldn,c); printf(T

27、ask1運行結束,釋放任務資源n); OSTaskDel(6);/刪除任務1 OSTimeDly(1000); 運行結果:C/OS-在S3C44B0X上的移植一、移植條件 二、移植內(nèi)容 主要內(nèi)容1、處理器的C編譯器能產(chǎn)生可重入代碼 2、用C語言就可以打開和關閉中斷 3、處理器支持中斷并且能產(chǎn)生定時中斷 4、處理器支持容納一定量數(shù)據(jù)的硬件堆棧 5、處理器有將堆棧指針和其他CPU寄存 器讀出和存儲到堆棧或內(nèi)存中的指令一、移植的條件1、處理器的C編譯器能產(chǎn)生可重入代碼1)可重入代碼指的是可以被多個任務同時調(diào)用,但不會破壞數(shù)據(jù)的一段代碼,或者說代碼具有在執(zhí)行過程中打斷后再次被調(diào)用的能力。2)C/OS-

28、是多任務內(nèi)核,函數(shù)可能會被多個任務調(diào)用。所以要完成多任務,代碼的可重入性是基礎。int temp;void swap (int *x,int*y)temp=*x;*x=*y;*y=temp;void swap (int *x,int*y)int temp;temp=*x;*x=*y;*y=temp;下面列舉了兩個函數(shù)例子,它們的區(qū)別在于變量temp保存的位置不同,左邊temp作為全局變量存在,右邊函數(shù)中temp作為函數(shù)的局部變量存在,因此左邊的函數(shù)是不可重入的,而右邊的函數(shù)是可以重入的。由此可見,在函數(shù)中應盡量避免使用全局變量。此外,還需要C編譯器的支持,使用Embest IDE的集成開發(fā)環(huán)境

29、,可以生成可重入的代碼。2、用C語言就可以打開和關閉中斷uCOS-II在C語言代碼中通過使用以下兩個宏OS_ENTER_CRITICAL ( ) OS_EXIT_CRITICAL( )打開和關閉中斷,從而保護臨界代碼#define OS_ENTER_CRITICAL() ARMDisableInt()ARMDisableInt: mrs r12, CPSR /* 獲取模式寄存器 */orr r12, r12, #I_BIT /* 設置禁止中斷位 */msr CPSR_c, r12 /* 設置模式寄存器 */ bxlr3、處理器有將堆棧指針和其他CPU寄存器讀出和存儲到堆?;騼?nèi)存中的指令。ARM處理器中匯編指令stmfd可以將所有寄存器壓棧,對應也有一個出棧的指令ldmfd。二、uC/OS-II移植內(nèi)容及步驟移植第一步基本的配置和定義移植第二步移植與處理器相關的匯編代碼文件移植第三步移植與處理器相關的標準C代碼文件一、定義編譯器相關的數(shù)據(jù)類型四、定義OS_TASK_SW()宏三、定義棧的增長方向 二、定義允許和禁止中斷宏typedef unsigned char BOOLEAN;typedef unsigned char INT8U;typedef signed char INT8S;typedef unsign

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論