嵌入式系統(tǒng)實(shí)訓(xùn)報(bào)告_第1頁
嵌入式系統(tǒng)實(shí)訓(xùn)報(bào)告_第2頁
嵌入式系統(tǒng)實(shí)訓(xùn)報(bào)告_第3頁
嵌入式系統(tǒng)實(shí)訓(xùn)報(bào)告_第4頁
嵌入式系統(tǒng)實(shí)訓(xùn)報(bào)告_第5頁
已閱讀5頁,還剩29頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

嵌入式系統(tǒng)實(shí)訓(xùn)課程:嵌入式系統(tǒng)及應(yīng)用學(xué)號(hào):姓名:班級(jí):教師:計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院實(shí)訓(xùn)內(nèi)容及安排實(shí)訓(xùn)目的與要求:嵌入式系統(tǒng)實(shí)訓(xùn)的目標(biāo)是通過對(duì)嵌入式系統(tǒng)的體系結(jié)構(gòu)和操作系統(tǒng)的開發(fā)培養(yǎng)學(xué)生嵌入式系統(tǒng)的能力。實(shí)訓(xùn)方式:自己設(shè)計(jì)方案,按照指導(dǎo)書的要求獨(dú)立完成實(shí)訓(xùn)。實(shí)訓(xùn)環(huán)境:PC機(jī);ARM實(shí)際系統(tǒng);UCOS—Ⅱ系統(tǒng);ADS1.2環(huán)境實(shí)訓(xùn)內(nèi)容:說明:實(shí)驗(yàn)總共分四個(gè)階段,分別如下:第一階段 總體分析OS_TASK.C包含的函數(shù)第二階段 逐個(gè)分析OS_TASK.C中的函數(shù)第三階段 畫流程圖第四階段實(shí)驗(yàn)總結(jié)第一階段 總體分析OS_TASK.C包含的函數(shù)主要內(nèi)容:OS_TASK.C(是我們?cè)跈C(jī)房使用的文件,下面的也是)基本要求:(1)、了解OS_TASK.C包含哪些函數(shù)(2)、了解OS_TASK.C的作用時(shí)間:第1天OS_TASK.C包含的函數(shù)有:OSTaskChangePrio()函數(shù)允許生成OSTaskCreate()函數(shù)OS_ENTER_CRITICAL();關(guān)閉中斷函數(shù)OS_EXIT_CRITICAL();打開中斷函數(shù)OSTaskStkInit()初始化函數(shù)OSTaskDelHook();可在鉤子程序中加入自定程序函數(shù)第二階段 逐個(gè)分析OS_TASK.C中的函數(shù)主要內(nèi)容:OS_TASK.C基本要求:(1)、了解OS_TASK.C中各個(gè)函數(shù)的作用(2)、分析OS_TASK.C中各個(gè)函數(shù)的代碼時(shí)間:第2—6天/***************************************************************************************************uC/OS-II實(shí)時(shí)控制內(nèi)核*主要的包含文件*任務(wù)管理**文件:OS_TASK.C任務(wù)管理代碼*作者:JeanJ.Labrosse*中文注解:鐘常慰zhongcw@126.com譯注版本:1.0請(qǐng)尊重原版內(nèi)容**************************************************************************************************/#ifndefOS_MASTER_FILE//是否已經(jīng)定義OS_MASTER_FILE#include"includes.h"http://包含"includes.h"文件#endif//結(jié)束定義/***************************************************************************************************改變一個(gè)任務(wù)的優(yōu)先級(jí)(CHANGEPRIORITYOFATASK)*描述:改變一個(gè)任務(wù)的優(yōu)先級(jí)。**參數(shù):oldp是任務(wù)原先的優(yōu)先級(jí)。*newp是任務(wù)的新優(yōu)先級(jí)。*返回:OS_NO_ERR任務(wù)優(yōu)先級(jí)成功改變。*OS_PRIO_INVALID參數(shù)中的任務(wù)原先優(yōu)先級(jí)或新優(yōu)先級(jí)大于或等于OS_LOWEST_PRIO。(i.e.>=OS_LOWEST_PRIO)*OS_PRIO_EXIST優(yōu)先級(jí)為PIP的任務(wù)已經(jīng)存在;*OS_PRIO_ERR參數(shù)中的任務(wù)原先優(yōu)先級(jí)不存在。*注意:參數(shù)中的新優(yōu)先級(jí)必須是沒有使用過的,否則會(huì)返回錯(cuò)誤碼.在OSTaskChangePrio()中還會(huì)先*判斷要改變優(yōu)先級(jí)的任務(wù)是否存在。**************************************************************************************************#ifOS_TASK_CHANGE_PRIO_EN>0//允許生成OSTaskChangePrio()函數(shù)INT8UOSTaskChangePrio(INT8Uoldprio,INT8Unewprio){//改變一個(gè)任務(wù)的優(yōu)先級(jí)(任務(wù)舊的優(yōu)先級(jí)、任務(wù)新的優(yōu)先級(jí))#ifOS_CRITICAL_METHOD==3//允許生成OSTaskCreate()函數(shù)OS_CPU_SRcpu_sr;#endif#ifOS_EVENT_EN>0//消息事件是否>0OS_EVENT*pevent;//定義事件指針#endifOS_TCB*ptcb;//定義消息事件的任務(wù)控制塊指針I(yè)NT8Ux;//優(yōu)先級(jí)低3位值INT8Uy;//優(yōu)先級(jí)高3位值INT8Ubitx;//優(yōu)先級(jí)低3位值計(jì)算對(duì)應(yīng)值INT8Ubity;//優(yōu)先級(jí)高3位值計(jì)算索引值#ifOS_ARG_CHK_EN>0//所有參數(shù)必須在指定的參數(shù)內(nèi)//當(dāng)舊任務(wù)>=最低優(yōu)先級(jí)并且舊任務(wù)不是本身并且新任務(wù)>=最低優(yōu)先級(jí)if((oldprio>=OS_LOWEST_PRIO&&oldprio!=OS_PRIO_SELF)||newprio>=OS_LOWEST_PRIO){return(OS_PRIO_INVALID);//參數(shù)中的任務(wù)原先優(yōu)先級(jí)或新優(yōu)先級(jí)大于或等于OS_LOWEST_PRIO}#endifOS_ENTER_CRITICAL();//關(guān)閉中斷if(OSTCBPrioTbl[newprio]!=(OS_TCB*)0){//確認(rèn)新任務(wù)優(yōu)先級(jí)未被使用,即就緒態(tài)為0OS_EXIT_CRITICAL();//打開中斷return(OS_PRIO_EXIST);//返回新任務(wù)(優(yōu)先級(jí)為PIP的任務(wù)已經(jīng)存在)}else{OSTCBPrioTbl[newprio]=(OS_TCB*)1;//新任務(wù)優(yōu)先級(jí)未被使用,保留它(為1)OS_EXIT_CRITICAL();//打開中斷//預(yù)先計(jì)算新任務(wù)優(yōu)先級(jí)任務(wù)控制塊OS_TCB的某些值y=newprio>>3;//保留優(yōu)先級(jí)高3位(3-5位)bity=OSMapTbl[y];//計(jì)算索引值x=newprio&0x07;//保存優(yōu)先級(jí)低3位(0-2位)bitx=OSMapTbl[x];//計(jì)算對(duì)應(yīng)值2H:\SOURCE中文源代碼\OS_TASK.COS_ENTER_CRITICAL();//關(guān)閉中斷if(oldprio==OS_PRIO_SELF){//要改變的是否使舊任務(wù)本身oldprio=OSTCBCur->OSTCBPrio;//如果是(正在運(yùn)行的優(yōu)先級(jí)(舊任務(wù)本身的優(yōu)先級(jí)))}if((ptcb=OSTCBPrioTbl[oldprio])!=(OS_TCB*)0){//變更的舊任務(wù)必須存在(1即就緒)OSTCBPrioTbl[oldprio]=(OS_TCB*)0;//舊任務(wù)就緒態(tài)去除它(為0)if((OSRdyTbl[ptcb->OSTCBY]&ptcb->OSTCBBitX)!=0x00){//如果該任務(wù)處于就緒態(tài),那么必須在當(dāng)前的優(yōu)先級(jí)下,從就緒表中移除該任務(wù),然后在新//的優(yōu)先級(jí)下,將該任務(wù)插入到就緒表中。if((OSRdyTbl[ptcb->OSTCBY]&=~ptcb->OSTCBBitX)==0x00){OSRdyGrp&=~ptcb->OSTCBBitY;}OSRdyGrp|=bity;//利用預(yù)先計(jì)算值將任務(wù)插入到就緒表中OSRdyTbl[y]|=bitx;#ifOS_EVENT_EN>0//消息事件是否>0}else{//(任務(wù)未就緒)否則,拾取任務(wù)事件指針if((pevent=ptcb->OSTCBEventPtr)!=(OS_EVENT*)0){//任務(wù)事件表為1(有消息)//如果任務(wù)正在等待某一事件的發(fā)生,該函數(shù)必須將任務(wù)從事件控制塊的等待列表中刪除//并在新的優(yōu)先級(jí)下將事件插入到等待隊(duì)列中。任務(wù)也可能正在等待延時(shí)時(shí)間到,或是被//掛起。if((pevent->OSEventTbl[ptcb->OSTCBY]&=~ptcb->OSTCBBitX)==0){pevent->OSEventGrp&=~ptcb->OSTCBBitY;}pevent->OSEventGrp|=bity;//將任務(wù)插入到等待列表中pevent->OSEventTbl[y]|=bitx;}#endif}OSTCBPrioTbl[newprio]=ptcb;//將任務(wù)的OS_TCB的指針存到新任務(wù)OSTCBPrioTbl[]ptcb->OSTCBPrio=newprio;//設(shè)定新的任務(wù)優(yōu)先級(jí),并保存原有計(jì)算值ptcb->OSTCBY=y;//高3位計(jì)算值ptcb->OSTCBX=x;//低3位計(jì)算值ptcb->OSTCBBitY=bity;ptcb->OSTCBBitX=bitx;OS_EXIT_CRITICAL();//打開中斷OS_Sched();//任務(wù)調(diào)度,最高任務(wù)優(yōu)先級(jí)運(yùn)行return(OS_NO_ERR);//任務(wù)優(yōu)先級(jí)成功改變}else{//否則OSTCBPrioTbl[newprio]=(OS_TCB*)0;//新任務(wù)就緒態(tài)去除它(為0不存在),OS_EXIT_CRITICAL();//打開中斷return(OS_PRIO_ERR);//返回(參數(shù)中的任務(wù)原先優(yōu)先級(jí)不存在)}}}#endif/*$PAGE*//***************************************************************************************************建立一個(gè)新任務(wù)(CREATEATASK)**描述:建立一個(gè)新任務(wù)。任務(wù)的建立可以在多任務(wù)環(huán)境啟動(dòng)之前,也可以在正在運(yùn)行的任務(wù)中建立.中斷*處理程序中不能建立任務(wù).一個(gè)任務(wù)必須為無限循環(huán)結(jié)構(gòu)(如下所示),且不能有返回點(diǎn)。*OSTaskCreate()是為與先前的μC/OS版本保持兼容,新增的特性在OSTaskCreateExt()函數(shù)中.*無論用戶程序中是否產(chǎn)生中斷,在初始化任務(wù)堆棧時(shí),堆棧的結(jié)構(gòu)必須與CPU中斷后寄存器入棧的*順序結(jié)構(gòu)相同.詳細(xì)說明請(qǐng)參考所用處理器的手冊(cè)。**參數(shù):task是指向任務(wù)代碼的指針。**pdata指向一個(gè)數(shù)據(jù)結(jié)構(gòu),該結(jié)構(gòu)用來在建立任務(wù)時(shí)向任務(wù)傳遞參數(shù)。下例中說明uC/OS中的任*務(wù)結(jié)構(gòu)以及如何傳遞參數(shù)pdata:*voidTask(void*pdata)*{*...//對(duì)參數(shù)'pdata'進(jìn)行操作*for(;;){//任務(wù)函數(shù)體.*...*...*//在任務(wù)體中必須調(diào)用如下函數(shù)之一:*//OSMboxPend()用于任務(wù)等待消息,消息通過中斷或另外的任務(wù)發(fā)送給需要的任務(wù)*//OSFlgPend()用于任務(wù)等待事件標(biāo)志中的事件標(biāo)志*//OSMutexPend()任務(wù)需要獨(dú)占資源*//OSQPend()用于任務(wù)等待消息*//OSSemPend()用于任務(wù)試圖取得共享資源的使用權(quán),任務(wù)需要與其它任務(wù)或中斷*同步及任務(wù)需要等待特定事件的發(fā)生場(chǎng)合*//OSTimeDly()任務(wù)延時(shí)若干時(shí)鐘節(jié)拍*//OSTimeDlyHMSM()任務(wù)延時(shí)若干時(shí)間*//OSTaskSuspend()掛起任務(wù)本身3H:\SOURCE中文源代碼\OS_TASK.C*//OSTaskDel()刪除任務(wù)本身*...*...*}*ptos為指向任務(wù)堆棧棧頂?shù)闹羔槨H蝿?wù)堆棧用來保存局部變量,函數(shù)參數(shù),返回地址以及任務(wù)被*中斷時(shí)的CPU寄存器內(nèi)容.任務(wù)堆棧的大小決定于任務(wù)的需要及預(yù)計(jì)的中斷嵌套層數(shù)。計(jì)算*堆棧的大小,需要知道任務(wù)的局部變量所占的空間,可能產(chǎn)生嵌套調(diào)用的函數(shù),及中斷嵌套*所需空間。如果初始化常量OS_STK_GROWTH設(shè)為1,堆棧被設(shè)為從內(nèi)存高地址向低地址增長(zhǎng),*此時(shí)ptos應(yīng)該指向任務(wù)堆??臻g的最高地址。反之,如果OS_STK_GROWTH設(shè)為0,堆棧將從內(nèi)*存的低地址向高地址增長(zhǎng)。**prio為任務(wù)的優(yōu)先級(jí)。每個(gè)任務(wù)必須有一個(gè)唯一的優(yōu)先級(jí)作為標(biāo)識(shí)。數(shù)字越小,優(yōu)先級(jí)越高。**返回:OS_NO_ERR函數(shù)調(diào)用成功;*OS_PRIO_EXIT具有該優(yōu)先級(jí)的任務(wù)已經(jīng)存在;*OS_PRIO_INVALID參數(shù)指定的優(yōu)先級(jí)大于OS_LOWEST_PRIO;(i.e.>=OS_LOWEST_PRIO)*OS_NO_MORE_TCB系統(tǒng)中沒有OS_TCB可以分配給任務(wù)了。**注意:1、任務(wù)堆棧必須聲明為OS_STK類型。*2、在任務(wù)中必須調(diào)用uC/OS提供的下述過程之一:延時(shí)等待、任務(wù)掛起、等待事件發(fā)生(等待信*號(hào)量,消息郵箱、消息隊(duì)列),以使其他任務(wù)得到CPU。*3、用戶程序中不能使用優(yōu)先級(jí)0,1,2,3,以及OS_LOWEST_PRIO-3,OS_LOWEST_PRIO-2,*OS_LOWEST_PRIO-1,OS_LOWEST_PRIO。這些優(yōu)先級(jí)μC/OS系統(tǒng)保留,其余的56個(gè)優(yōu)先級(jí)提供給*應(yīng)用程序。**************************************************************************************************/#ifOS_TASK_CREATE_EN>0//允許生成OSTaskCreate()函數(shù)INT8UOSTaskCreate(void(*task)(void*pd),void*pdata,OS_STK*ptos,INT8Uprio){//建立任務(wù)(任務(wù)代碼指針、傳遞參數(shù)指針、分配任務(wù)堆棧棧頂指針、任務(wù)優(yōu)先級(jí))#ifOS_CRITICAL_METHOD==3//中斷函數(shù)被設(shè)定為模式3OS_CPU_SRcpu_sr;#endifOS_STK*psp;//初始化任務(wù)堆棧指針變量,返回新的棧頂指針I(yè)NT8Uerr;//定義(獲得并定義初始化任務(wù)控制塊)是否成功#ifOS_ARG_CHK_EN>0//所有參數(shù)必須在指定的參數(shù)內(nèi)if(prio>OS_LOWEST_PRIO){//檢查任務(wù)優(yōu)先級(jí)是否合法return(OS_PRIO_INVALID);//參數(shù)指定的優(yōu)先級(jí)大于OS_LOWEST_PRIO}#endifOS_ENTER_CRITICAL();//關(guān)閉中斷if(OSTCBPrioTbl[prio]==(OS_TCB*)0){//確認(rèn)優(yōu)先級(jí)未被使用,即就緒態(tài)為0OSTCBPrioTbl[prio]=(OS_TCB*)1;//保留這個(gè)優(yōu)先級(jí),將就緒態(tài)設(shè)為0OS_EXIT_CRITICAL();//打開中斷psp=(OS_STK*)OSTaskStkInit(task,pdata,ptos,0);//初始化任務(wù)堆棧err=OS_TCBInit(prio,psp,(OS_STK*)0,0,0,(void*)0,0);//獲得并初始化任務(wù)控制塊if(err==OS_NO_ERR){//任務(wù)控制初始化成功OS_ENTER_CRITICAL();//關(guān)閉中斷OSTaskCtr++;//任務(wù)計(jì)數(shù)器加1OS_EXIT_CRITICAL();//打開中斷if(OSRunning==TRUE){//檢查是否有(某個(gè))任務(wù)在運(yùn)行OS_Sched();//任務(wù)調(diào)度,最高任務(wù)優(yōu)先級(jí)運(yùn)行}}else{//否則,任務(wù)初始化失敗OS_ENTER_CRITICAL();//關(guān)閉中斷OSTCBPrioTbl[prio]=(OS_TCB*)0;//放棄任務(wù),設(shè)此任務(wù)就緒態(tài)為0OS_EXIT_CRITICAL();//打開中斷}return(err);//返回(獲得并定義初始化任務(wù)控制塊是否成功)}OS_EXIT_CRITICAL();//打開中斷return(OS_PRIO_EXIST);//返回(具有該優(yōu)先級(jí)的任務(wù)已經(jīng)存在)}#endif/*$PAGE*//***************************************************************************************************CREATEATASK(ExtendedVersion)**描述:建立一個(gè)新任務(wù)。與OSTaskCreate()不同的是,OSTaskCreateExt()允許用戶設(shè)置更多的細(xì)節(jié)*內(nèi)容.任務(wù)的建立可以在多任務(wù)環(huán)境啟動(dòng)之前,也可以在正在運(yùn)行的任務(wù)中建立,但中斷處理*程序中不能建立新任務(wù)。一個(gè)任務(wù)必須為無限循環(huán)結(jié)構(gòu)(如下所示),且不能有返回點(diǎn)。**參數(shù):task是指向任務(wù)代碼的指針。4H:\SOURCE中文源代碼\OS_TASK.C**pdataPdata指針指向一個(gè)數(shù)據(jù)結(jié)構(gòu),該結(jié)構(gòu)用來在建立任務(wù)時(shí)向任務(wù)傳遞參數(shù)。下例中說*明uC/OS中的任務(wù)代碼結(jié)構(gòu)以及如何傳遞參數(shù)pdata:(如果在程序中不使用參數(shù)pdata,*為了避免在編譯中出現(xiàn)"參數(shù)未使用"的警告信息,可以寫一句pdata=pdata;)*voidTask(void*pdata)*{*...//對(duì)參數(shù)pdata進(jìn)行操作,例如pdata=pdata*for(;;){//任務(wù)函數(shù)體.總是為無限循環(huán)結(jié)構(gòu)*...*...*//任務(wù)中必須調(diào)用如下的函數(shù):*//OSMboxPend()用于任務(wù)等待消息,消息通過中斷或另外的任務(wù)發(fā)送給需要的任務(wù)*//OSFlgPend()用于任務(wù)等待事件標(biāo)志中的事件標(biāo)志*//OSMutexPend()任務(wù)需要獨(dú)占資源*//OSQPend()用于任務(wù)等待消息*//OSSemPend()用于任務(wù)試圖取得共享資源的使用權(quán),任務(wù)需要與其它任務(wù)或中斷*同步及任務(wù)需要等待特定事件的發(fā)生場(chǎng)合*//OSTimeDly()任務(wù)延時(shí)若干時(shí)鐘節(jié)拍*//OSTimeDlyHMSM()任務(wù)延時(shí)若干時(shí)間*//OSTaskSuspend()掛起任務(wù)本身*//OSTaskDel()刪除任務(wù)本身*...*...*}*}*ptos為指向任務(wù)堆棧棧頂?shù)闹羔?任務(wù)堆棧用來保存局部變量,函數(shù)參數(shù),返回地址以及中*斷時(shí)的CPU寄存器內(nèi)容.任務(wù)堆棧的大小決定于任務(wù)的需要及預(yù)計(jì)的中斷嵌套層數(shù).計(jì)*算堆棧的大小,需要知道任務(wù)的局部變量所占的空間,可能產(chǎn)生嵌套調(diào)用的函數(shù),及*中斷嵌套所需空間.如果初始化常量OS_STK_GROWTH設(shè)為1,堆棧被設(shè)為向低端增長(zhǎng)*(從內(nèi)存高地址向低地址增長(zhǎng)).此時(shí)ptos應(yīng)該指向任務(wù)堆棧空間的最高地址.反之,*如果OS_STK_GROWTH設(shè)為0,堆棧將從低地址向高地址增長(zhǎng).**prio任務(wù)的優(yōu)先級(jí)。每個(gè)任務(wù)必須有一個(gè)唯一的優(yōu)先級(jí)作為標(biāo)識(shí).數(shù)字越小,優(yōu)先級(jí)越高。**id是任務(wù)的標(biāo)識(shí),目前這個(gè)參數(shù)沒有實(shí)際的用途,但保留在OSTaskCreateExt()中供今后*擴(kuò)展,應(yīng)用程序中可設(shè)置id與優(yōu)先級(jí)相同.(0..65535)**pbos為指向堆棧底端的指針。如果初始化常量OS_STK_GROWTH設(shè)為1,堆棧被設(shè)為從內(nèi)存高*地址向低地址增長(zhǎng).此時(shí)pbos應(yīng)該指向任務(wù)堆??臻g的最低地址.反之,如果*OS_STK_GROWTH設(shè)為0,堆棧將從低地址向高地址增長(zhǎng)。pbos應(yīng)該指向堆??臻g的最高*地址.參數(shù)pbos用于堆棧檢測(cè)函數(shù)OSTaskStkChk().**stk_size指定任務(wù)堆棧的大小。其單位由OS_STK定義:當(dāng)OS_STK的類型定義為INT8U、INT16U、*INT32U的時(shí)候,stk_size的單位為分別為字節(jié)(8位)、字(16位)和雙字(32位)。**pext是一個(gè)用戶定義數(shù)據(jù)結(jié)構(gòu)的指針,可作為TCB的擴(kuò)展。例如,當(dāng)任務(wù)切換時(shí),用戶定義*的數(shù)據(jù)結(jié)構(gòu)中可存放浮點(diǎn)寄存器的數(shù)值,任務(wù)運(yùn)行時(shí)間,任務(wù)切入次數(shù)等等信息。**opt存放與任務(wù)相關(guān)的操作信息。opt的低8位由uC/OS保留,用戶不能使用。用戶可以使用*opt的高8位。每一種操作由opt中的一位或幾位指定,當(dāng)相應(yīng)的位被置位時(shí),表示選擇*某種操作。當(dāng)前的μC/OS版本支持下列操作:*OS_TASK_OPT_STK_CHK:決定是否進(jìn)行任務(wù)堆棧檢查;*OS_TASK_OPT_STK_CLR:決定是否清空堆棧;*OS_TASK_OPT_SAVE_FP:決定是否保存浮點(diǎn)寄存器的數(shù)值。此項(xiàng)操作僅當(dāng)處理器有浮*點(diǎn)硬件時(shí)有效。保存操作由硬件相關(guān)的代碼完成。***返回:OS_NO_ERR:函數(shù)調(diào)用成功;*OS_PRIO_EXIST:具有該優(yōu)先級(jí)的任務(wù)已經(jīng)存在;*OS_PRIO_INVALID:參數(shù)指定的優(yōu)先級(jí)大于OS_LOWEST_PRIO;*OS_NO_MORE_TCB:系統(tǒng)中沒有OS_TCB可以分配給任務(wù)了.**注意:1、任務(wù)堆棧必須聲明為OS_STK類型;*2、在任務(wù)中必須進(jìn)行uC/OS提供的下述過程之一:延時(shí)等待、任務(wù)掛起、等待事件發(fā)生(等待*信號(hào)量,消息郵箱、消息隊(duì)列),以使其他任務(wù)得到CPU;*3、用戶程序中不能使用優(yōu)先級(jí)0,1,2,3,以及OS_LOWEST_PRIO-3,OS_LOWEST_PRIO-2,*OS_LOWEST_PRIO-1,OS_LOWEST_PRIO。這些優(yōu)先級(jí)μC/OS系統(tǒng)保留,其余56個(gè)優(yōu)先級(jí)提供給*應(yīng)用程序.**************************************************************************************************//*$PAGE*/#ifOS_TASK_CREATE_EXT_EN>0//允許生成OSTaskCreateExt()函數(shù)INT8UOSTaskCreateExt(void(*task)(void*pd),//建立擴(kuò)展任務(wù)(任務(wù)代碼指針void*pdata,//傳遞參數(shù)指針OS_STK*ptos,//分配任務(wù)堆棧棧頂指針I(yè)NT8Uprio,//分配任務(wù)優(yōu)先級(jí)5H:\SOURCE中文源代碼\OS_TASK.CINT16Uid,//(未來的)優(yōu)先級(jí)標(biāo)識(shí)(與優(yōu)先級(jí)相同)OS_STK*pbos,//分配任務(wù)堆棧棧底指針I(yè)NT32Ustk_size,//指定堆棧的容量(檢驗(yàn)用)void*pext,//指向用戶附加的數(shù)據(jù)域的指針I(yè)NT16Uopt)//建立任務(wù)設(shè)定選項(xiàng)){#ifOS_CRITICAL_METHOD==3//中斷函數(shù)被設(shè)定為模式3OS_CPU_SRcpu_sr;#endifOS_STK*psp;//初始化任務(wù)堆棧指針變量,返回新的棧頂指針I(yè)NT8Uerr;//定義(獲得并定義初始化任務(wù)控制塊)是否成功#ifOS_ARG_CHK_EN>0//所有參數(shù)必須在指定的參數(shù)內(nèi)if(prio>OS_LOWEST_PRIO){//檢查任務(wù)優(yōu)先級(jí)是否合法return(OS_PRIO_INVALID);//參數(shù)指定的優(yōu)先級(jí)大于OS_LOWEST_PRIO}#endifOS_ENTER_CRITICAL();//關(guān)閉中斷if(OSTCBPrioTbl[prio]==(OS_TCB*)0){//確認(rèn)優(yōu)先級(jí)未被使用,即就緒態(tài)為0OSTCBPrioTbl[prio]=(OS_TCB*)1;//保留這個(gè)優(yōu)先級(jí),將就緒態(tài)設(shè)為0OS_EXIT_CRITICAL();//打開中斷//以下兩為1堆棧才能清0if(((opt&OS_TASK_OPT_STK_CHK)!=0x0000)||//檢驗(yàn)任務(wù)堆棧,CHK=1((opt&OS_TASK_OPT_STK_CLR)!=0x0000)){//任務(wù)建立時(shí)是否清0,CLR=1#ifOS_STK_GROWTH==1//堆棧生長(zhǎng)方向(void)memset(pbos,0,stk_size*sizeof(OS_STK));//從下向上遞增#else(void)memset(ptos,0,stk_size*sizeof(OS_STK));//從上向下遞減#endif}psp=(OS_STK*)OSTaskStkInit(task,pdata,ptos,opt);//初始化任務(wù)堆棧err=OS_TCBInit(prio,psp,pbos,id,stk_size,pext,opt);//獲得并初始化任務(wù)控制塊if(err==OS_NO_ERR){//任務(wù)控制初始化成功OS_ENTER_CRITICAL();//關(guān)閉中斷OSTaskCtr++;//任務(wù)計(jì)數(shù)器加1OS_EXIT_CRITICAL();//打開中斷if(OSRunning==TRUE){//檢查是否有(某個(gè))任務(wù)在運(yùn)行OS_Sched();//任務(wù)調(diào)度,最高任務(wù)優(yōu)先級(jí)運(yùn)行}}else{//否則,任務(wù)初始化失敗OS_ENTER_CRITICAL();//關(guān)閉中斷OSTCBPrioTbl[prio]=(OS_TCB*)0;//放棄任務(wù),設(shè)此任務(wù)就緒態(tài)為0OS_EXIT_CRITICAL();//打開中斷}return(err);//返回(獲得并定義初始化任務(wù)控制塊是否成功)}OS_EXIT_CRITICAL();//打開中斷return(OS_PRIO_EXIST);//具有該優(yōu)先級(jí)的任務(wù)已經(jīng)存在}#endif/*$PAGE*//***************************************************************************************************刪除一個(gè)指定優(yōu)先級(jí)的任務(wù)(DELETEATASK)**描述:刪除一個(gè)指定優(yōu)先級(jí)的任務(wù)。任務(wù)可以傳遞自己的優(yōu)先級(jí)給OSTaskDel(),從而刪除自身.如果任*務(wù)不知道自己的優(yōu)先級(jí),還可以傳遞參數(shù)OS_PRIO_SELF.被刪除的任務(wù)將回到休眠狀態(tài).任務(wù)被刪*除后可以用函數(shù)OSTaskCreate()或OSTaskCreateExt()重新建立.**參數(shù):prio為指定要?jiǎng)h除任務(wù)的優(yōu)先級(jí),也可以用參數(shù)OS_PRIO_SELF代替,此時(shí),下一個(gè)優(yōu)先級(jí)最高*的就緒任務(wù)將開始運(yùn)行。**返回:OS_NO_ERR:函數(shù)調(diào)用成功;*OS_TASK_DEL_IDLE:錯(cuò)誤操作,試圖刪除空閑任務(wù)(Idletask);*OS_TASK_DEL_ERR:錯(cuò)誤操作,指定要?jiǎng)h除的任務(wù)不存在;*OS_PRIO_INVALID:參數(shù)指定的優(yōu)先級(jí)大于OS_LOWEST_PRIO;*OS_TASK_DEL_ISR:錯(cuò)誤操作,試圖在中斷處理程序中刪除任務(wù).***注意:1、OSTaskDel()將判斷用戶是否試圖刪除uC/OS中的空閑任務(wù)(Idletask);*2、在刪除占用系統(tǒng)資源的任務(wù)時(shí)要小心,此時(shí),為安全起見可以用另一個(gè)函數(shù)OSTaskDelReq().**************************************************************************************************/6H:\SOURCE中文源代碼\OS_TASK.C/*$PAGE*/#ifOS_TASK_DEL_EN>0//允許生成OSTaskDel()函數(shù)INT8UOSTaskDel(INT8Uprio)//刪除任務(wù)(任務(wù)的優(yōu)先級(jí)){#ifOS_CRITICAL_METHOD==3//中斷函數(shù)被設(shè)定為模式3OS_CPU_SRcpu_sr;#endif#ifOS_EVENT_EN>0//消息事件是否>0OS_EVENT*pevent;//定義事件指針#endif//版本是否>2.51并且允許產(chǎn)生事件標(biāo)志相關(guān)代碼并且應(yīng)用中最多事件標(biāo)志組的數(shù)目>0#if(OS_VERSION>=251)&&(OS_FLAG_EN>0)&&(OS_MAX_FLAGS>0)OS_FLAG_NODE*pnode;//定義標(biāo)志節(jié)點(diǎn)#endifOS_TCB*ptcb;//定義消息事件的任務(wù)控制塊指針if(OSIntNesting>0){//當(dāng)前中斷嵌套>0時(shí),表示還有中斷程序運(yùn)行return(OS_TASK_DEL_ISR);//錯(cuò)誤操作,試圖在中斷處理程序中刪除任務(wù)}#ifOS_ARG_CHK_EN>0//所有參數(shù)必須在指定的參數(shù)內(nèi)if(prio==OS_IDLE_PRIO){//檢查任務(wù)優(yōu)先級(jí)是否是空閑任務(wù)return(OS_TASK_DEL_IDLE);//錯(cuò)誤操作,試圖刪除空閑任務(wù)(Idletask)}//當(dāng)任務(wù)>=最低優(yōu)先級(jí)并且任務(wù)不是本身if(prio>=OS_LOWEST_PRIO&&prio!=OS_PRIO_SELF){//檢查任務(wù)是否是合法的return(OS_PRIO_INVALID);//參數(shù)指定的優(yōu)先級(jí)大于OS_LOWEST_PRIO}#endifOS_ENTER_CRITICAL();//關(guān)閉中斷if(prio==OS_PRIO_SELF){//檢查的刪除者是否是任務(wù)(優(yōu)先級(jí))本身prio=OSTCBCur->OSTCBPrio;//正在運(yùn)行的優(yōu)先級(jí)(任務(wù)本身的優(yōu)先級(jí))}//刪除的任務(wù)必須存在if((ptcb=OSTCBPrioTbl[prio])!=(OS_TCB*)0){//調(diào)用這個(gè)任務(wù)的優(yōu)先級(jí)的就緒值if((OSRdyTbl[ptcb->OSTCBY]&=~ptcb->OSTCBBitX)==0x00){//當(dāng)就緒=1(即就緒狀態(tài))OSRdyGrp&=~ptcb->OSTCBBitY;//該任務(wù)處于就緒值,從就緒表中去除}#ifOS_EVENT_EN>0//消息事件是否>0pevent=ptcb->OSTCBEventPtr;//拾取該任務(wù)的事件控制指針if(pevent!=(OS_EVENT*)0){//指向事件控制塊的指針是否為Nullif((pevent->OSEventTbl[ptcb->OSTCBY]&=~ptcb->OSTCBBitX)==0){//事件(消息)在等待表中將自己所處的表中刪除pevent->OSEventGrp&=~ptcb->OSTCBBitY;}}#endif//版本是否>2.51并且允許產(chǎn)生事件標(biāo)志相關(guān)代碼并且應(yīng)用中最多事件標(biāo)志組的數(shù)目>0#if(OS_VERSION>=251)&&(OS_FLAG_EN>0)&&(OS_MAX_FLAGS>0)pnode=ptcb->OSTCBFlagNode;//標(biāo)志節(jié)點(diǎn)=指向事件標(biāo)志節(jié)點(diǎn)的指針if(pnode!=(OS_FLAG_NODE*)0){//如果任務(wù)處于事件標(biāo)志的等待表中OS_FlagUnlink(pnode);//就從此表中刪除}#endifptcb->OSTCBDly=0;//將任務(wù)時(shí)鐘節(jié)拍清0,確保重新開中斷,中斷程序不使該任務(wù)就緒ptcb->OSTCBStat=OS_STAT_RDY;//將任務(wù)的狀態(tài)字處于完畢狀態(tài)if(OSLockNesting<255){//如果鎖定嵌套計(jì)數(shù)器<255,OSLockNesting++;//鎖定嵌套計(jì)數(shù)器加1,使這個(gè)任務(wù)處于休眠狀態(tài)}OS_EXIT_CRITICAL();//打開中斷OS_Dummy();//增加一個(gè)空指令OS_ENTER_CRITICAL();//關(guān)閉中斷if(OSLockNesting>0){//(可以繼續(xù)執(zhí)行刪除任務(wù)的操作了)OSLockNesting--;//重新關(guān)閉中斷后,可以通過鎖定嵌套計(jì)數(shù)器減1,重新允許任務(wù)調(diào)度}OSTaskDelHook(ptcb);//可在鉤子程序中加入自定程序OSTaskCtr--;//任務(wù)計(jì)數(shù)器減1,ucos管理的任務(wù)減少一個(gè)OSTCBPrioTbl[prio]=(OS_TCB*)0;//將被刪除的任務(wù)控制塊OS_TCB指針=Null,//從任務(wù)優(yōu)先級(jí)中把OS_TCB刪除if(ptcb->OSTCBPrev==(OS_TCB*)0){//任務(wù)塊雙向鏈接表的前鏈接是否Nullptcb->OSTCBNext->OSTCBPrev=(OS_TCB*)0;//刪除該任務(wù)的任務(wù)控制塊OS_TCBOSTCBList=ptcb->OSTCBNext;//鏈接表指向后一個(gè)鏈接}else{//否則ptcb->OSTCBPrev->OSTCBNext=ptcb->OSTCBNext;//?ptcb->OSTCBNext->OSTCBPrev=ptcb->OSTCBPrev;//?7H:\SOURCE中文源代碼\OS_TASK.C}//OSTCBPrev:用于任務(wù)塊雙向鏈接表的前鏈接//OSTCBNext:用于任務(wù)塊雙向鏈接表的后鏈接//OSTCBFreeList:空任務(wù)控制塊指針ptcb->OSTCBNext=OSTCBFreeList;//被刪除的任務(wù)控制塊OS_TCB被退回到空閑OS_TCB表中OSTCBFreeList=ptcb;//以供建立其它任務(wù)使用OS_EXIT_CRITICAL();//打開中斷OS_Sched();//任務(wù)調(diào)度,最高任務(wù)優(yōu)先級(jí)運(yùn)行return(OS_NO_ERR);//函數(shù)調(diào)用成功}OS_EXIT_CRITICAL();//打開中斷return(OS_TASK_DEL_ERR);//錯(cuò)誤操作,指定要?jiǎng)h除的任務(wù)不存在}#endif/*$PAGE*//***************************************************************************************************請(qǐng)求一個(gè)任務(wù)刪除其它任務(wù)或自身(REQUESTTHATATASKDELETEITSELF)**描述:請(qǐng)求一個(gè)任務(wù)刪除自身。通常OSTaskDelReq()用于刪除一個(gè)占有系統(tǒng)資源的任務(wù)(例如任務(wù)建立*了信號(hào)量)對(duì)于此類任務(wù),在刪除任務(wù)之前應(yīng)當(dāng)先釋放任務(wù)占用的系統(tǒng)資源。*具體的做法是:在需要被刪除的任務(wù)中調(diào)用OSTaskDelReq()檢測(cè)是否有其他任務(wù)的刪除請(qǐng)求,如*果有,則釋放自身占用的資源,然后調(diào)用OSTaskDel()刪除自身。例如,假設(shè)任務(wù)5要?jiǎng)h除任務(wù)10,*而任務(wù)10占有系統(tǒng)資源,此時(shí)任務(wù)5不能直接調(diào)用OSTaskDel(10)刪除任務(wù)10,而應(yīng)該調(diào)用*OSTaskDelReq(10)向任務(wù)10發(fā)送刪除請(qǐng)求.在任務(wù)10中調(diào)用OSTaskDelReq(OS_PRIO_SELF),并檢測(cè)*返回值。如果返回OS_TASK_DEL_REQ,則表明有來自其他任務(wù)的刪除請(qǐng)求,此時(shí)任務(wù)10應(yīng)該先釋放*資源,然后調(diào)用OSTaskDel(OS_PRIO_SELF)刪除自己。任務(wù)5可以循環(huán)調(diào)用OSTaskDelReq(10)并檢*測(cè)返回值,如果返回OS_TASK_NOT_EXIST,表明任務(wù)10已經(jīng)成功刪除。*voidTask(void*data)*{*...*...*while(1){*OSTimeDly(1);*if(OSTaskDelReq(OS_PRIO_SELF)==OS_TASK_DEL_REQ)*{*釋放任務(wù)占用的系統(tǒng)資源;*釋放動(dòng)態(tài)分配的內(nèi)存;*OSTaskDel(OS_PRIO_SELF);*}*}*}*參數(shù):prio為要求刪除任務(wù)的優(yōu)先級(jí)。如果參數(shù)為OS_PRIO_SELF,則表示調(diào)用函數(shù)的任務(wù)正在查詢*是否有來自其他任務(wù)的刪除請(qǐng)求。**返回:OS_NO_ERR:刪除請(qǐng)求已經(jīng)被任務(wù)記錄;*OS_TASK_NOT_EXIST:指定的任務(wù)不存在,發(fā)送刪除請(qǐng)求的任務(wù)可以等待此返回值,看刪除是否成功;*OS_TASK_DEL_IDLE:錯(cuò)誤操作,試圖刪除空閑任務(wù)(Idletask);*OS_PRIO_INVALID:參數(shù)指定的優(yōu)先級(jí)大于OS_LOWEST_PRIO或沒有設(shè)定OS_PRIO_SELF的值;*OS_TASK_DEL_REQ:當(dāng)前任務(wù)收到來自其他任務(wù)的刪除請(qǐng)求;*注意:OSTaskDelReq()將判斷用戶是否試圖刪除uC/OS中的空閑任務(wù)(Idletask)。**************************************************************************************************//*$PAGE*/#ifOS_TASK_DEL_EN>0//允許生成OSTaskDel()函數(shù)INT8UOSTaskDelReq(INT8Uprio)//請(qǐng)求一個(gè)任務(wù)刪除其它任務(wù)或自身?(任務(wù)的優(yōu)先級(jí)){#ifOS_CRITICAL_METHOD==3//中斷函數(shù)被設(shè)定為模式3OS_CPU_SRcpu_sr;#endifBOOLEANstat;//定義(布爾)任務(wù)標(biāo)志返回值INT8Uerr;//定義函數(shù)成功刪除或其它任務(wù)正在申請(qǐng)刪除OS_TCB*ptcb;//定義消息事件的任務(wù)控制塊指針#ifOS_ARG_CHK_EN>0//所有參數(shù)必須在指定的參數(shù)內(nèi)if(prio==OS_IDLE_PRIO){//檢查任務(wù)優(yōu)先級(jí)是否是空閑任務(wù)return(OS_TASK_DEL_IDLE);//錯(cuò)誤操作,試圖刪除空閑任務(wù)(Idletask)}//當(dāng)任務(wù)>=最低優(yōu)先級(jí)并且任務(wù)不是本身if(prio>=OS_LOWEST_PRIO&&prio!=OS_PRIO_SELF){//檢查任務(wù)是否是合法的return(OS_PRIO_INVALID);//參數(shù)指定的優(yōu)先級(jí)大于OS_LOWEST_PRIO}#endifif(prio==OS_PRIO_SELF){//如果刪除者是任務(wù)本身OS_ENTER_CRITICAL();//關(guān)閉中斷stat=OSTCBCur->OSTCBDelReq;//stat:存儲(chǔ)在任務(wù)控制塊中的標(biāo)志值OS_EXIT_CRITICAL();//打開中斷8H:\SOURCE中文源代碼\OS_TASK.Creturn(stat);//返回任務(wù)標(biāo)志值}OS_ENTER_CRITICAL();//關(guān)閉中斷if((ptcb=OSTCBPrioTbl[prio])!=(OS_TCB*)0){//調(diào)用這個(gè)任務(wù)的優(yōu)先級(jí)的就緒值ptcb->OSTCBDelReq=OS_TASK_DEL_REQ;//當(dāng)前任務(wù)收到來自其他任務(wù)的刪除請(qǐng)求err=OS_NO_ERR;//刪除請(qǐng)求已經(jīng)被任務(wù)記錄}else{//否則err=OS_TASK_NOT_EXIST;//該任務(wù)可能已經(jīng)刪除了}//指定的任務(wù)不存在,發(fā)送刪除請(qǐng)求的任務(wù)可以等待此返回值,看刪除是否成功OS_EXIT_CRITICAL();//關(guān)閉中斷return(err);//返回刪除情況標(biāo)志}#endif/*$PAGE*//***************************************************************************************************喚醒一個(gè)用OSTaskSuspend()函數(shù)掛起的任務(wù)(RESUMEASUSPENDEDTASK)**描述:喚醒一個(gè)用OSTaskSuspend()函數(shù)掛起的任務(wù)。OSTaskResume()也是唯一能"解掛"掛起任務(wù)的函數(shù)。**參數(shù):prio指定要喚醒任務(wù)的優(yōu)先級(jí)。**返回:OS_NO_ERR:函數(shù)調(diào)用成功;*OS_TASK_RESUME_PRIO:要喚醒的任務(wù)不存在;*OS_TASK_NOT_SUSPENDED:要喚醒的任務(wù)不在掛起狀態(tài);*OS_PRIO_INVALID:參數(shù)指定的優(yōu)先級(jí)大于或等于OS_LOWEST_PRIO。**************************************************************************************************/#ifOS_TASK_SUSPEND_EN>0//允許生成OSTaskDel()函數(shù)INT8UOSTaskResume(INT8Uprio)//喚醒一個(gè)用OSTaskSuspend()函數(shù)掛起的任務(wù)(任務(wù)的優(yōu)先級(jí)){#ifOS_CRITICAL_METHOD==3//中斷函數(shù)被設(shè)定為模式3OS_CPU_SRcpu_sr;#endifOS_TCB*ptcb;//定義消息事件的任務(wù)控制塊指針#ifOS_ARG_CHK_EN>0//所有參數(shù)必須在指定的參數(shù)內(nèi)if(prio>=OS_LOWEST_PRIO){//當(dāng)任務(wù)>=最低優(yōu)先級(jí)return(OS_PRIO_INVALID);//返回(要喚醒的任務(wù)不存在)}#endifOS_ENTER_CRITICAL();//關(guān)閉中斷if((ptcb=OSTCBPrioTbl[prio])==(OS_TCB*)0){//調(diào)用這個(gè)任務(wù)的優(yōu)先級(jí)的就緒值OS_EXIT_CRITICAL();//打開中斷return(OS_TASK_RESUME_PRIO);//返回(要喚醒的任務(wù)不存在)}//任務(wù)控制塊狀態(tài)字相與OS_STAT_SUSPEND為1,任務(wù)存在if((ptcb->OSTCBStat&OS_STAT_SUSPEND)!=0x00){//要恢復(fù)的任務(wù)必須是存在的//通過清除OSTCBStat域中的OS_STAT_SUSPEND未而取消掛起//要使任務(wù)處于就緒狀態(tài),OSTCBDly必須是0,這是因?yàn)樵贠STCBStat中,沒有任何標(biāo)志表明任務(wù)正在//等待延時(shí)事件到if(((ptcb->OSTCBStat&=~OS_STAT_SUSPEND)==OS_STAT_RDY)&&(ptcb->OSTCBDly==0)){//只有以上兩個(gè)條件滿足,任務(wù)才能處于就緒態(tài)OSRdyGrp|=ptcb->OSTCBBitY;//保存任務(wù)就緒標(biāo)準(zhǔn)0-7到OSRdyGrpOSRdyTbl[ptcb->OSTCBY]|=ptcb->OSTCBBitX;//保存任務(wù)優(yōu)先級(jí)別0-7到OSRdyTbl[]OS_EXIT_CRITICAL();//打開中斷OS_Sched();//任務(wù)調(diào)度,最高任務(wù)優(yōu)先級(jí)運(yùn)行}else{//否則OS_EXIT_CRITICAL();

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論