uCOS-II實驗報告.doc_第1頁
uCOS-II實驗報告.doc_第2頁
uCOS-II實驗報告.doc_第3頁
uCOS-II實驗報告.doc_第4頁
uCOS-II實驗報告.doc_第5頁
已閱讀5頁,還剩17頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

實驗一 ARM開發(fā)環(huán)境實驗 一、實驗目的:1. 學會如何利用ADT IDE軟件建立工程和編譯程序2. 學會如何下載和調試程序二、實驗步驟:1. 啟動ADT IDE軟件,新建工程leddemo2. 新建leddemo.c文件并編輯代碼如下:#define U8 unsigned charunsigned char seg7table16 = /* 0 1 2 3 4 5 6 7*/ 0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, /* 8 9 A B C D E F*/ 0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e,;void Delay(int time);/*/* 函數說明: JXARM9-2410 7段構共陽數碼管測試 */* 功能描述: 依次在7段數碼管上顯示0123456789ABCDEF */* 返回代碼: 無 */* 參數說明: 無 */*/void Test_Seg7(void) int i; *(U8*) 0x10000006) = 0x00; for( ; ; )/* 數碼管從0到F依次將字符顯示出來 */ for(i=0;i=0x0;i-) /* 查表并輸出數據 */ *(U8*) 0x10000004) = seg7tablei; Delay (100000); /*/* Function name : 循環(huán)延時子程序 */* Description : 循環(huán) time 次 */* Return type :void */* Argument : 循環(huán)延時計數器 */*/void Delay(int time) int i;int delayLoopCount=1000; for(;time0;time-);for(i=0;iRemote Disconnect,將實驗箱上電,連接JTAG接口,點擊Debug-Dowlond下載調試 實驗二 uC/OS-II任務間通訊和同步實驗一、實驗目的1、掌握uC/OS-II操作系統(tǒng)下使用信號量解決任務之間的同步問題;2、掌握uC/OS-II操作系統(tǒng)下任務間通訊的方法。 二、實驗內容1、使用信號量實現任務間同步(Eg2工程)2、使用郵箱實現任務之間的通訊(Eg3工程)三、基礎知識uC/OS-II任務之間的通訊與同步方式:1、利用宏OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()來關閉中斷和打開中斷2、利用函數OSSchedLock()和OSSchekUnlock()對C/OS-II中的任務調度函數上鎖和開鎖3、信號量4、郵箱5、隊列(1)uC/OS-II中使用信號量進行任務之間同步:1、通過調用OSSemCreate()建立信號量2、通過調用OSSemPost()函數發(fā)送一個信號量3、通過調用OSSemPend()函數等待一個信號量OSSemCreate:1、Sem1 = OSSemCreate(0); 2、參數為信號量的初始計數值賦值。該初始值為0到65,535之間的一個數。 3、如果信號量是用來表示一個或者多個事件的發(fā)生,那么該信號量的初始值應設為0。4、如果信號量是用于對共享資源的訪問,那么該信號量的初始值應設為1(例如,把它當作二值信號量使用)。5、如果該信號量是用來表示允許任務訪問n個相同的資源,那么該初始值顯然應該是n,并把該信號量作為一個可計數的信號量使用。 OSSemPost和OSSemPend:1、如果信號量當前是可用的(信號量的計數值大于0),將信號量的計數值減1,然后函數將“無錯”錯誤代碼返回給它的調用函數。如果信號量的計數值為0,而OSSemPend()函數又不是由中斷服務子程序調用的,則調用OSSemPend()函數的任務要進入睡眠狀態(tài),等待另一個任務(或者中斷服務子程序)發(fā)出該信號量。兩個任務之間的同步的實現:1、創(chuàng)建兩個信號量Sem1和Sem2,信號量Sem2初始為可用狀態(tài),而信號量Sem1初始為不可用狀態(tài)。 Sem1 = OSSemCreate(0);Sem2 = OSSemCreate(1);TaskLED:void TaskLED(void *Id) INT8U Reply; for (;) OSSemPend(Sem2, 0, &Reply);/* wait for the semaphore */ OSSemPost(Sem1);/* signal the semaphore */ OSTimeDly(200);/* wait a short while */ TaskSEG:void TaskSEG(void *Id) INT8U Reply; for (;) OSSemPend(Sem1, 0, &Reply);/* wait for the semaphore */ OSSemPost(Sem2);/* signal the semaphore */ OSTimeDly(100);/* wait a short while */ 兩個任務之間的同步的實現:1、任務TaskLED必須等待Sem2可用才能夠繼續(xù)往下運行,而Sem2在TaskSEG中發(fā)送。2、TaskSEG必須等待Sem1可用才能夠繼續(xù)往下運行,而Sem1在TaskLED中發(fā)送,這樣就實現了程序中“”之間代碼的順序執(zhí)行,而不受OSTimeDly的延時值的影響。(2)uC/OS-II中使用郵箱實現任務之間的通訊:1、郵箱可使一個任務或者中斷服務子程序向另一個任務發(fā)送一個指針型的變量2、通過調用OSMboxCreate()函數來創(chuàng)建郵箱,并指定指針的初始值3、如果用戶用郵箱來共享某些資源,那么就要初始化該郵箱為一個非NULL的指針4、通過OSMboxPost()函數發(fā)送一個消息到郵箱5、通過OSMboxPend()函數等待一個郵箱中的消息,如果郵箱中沒有可用的消息,OSMboxPend()的調用任務就被掛起,直到郵箱中有了消息或者等待超時。TaskLED:void TaskLED(void *Id)char*Msg;INT8Uerr;for (;) /* wait for a message from the input mailbox */Msg = (char *)OSMboxPend(Mbox1, 0, &err);uHALr_printf(Msg);/* print tasks id */TaskSEG :void TaskSEG(void *Id)charMsg100;INT8Uerr;int nCount = 0;for (;) /* post the input message to the output mailbox */sprintf(Msg, TaskSEG %d, nCount+);OSMboxPost(Mbox1, Msg);OSTimeDly(100);上面的代碼每100個時鐘節(jié)拍(1 S)從TaskSEG中發(fā)送一個字符串,在TaskLED中接收并打印出來 四、實驗步驟實驗A:1、觀看“實驗二A.avi”視頻文件2、打開實驗二A模板工程3、編輯Eg2.c,在TaskLED中打印字符串“TaskLED”,在TaskSEG中打印字符串“TaskSEG”,并使用信號量實現這兩個字符串打印動作的順序執(zhí)行。編輯代碼如下:#includeIncludes.h #include option.h#include 2410lib.h#include uhal.h/* 任務棧 */OS_STK StackLEDSTACKSIZE= 0, ; / 任務LED任務棧OS_STK StackSEGSTACKSIZE= 0, ; / 任務SEG任務棧/* 任務ID */char IdLED = 1; / 任務LED IDchar IdSEG = 2; / 任務SEG ID/* 任務處理函數 */void TaskLED(void *Id); / 任務LED任務處理函數void TaskSEG(void *Id); / 任務SEG任務處理函數/* 信號量 */OS_EVENT *Sem1; / 信號量Sem1OS_EVENT *Sem2; / 信號量Sem2/* * 跑馬燈閃爍函數,調用一次,四個跑馬燈由亮變滅或者由滅變亮 */void User_LED_Blink(void)static int led_status = 0;led_status += 1;if(led_status % 2 = 0)Led_Display(0x0f);elseLed_Display(0x00);/* * 數碼管顯示實驗,由0到F依次顯示 */void User_SEG_Blink(void)static unsigned char seg_value = 0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e ; static int seg_status = 0;*(unsigned char *)0x10000006) = 0x3e;*(unsigned char *)0x10000004) = seg_valueseg_status;seg_status += 1;if(seg_status 15)seg_status = 0;/* * 任務LED任務處理函數 * 1、OSStart調用之前創(chuàng)建的最高優(yōu)先級任務,在該函數重啟動時鐘節(jié)拍定時器 * 2、等待信號量Sem2并閃爍跑馬燈,然后釋放信號量Sem1,并延遲2S */void TaskLED(void *Id) INT8U Reply; /* 啟動時鐘節(jié)拍定時器,開始多任務調度 */ ARMTargetStart(); for (;) /* 等待信號量Sem2 */OSSemPend(Sem2,0,&Reply);/* * 調用User_LED_Blink函數閃爍跑馬燈,并打印TaskLED到串口 * 此部分代碼為需要與另外一個任務同步的代碼 */uHALr_printf(); User_LED_Blink(); uHALr_printf(TaskLED); OSSemPost(Sem1); /* 釋放信號量Sem1 */OSTimeDly(20); /* * 任務SEG任務處理函數 * 1、每隔100 ticks即1000ms,閃爍數碼管 * 2、等待信號量Sem1并閃爍數碼管,然后釋放信號量Sem2,并延遲1S */void TaskSEG(void *Id) INT8U Reply; for (;) /* 等待信號量Sem1 */ OSSemPend(Sem1, 0, &Reply);/* * 調用User_SEG_Blink函數閃爍數碼管,并打印TaskSEG到串口 * 此部分代碼為需要與另外一個任務同步的代碼 */ uHALr_printf(); User_SEG_Blink(); uHALr_printf(TaskSEG); OSSemPost(Sem2); /* 釋放信號量Sem2 */ /* 延遲1000ms */OSTimeDly(10); /* * Main函數. * 1、初始化目標系統(tǒng),初始化硬件定時器等,與操作系統(tǒng)無關 * 2、調用OSInit初始化uC/OS-II軟件數據結構等,必須在打開時鐘節(jié)拍中斷之前調用 * 3、創(chuàng)建兩個信號量,Sem1和Sem2 * 4、創(chuàng)建兩個任務,TaskLED和TaskSEG,TaskLED的優(yōu)先級為5,TaskSEG的優(yōu)先級為13,TaskLED的優(yōu)先級高于TaskSEG * 5、調用OSStart啟動uC/OS-II */void Main(void) /* * 目標系統(tǒng)初始化 */ARMTargetInit(); /* * uC/OS-II軟件初始化 */OSInit(); /* * 創(chuàng)建兩個信號量,Sem1和Sem2,Sem1的初始值為0,Sem2的初始值為1,即Sem2缺省是處于釋放狀態(tài) */ Sem1 = OSSemCreate(0); Sem2 = OSSemCreate(1); /* * 創(chuàng)建兩個任務,TaskLED和TaskSEG,TaskLED的優(yōu)先級為5,TaskSEG的優(yōu)先級為13,TaskLED的優(yōu)先級高于TaskSEG */OSTaskCreate(TaskLED, (void *)&IdLED, (OS_STK *)&StackLEDSTACKSIZE - 1, 5);OSTaskCreate(TaskSEG, (void *)&IdSEG, (OS_STK *)&StackSEGSTACKSIZE - 1, 13); /* * 啟動多任務調度 */ OSStart(); /* * 正常情況下,永遠不會執(zhí)行到這里 */return; 4. 編譯工程Eg2,如果出錯,進行修改后再編譯。5、將Eg2下載并運行,觀察結果。6、修改代碼,在TaskLED和TaskSEG中添加不同的延時,觀察結果。7、去掉TaskLED和TaskSEG中的信號量操作,并修改延時值,觀察結果。實驗B:1、觀看“實驗二B.avi”視頻文件2、打開實驗二B模板工程3、編輯Eg3.c,在TaskSEG中申明一個int型變量nCount,并設置初始值為0,每隔100個時鐘節(jié)拍累加一次nCount,并向郵箱中發(fā)送nCount的值,編輯代碼如下:#includeIncludes.h /* uC/OS interface */#include option.h#include 2410lib.h#include uhal.h/* 任務棧 */OS_STK StackLEDSTACKSIZE= 0, ; / 任務LED任務棧OS_STK StackSEGSTACKSIZE= 0, ; / 任務SEG任務棧/* 任務ID */char IdLED = 1; / 任務LED IDchar IdSEG = 2; / 任務SEG ID/* 任務處理函數 */void TaskLED(void *Id); / 任務LED任務處理函數void TaskSEG(void *Id); / 任務SEG任務處理函數/* 郵箱 */OS_EVENT *Mbox1;/* * 跑馬燈閃爍函數,調用一次,四個跑馬燈由亮變滅或者由滅變亮 */void User_LED_Blink(void)static int led_status = 0;led_status += 1;if(led_status % 2 = 0)Led_Display(0x0f);elseLed_Display(0x00);/* * 數碼管顯示實驗,由0到F依次顯示 */void User_SEG_Blink(void)static unsigned char seg_value = 0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e ; static int seg_status = 0;*(unsigned char *)0x10000006) = 0x3e;*(unsigned char *)0x10000004) = seg_valueseg_status;seg_status += 1;if(seg_status 15)seg_status = 0;/* * 任務LED任務處理函數 * 1、OSStart調用之前創(chuàng)建的最高優(yōu)先級任務,在該函數重啟動時鐘節(jié)拍定時器 * 2、等待郵箱中的消息,并打印出來 */void TaskLED(void *Id)char*Msg;INT8Uerr; /* 啟動時鐘節(jié)拍定時器,開始多任務調度 */ ARMTargetStart(); for (;) /* 等待郵箱中的消息,如果沒有消息則掛起該任務 */Msg = (char *)OSMboxPend(Mbox1, 0, &err);/* 打印接受到的消息 */uHALr_printf(Msg);/* * 任務SEG任務處理函數 * 1、每隔100 ticks即1000ms,閃爍數碼管 * 2、每隔100 ticks即1000ms,向郵箱發(fā)送一個字符串數據 */void TaskSEG(void *Id)charMsg100;INT8Uerr;int nCount = 0;for (;) /* 發(fā)送數據到郵箱 */ sprintf(Msg, TaskSEG %d, nCount+);OSMboxPost(Mbox1, Msg);/* 閃爍數碼管 */User_SEG_Blink(); /* 延遲1000ms */OSTimeDly(100);/* * Main函數. * 1、初始化目標系統(tǒng),初始化硬件定時器等,與操作系統(tǒng)無關 * 2、調用OSInit初始化uC/OS-II軟件數據結構等,必須在打開時鐘節(jié)拍中斷之前調用 * 3、創(chuàng)建一個郵箱 * 4、創(chuàng)建兩個任務,TaskLED和TaskSEG,TaskLED的優(yōu)先級為5,TaskSEG的優(yōu)先級為13,TaskLED的優(yōu)先級高于TaskSEG * 5、調用OSStart啟動uC/OS-II */void Main(void) /* * 目標系統(tǒng)初始化 */ARMTargetInit(); /* * uC/OS-II軟件初始化 */OSInit();/* * 創(chuàng)建一個郵箱 */Mbox1 = OSMboxCreate(void *)0); /* * 創(chuàng)建兩個任務,TaskLED和TaskSEG,TaskLED的優(yōu)先級為5,TaskSEG的優(yōu)先級為13,TaskLED的優(yōu)先級高于TaskSEG */OSTaskCreate(TaskLED, (void *)&IdLED, (OS_STK *)&StackLEDSTACKSIZE - 1, 5);OSTaskCreate(TaskSEG, (void *)&IdSEG, (OS_STK *)&StackSEGSTACKSIZE - 1, 13); /* * 啟動多任務調度 */ OSStart(); /* * 正常情況下,永遠不會執(zhí)行到這里 */return; 4、在TaskLED中申明一個int型變量nCount,接收郵箱Mbox1的值放到nCount中,并通過串口打印出來。 5、編譯工程Eg3,如果出錯,進行修改后再編譯。6、將Eg3下載并運行,觀察結果。五、實驗現象實驗A:實驗箱上跑馬燈和數碼管顯示同時不斷交替進行串口打印結果如下:實驗B:實驗箱上跑馬燈和數碼管顯示同時不斷交替進行串口打印結果如下: 實驗三 軟件定時器實驗 一、實驗目的 擴充uC/OS-II內核,實現軟件定時器功能二、實驗內容 1、實現軟件定時器管理函數;2、在應用程序中添加軟件定時器功能(eg_timer工程)三、基礎知識軟件定時器:1、軟件定時器是許多操作系統(tǒng)提供的必備功能,它使得應用程序定時執(zhí)行某一段代碼。2、但是,在uC/OS-II的內核中沒有提供軟件定時器的功能。3、本實驗采用一種簡單的方法實現軟件定時器功能。、軟件定時器管理函數:1、在UCOS-IIIncludes.h中包含了關于軟件定時器管理的相關函數的聲明2、軟件定時器管理函數在UCOS-IIeg_tmrOS_TIMER.c文件中實現軟件定時器初始化:OSTmrInit創(chuàng)建軟件定時器:OSCreateTimer打開軟件定時器:OSEnableTimer關閉軟件定時器:OSDisableTimer刪除軟件定時器:OSDeleteTimer軟件定時器實現方法分析 :1、調用OSTmrInit函數完成定時器管理功能初始化,在該函數中將創(chuàng)建一個優(yōu)先級為4的高優(yōu)先級任務,它應該是系統(tǒng)中最高優(yōu)先級的任務,在創(chuàng)建其它任務時請使用5或者過大的優(yōu)先級數。這個任務每個時鐘節(jié)拍都將運行,在其中檢查是否有定時器就緒,如果就緒將執(zhí)行相應的定時器函數,否則將進行任務調度。2、采用這種方法實現軟件定時器有一個前提,就是定時器管理任務的優(yōu)先級應該比任何其它應用任務優(yōu)先級高,另外,這種方式實現的定時器精度有限,在本系統(tǒng)中,定時器精度小于10ms,且由于需要頻繁進行任務切換,CPU開銷較大。3、但是這種方法實現起來比較簡單,而且對于一般應用已經足夠,如果要求更高要求的定時器功能,可以考慮直接采用硬件定時器實現。創(chuàng)建定時器 :void TaskLED(void *Id) INT8U err; uHALr_printf(Task1() calledn);/* init timers */OSTmrInit();err = OSCreateTimer( &Tmr1, TmrFunc1, 1, 200, OS_TMR_ENABLE);err = OSCreateTimer( &Tmr2, TmrFunc1, 2, 200, OS_TMR_DISABLE);err = OSCreateTimer( &Tmr3, TmrFunc1, 3, 200, OS_TMR_DISABLE); for (;) OSTimeDly(100); 定時器服務函數實現:void TmrFunc1(INT8U arg) switch(arg) case 1:OSEnableTimer(Tmr2);OSDisableTimer(Tmr1);User_LED_Blink();break;case 2:OSEnableTimer(Tmr3);OSDisableTimer(Tmr2);break;case 3:OSEnableTimer(Tmr1);OSDisableTimer(Tmr3);break;四、實驗步驟1、觀看“實驗三.avi”視頻文件2、打開實驗三模板工程3、編輯Eg_Timer.c,在TaskLED中創(chuàng)建三個定時器,并在其定時器服務函數TmrFunc1中實現定時器1,關閉定時器1,打開定時器2,并閃爍跑馬燈定時器2,關閉定時器2,打開定時器3定時器3,關閉定時器3,打開定時器1 編輯原代碼如下:#includeIncludes.h #include option.h#include 2410lib.h#include uhal.h/* 任務棧 */OS_STK StackLEDSTACKSIZE= 0, ; / 任務LED任務棧OS_STK StackSEGSTACKSIZE= 0, ; / 任務SEG任務棧/* 任務ID */char IdLED = 1; / 任務LED IDchar IdSEG = 2; / 任務SEG ID/* 任務處理函數 */void TaskLED(void *Id); / 任務LED任務處理函數void TaskSEG(void *Id); / 任務SEG任務處理函數/* 定時器服務函數,三個定時器公用一個定時器服務函數 */void TmrFunc1(INT8U arg);/* 定時器1、2、3 */OS_TMR *Tmr1;OS_TMR *Tmr2;OS_TMR *Tmr3;/* * 跑馬燈閃爍函數,調用一次,四個跑馬燈由亮變滅或者由滅變亮 */void User_LED_Blink(void)static int led_status = 0;led_status += 1;if(led_status % 2 = 0)Led_Display(0x0f);elseLed_Display(0x00);/* * 數碼管顯示實驗,由0到F依次顯示 */void User_SEG_Blink(void)static unsigned char seg_value = 0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e ; static int seg_status = 0;*(unsigned char *)0x10000006) = 0x3e;*(unsigned char *)0x10000004) = seg_valueseg_status;seg_status += 1;if(seg_status 15)seg_status = 0;/* * 定時器Tmr1、Tmr2、Tmr3處理函數 * 1、根據arg參數確定定時器 * 2、三個定時器同時只打開一個,即Tmr1、Tmr2、Tmr3,三個定時器總和閃爍一次跑馬燈 */void TmrFunc1(INT8U arg)/* 根據arg參數處理不同的定時器 */switch(arg)/* 定時器1,關閉定時器1,打開定時器2 */case 1:OSEnableTimer(Tmr2);OSDisableTimer(Tmr1);User_LED_Blink();break;/* 定時器2,關閉定時器2,打開定時器3 */case 2:OSEnableTimer(Tmr3);OSDisableTimer(Tmr2);break;/* 定時器3,關閉定時器3,打開定時器1 */case 3:OSEnableTimer(Tmr1);OSDisableTimer(Tmr3);break;/* * 任務LED任務處理函數 * 1、OSStart調用之前創(chuàng)建的最高優(yōu)先級任務,在該函數重啟動時鐘節(jié)拍定時器 * 2、創(chuàng)建三個定時器,定時時間都為2秒鐘,它們使用同樣的TmrFunc1定時器服務函數,但是使用不同的參數,定時器1的初始狀態(tài)為開,其余為關 */void TaskLED(void *Id)char key_press;char led_status = 0x0; INT8U err; /* 啟動時鐘節(jié)拍定時器,開始多任務調度 */ ARMTargetStart(); uHALr_printf(Task1() calledn);/* 初始化定時器 */OSTmrInit();/* 創(chuàng)建三個定時器,定時時間都為2秒鐘,它們使用同樣的TmrFunc1定時器服務函數,但是使用不同的參數,定時器1的初始狀態(tài)為開,其余為關 */err = OSCreateTimer( &Tmr1, TmrFunc1, 1, 200, OS_TMR_ENABLE);err = OSCreateTimer( &Tmr2, TmrFunc1, 2, 200, OS_TMR_DISABLE);err = OSCreateTimer( &Tmr3, TmrFunc1, 3, 200, OS_TMR_DISABLE);/* 該任務到此完成,不斷延時 */ for (;) OSTimeDly(100); /* * 任務SEG任務處理函數 * 1、每隔100 ticks即1000ms,閃爍數碼管 */void TaskSEG(void *Id) uHALr_printf(Task2() calledn); for (;) OSSchedLock();sprintf(print_buf, Task%c() turnedn, *(char *)Id); uHALr_printf(print_buf); User_SEG_Blink(); OSSchedUnlock(); OSTimeDly(100); /* * Main函數. * 1、初始化目標系統(tǒng),初始化硬件定時器等,與操作系統(tǒng)無關 * 2、調用OSInit初始化uC/OS-II軟件數據結構等,必須在打開時鐘節(jié)拍中斷之前調用 * 3、創(chuàng)建兩個任務,TaskLED和TaskSEG,TaskLED的優(yōu)先級為5,TaskSEG的優(yōu)先級為13,TaskLED的優(yōu)先級高于TaskSEG * 4、調用OSStart啟動uC/OS-II */void Main(void) /* * 目標系統(tǒng)初始化 */ARMTargetInit(); /* * uC/OS-II軟件初始化 */OSInit(); /* * 創(chuàng)建兩個任務,TaskLED和TaskSEG,TaskLED的優(yōu)先級為5,TaskSEG的優(yōu)先級為13,TaskLED的優(yōu)先級高于TaskSEG */OSTaskCreate(TaskLED, (void *)&IdLED, (OS_STK *)&StackLEDSTACKSIZE - 1, 5);OSTaskCreate(TaskSEG, (void *)&IdSEG, (OS_STK *)&StackSEGSTACKSIZE - 1, 13); /* * 啟動多任務調度 */ OSStart(); /* * 正常情況下,永遠不會執(zhí)行到這里 */return; 4. 編譯工程Eg_Timer,如果出錯,進行修改后再編譯。5、將Eg_Timer下載并運行,觀察結果。五、實驗現象實驗現象為每6秒鐘跑馬燈閃爍一次 。串口打印結果如下:實驗四 多任務編程實驗 一、實驗目的 了解uC/OS-II中怎樣創(chuàng)建一個任務以及了解uC/OS-II的多任務調度機制二、實驗內容 1、在Eg1的基礎上新建一個任務;2、在該任務函數中打印提示信息。三、基礎知識聲明任務棧:1、 在eg1.c文件中聲明任務堆棧,任務棧以全局變量的方式靜態(tài)分配,然后在創(chuàng)建任務時使用。/* task stack */OS_STK StackLEDSTACKSIZE= 0, ;OS_STK StackSEGSTACKSIZE= 0, ;OS_STK StackTESTSTACKSIZE= 0, ;添加任務ID:/* task name string */char IdLED = 1;char IdSEG = 2;char IdTEST = 3;任務函數聲明:/* task entry function */void TaskLED(void *Id);void TaskSEG(void *Id);void TaskTEST(void *Id);任務函數實現:void TaskTEST(void *Id) uHALr_printf(Task3() calledn); for (;) OSSchedLock(); sprintf(print_buf, Task%c() turnedn, *(char *)Id); uHALr_printf(print_buf); User_SEG_Blink(); OSSchedUnlock(); OSTimeDly(100); 修改TaskSEG:void TaskSEG(void *Id) uHALr_printf(Task2() calledn); for (;) OSSchedLock(); uHALr_printf(Task%c() turnedn, *(char *)Id);/ User_SEG_Blink(); OSSchedUnlock(); OSTimeDly(100); 四、實驗步驟1、打開實驗四模板工程2、按照“基礎知識”部分內容編輯Eg1.c文件 編輯源代碼如下:#includeIncludes.h #include option.h#include 2410lib.h#include uhal.h/* 任務棧 */OS_STK StackLEDSTACKSIZE= 0, ; / 任務LED任務棧OS_STK StackSEGSTACKSIZE= 0, ; / 任務SEG任務棧OS_STK StackTESTSTACKSIZE= 0, ;/* 任務ID */char IdLED = 1; / 任務LED IDchar IdSEG = 2; / 任務SEG IDchar IdTEST = 3;/* 任務處理函數 */void TaskLED(void *Id); / 任務LED任務處理函數void TaskSEG(void *Id); / 任務SEG任務處理函數void TaskTEST(void *Id);/* * 跑馬燈閃爍函數,調用一次,四個跑馬燈由亮變滅或者由滅變亮 */void User_LED_Blink(void)static int led_status = 0;led_status += 1;if(led_status % 2 = 0)Led_Display(0x0f);elseLed_Display(0x00);/* * 數碼管顯示實驗,由0到F依次顯示 */void User_SEG_Blink(void)static unsigned char seg_value = 0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e ; static int seg

溫馨提示

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

評論

0/150

提交評論