




免費(fèi)預(yù)覽已結(jié)束,剩余17頁可下載查看
下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
實(shí)驗(yàn)一 ARM開發(fā)環(huán)境實(shí)驗(yàn) 一、實(shí)驗(yàn)?zāi)康模?. 學(xué)會(huì)如何利用ADT IDE軟件建立工程和編譯程序2. 學(xué)會(huì)如何下載和調(diào)試程序二、實(shí)驗(yàn)步驟:1. 啟動(dòng)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);/*/* 函數(shù)說明: JXARM9-2410 7段構(gòu)共陽數(shù)碼管測試 */* 功能描述: 依次在7段數(shù)碼管上顯示0123456789ABCDEF */* 返回代碼: 無 */* 參數(shù)說明: 無 */*/void Test_Seg7(void) int i; *(U8*) 0x10000006) = 0x00; for( ; ; )/* 數(shù)碼管從0到F依次將字符顯示出來 */ for(i=0;i=0x0;i-) /* 查表并輸出數(shù)據(jù) */ *(U8*) 0x10000004) = seg7tablei; Delay (100000); /*/* Function name : 循環(huán)延時(shí)子程序 */* Description : 循環(huán) time 次 */* Return type :void */* Argument : 循環(huán)延時(shí)計(jì)數(shù)器 */*/void Delay(int time) int i;int delayLoopCount=1000; for(;time0;time-);for(i=0;iRemote Disconnect,將實(shí)驗(yàn)箱上電,連接JTAG接口,點(diǎn)擊Debug-Dowlond下載調(diào)試 實(shí)驗(yàn)二 uC/OS-II任務(wù)間通訊和同步實(shí)驗(yàn)一、實(shí)驗(yàn)?zāi)康?、掌握uC/OS-II操作系統(tǒng)下使用信號量解決任務(wù)之間的同步問題;2、掌握uC/OS-II操作系統(tǒng)下任務(wù)間通訊的方法。 二、實(shí)驗(yàn)內(nèi)容1、使用信號量實(shí)現(xiàn)任務(wù)間同步(Eg2工程)2、使用郵箱實(shí)現(xiàn)任務(wù)之間的通訊(Eg3工程)三、基礎(chǔ)知識uC/OS-II任務(wù)之間的通訊與同步方式:1、利用宏OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()來關(guān)閉中斷和打開中斷2、利用函數(shù)OSSchedLock()和OSSchekUnlock()對C/OS-II中的任務(wù)調(diào)度函數(shù)上鎖和開鎖3、信號量4、郵箱5、隊(duì)列(1)uC/OS-II中使用信號量進(jìn)行任務(wù)之間同步:1、通過調(diào)用OSSemCreate()建立信號量2、通過調(diào)用OSSemPost()函數(shù)發(fā)送一個(gè)信號量3、通過調(diào)用OSSemPend()函數(shù)等待一個(gè)信號量OSSemCreate:1、Sem1 = OSSemCreate(0); 2、參數(shù)為信號量的初始計(jì)數(shù)值賦值。該初始值為0到65,535之間的一個(gè)數(shù)。 3、如果信號量是用來表示一個(gè)或者多個(gè)事件的發(fā)生,那么該信號量的初始值應(yīng)設(shè)為0。4、如果信號量是用于對共享資源的訪問,那么該信號量的初始值應(yīng)設(shè)為1(例如,把它當(dāng)作二值信號量使用)。5、如果該信號量是用來表示允許任務(wù)訪問n個(gè)相同的資源,那么該初始值顯然應(yīng)該是n,并把該信號量作為一個(gè)可計(jì)數(shù)的信號量使用。 OSSemPost和OSSemPend:1、如果信號量當(dāng)前是可用的(信號量的計(jì)數(shù)值大于0),將信號量的計(jì)數(shù)值減1,然后函數(shù)將“無錯(cuò)”錯(cuò)誤代碼返回給它的調(diào)用函數(shù)。如果信號量的計(jì)數(shù)值為0,而OSSemPend()函數(shù)又不是由中斷服務(wù)子程序調(diào)用的,則調(diào)用OSSemPend()函數(shù)的任務(wù)要進(jìn)入睡眠狀態(tài),等待另一個(gè)任務(wù)(或者中斷服務(wù)子程序)發(fā)出該信號量。兩個(gè)任務(wù)之間的同步的實(shí)現(xiàn):1、創(chuàng)建兩個(gè)信號量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 */ 兩個(gè)任務(wù)之間的同步的實(shí)現(xiàn):1、任務(wù)TaskLED必須等待Sem2可用才能夠繼續(xù)往下運(yùn)行,而Sem2在TaskSEG中發(fā)送。2、TaskSEG必須等待Sem1可用才能夠繼續(xù)往下運(yùn)行,而Sem1在TaskLED中發(fā)送,這樣就實(shí)現(xiàn)了程序中“”之間代碼的順序執(zhí)行,而不受OSTimeDly的延時(shí)值的影響。(2)uC/OS-II中使用郵箱實(shí)現(xiàn)任務(wù)之間的通訊:1、郵箱可使一個(gè)任務(wù)或者中斷服務(wù)子程序向另一個(gè)任務(wù)發(fā)送一個(gè)指針型的變量2、通過調(diào)用OSMboxCreate()函數(shù)來創(chuàng)建郵箱,并指定指針的初始值3、如果用戶用郵箱來共享某些資源,那么就要初始化該郵箱為一個(gè)非NULL的指針4、通過OSMboxPost()函數(shù)發(fā)送一個(gè)消息到郵箱5、通過OSMboxPend()函數(shù)等待一個(gè)郵箱中的消息,如果郵箱中沒有可用的消息,OSMboxPend()的調(diào)用任務(wù)就被掛起,直到郵箱中有了消息或者等待超時(shí)。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個(gè)時(shí)鐘節(jié)拍(1 S)從TaskSEG中發(fā)送一個(gè)字符串,在TaskLED中接收并打印出來 四、實(shí)驗(yàn)步驟實(shí)驗(yàn)A:1、觀看“實(shí)驗(yàn)二A.avi”視頻文件2、打開實(shí)驗(yàn)二A模板工程3、編輯Eg2.c,在TaskLED中打印字符串“TaskLED”,在TaskSEG中打印字符串“TaskSEG”,并使用信號量實(shí)現(xiàn)這兩個(gè)字符串打印動(dòng)作的順序執(zhí)行。編輯代碼如下:#includeIncludes.h #include option.h#include 2410lib.h#include uhal.h/* 任務(wù)棧 */OS_STK StackLEDSTACKSIZE= 0, ; / 任務(wù)LED任務(wù)棧OS_STK StackSEGSTACKSIZE= 0, ; / 任務(wù)SEG任務(wù)棧/* 任務(wù)ID */char IdLED = 1; / 任務(wù)LED IDchar IdSEG = 2; / 任務(wù)SEG ID/* 任務(wù)處理函數(shù) */void TaskLED(void *Id); / 任務(wù)LED任務(wù)處理函數(shù)void TaskSEG(void *Id); / 任務(wù)SEG任務(wù)處理函數(shù)/* 信號量 */OS_EVENT *Sem1; / 信號量Sem1OS_EVENT *Sem2; / 信號量Sem2/* * 跑馬燈閃爍函數(shù),調(diào)用一次,四個(gè)跑馬燈由亮變滅或者由滅變亮 */void User_LED_Blink(void)static int led_status = 0;led_status += 1;if(led_status % 2 = 0)Led_Display(0x0f);elseLed_Display(0x00);/* * 數(shù)碼管顯示實(shí)驗(yàn),由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;/* * 任務(wù)LED任務(wù)處理函數(shù) * 1、OSStart調(diào)用之前創(chuàng)建的最高優(yōu)先級任務(wù),在該函數(shù)重啟動(dòng)時(shí)鐘節(jié)拍定時(shí)器 * 2、等待信號量Sem2并閃爍跑馬燈,然后釋放信號量Sem1,并延遲2S */void TaskLED(void *Id) INT8U Reply; /* 啟動(dòng)時(shí)鐘節(jié)拍定時(shí)器,開始多任務(wù)調(diào)度 */ ARMTargetStart(); for (;) /* 等待信號量Sem2 */OSSemPend(Sem2,0,&Reply);/* * 調(diào)用User_LED_Blink函數(shù)閃爍跑馬燈,并打印TaskLED到串口 * 此部分代碼為需要與另外一個(gè)任務(wù)同步的代碼 */uHALr_printf(); User_LED_Blink(); uHALr_printf(TaskLED); OSSemPost(Sem1); /* 釋放信號量Sem1 */OSTimeDly(20); /* * 任務(wù)SEG任務(wù)處理函數(shù) * 1、每隔100 ticks即1000ms,閃爍數(shù)碼管 * 2、等待信號量Sem1并閃爍數(shù)碼管,然后釋放信號量Sem2,并延遲1S */void TaskSEG(void *Id) INT8U Reply; for (;) /* 等待信號量Sem1 */ OSSemPend(Sem1, 0, &Reply);/* * 調(diào)用User_SEG_Blink函數(shù)閃爍數(shù)碼管,并打印TaskSEG到串口 * 此部分代碼為需要與另外一個(gè)任務(wù)同步的代碼 */ uHALr_printf(); User_SEG_Blink(); uHALr_printf(TaskSEG); OSSemPost(Sem2); /* 釋放信號量Sem2 */ /* 延遲1000ms */OSTimeDly(10); /* * Main函數(shù). * 1、初始化目標(biāo)系統(tǒng),初始化硬件定時(shí)器等,與操作系統(tǒng)無關(guān) * 2、調(diào)用OSInit初始化uC/OS-II軟件數(shù)據(jù)結(jié)構(gòu)等,必須在打開時(shí)鐘節(jié)拍中斷之前調(diào)用 * 3、創(chuàng)建兩個(gè)信號量,Sem1和Sem2 * 4、創(chuàng)建兩個(gè)任務(wù),TaskLED和TaskSEG,TaskLED的優(yōu)先級為5,TaskSEG的優(yōu)先級為13,TaskLED的優(yōu)先級高于TaskSEG * 5、調(diào)用OSStart啟動(dòng)uC/OS-II */void Main(void) /* * 目標(biāo)系統(tǒng)初始化 */ARMTargetInit(); /* * uC/OS-II軟件初始化 */OSInit(); /* * 創(chuàng)建兩個(gè)信號量,Sem1和Sem2,Sem1的初始值為0,Sem2的初始值為1,即Sem2缺省是處于釋放狀態(tài) */ Sem1 = OSSemCreate(0); Sem2 = OSSemCreate(1); /* * 創(chuàng)建兩個(gè)任務(wù),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); /* * 啟動(dòng)多任務(wù)調(diào)度 */ OSStart(); /* * 正常情況下,永遠(yuǎn)不會(huì)執(zhí)行到這里 */return; 4. 編譯工程Eg2,如果出錯(cuò),進(jìn)行修改后再編譯。5、將Eg2下載并運(yùn)行,觀察結(jié)果。6、修改代碼,在TaskLED和TaskSEG中添加不同的延時(shí),觀察結(jié)果。7、去掉TaskLED和TaskSEG中的信號量操作,并修改延時(shí)值,觀察結(jié)果。實(shí)驗(yàn)B:1、觀看“實(shí)驗(yàn)二B.avi”視頻文件2、打開實(shí)驗(yàn)二B模板工程3、編輯Eg3.c,在TaskSEG中申明一個(gè)int型變量nCount,并設(shè)置初始值為0,每隔100個(gè)時(shí)鐘節(jié)拍累加一次nCount,并向郵箱中發(fā)送nCount的值,編輯代碼如下:#includeIncludes.h /* uC/OS interface */#include option.h#include 2410lib.h#include uhal.h/* 任務(wù)棧 */OS_STK StackLEDSTACKSIZE= 0, ; / 任務(wù)LED任務(wù)棧OS_STK StackSEGSTACKSIZE= 0, ; / 任務(wù)SEG任務(wù)棧/* 任務(wù)ID */char IdLED = 1; / 任務(wù)LED IDchar IdSEG = 2; / 任務(wù)SEG ID/* 任務(wù)處理函數(shù) */void TaskLED(void *Id); / 任務(wù)LED任務(wù)處理函數(shù)void TaskSEG(void *Id); / 任務(wù)SEG任務(wù)處理函數(shù)/* 郵箱 */OS_EVENT *Mbox1;/* * 跑馬燈閃爍函數(shù),調(diào)用一次,四個(gè)跑馬燈由亮變滅或者由滅變亮 */void User_LED_Blink(void)static int led_status = 0;led_status += 1;if(led_status % 2 = 0)Led_Display(0x0f);elseLed_Display(0x00);/* * 數(shù)碼管顯示實(shí)驗(yàn),由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;/* * 任務(wù)LED任務(wù)處理函數(shù) * 1、OSStart調(diào)用之前創(chuàng)建的最高優(yōu)先級任務(wù),在該函數(shù)重啟動(dòng)時(shí)鐘節(jié)拍定時(shí)器 * 2、等待郵箱中的消息,并打印出來 */void TaskLED(void *Id)char*Msg;INT8Uerr; /* 啟動(dòng)時(shí)鐘節(jié)拍定時(shí)器,開始多任務(wù)調(diào)度 */ ARMTargetStart(); for (;) /* 等待郵箱中的消息,如果沒有消息則掛起該任務(wù) */Msg = (char *)OSMboxPend(Mbox1, 0, &err);/* 打印接受到的消息 */uHALr_printf(Msg);/* * 任務(wù)SEG任務(wù)處理函數(shù) * 1、每隔100 ticks即1000ms,閃爍數(shù)碼管 * 2、每隔100 ticks即1000ms,向郵箱發(fā)送一個(gè)字符串?dāng)?shù)據(jù) */void TaskSEG(void *Id)charMsg100;INT8Uerr;int nCount = 0;for (;) /* 發(fā)送數(shù)據(jù)到郵箱 */ sprintf(Msg, TaskSEG %d, nCount+);OSMboxPost(Mbox1, Msg);/* 閃爍數(shù)碼管 */User_SEG_Blink(); /* 延遲1000ms */OSTimeDly(100);/* * Main函數(shù). * 1、初始化目標(biāo)系統(tǒng),初始化硬件定時(shí)器等,與操作系統(tǒng)無關(guān) * 2、調(diào)用OSInit初始化uC/OS-II軟件數(shù)據(jù)結(jié)構(gòu)等,必須在打開時(shí)鐘節(jié)拍中斷之前調(diào)用 * 3、創(chuàng)建一個(gè)郵箱 * 4、創(chuàng)建兩個(gè)任務(wù),TaskLED和TaskSEG,TaskLED的優(yōu)先級為5,TaskSEG的優(yōu)先級為13,TaskLED的優(yōu)先級高于TaskSEG * 5、調(diào)用OSStart啟動(dòng)uC/OS-II */void Main(void) /* * 目標(biāo)系統(tǒng)初始化 */ARMTargetInit(); /* * uC/OS-II軟件初始化 */OSInit();/* * 創(chuàng)建一個(gè)郵箱 */Mbox1 = OSMboxCreate(void *)0); /* * 創(chuàng)建兩個(gè)任務(wù),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); /* * 啟動(dòng)多任務(wù)調(diào)度 */ OSStart(); /* * 正常情況下,永遠(yuǎn)不會(huì)執(zhí)行到這里 */return; 4、在TaskLED中申明一個(gè)int型變量nCount,接收郵箱Mbox1的值放到nCount中,并通過串口打印出來。 5、編譯工程Eg3,如果出錯(cuò),進(jìn)行修改后再編譯。6、將Eg3下載并運(yùn)行,觀察結(jié)果。五、實(shí)驗(yàn)現(xiàn)象實(shí)驗(yàn)A:實(shí)驗(yàn)箱上跑馬燈和數(shù)碼管顯示同時(shí)不斷交替進(jìn)行串口打印結(jié)果如下:實(shí)驗(yàn)B:實(shí)驗(yàn)箱上跑馬燈和數(shù)碼管顯示同時(shí)不斷交替進(jìn)行串口打印結(jié)果如下: 實(shí)驗(yàn)三 軟件定時(shí)器實(shí)驗(yàn) 一、實(shí)驗(yàn)?zāi)康?擴(kuò)充uC/OS-II內(nèi)核,實(shí)現(xiàn)軟件定時(shí)器功能二、實(shí)驗(yàn)內(nèi)容 1、實(shí)現(xiàn)軟件定時(shí)器管理函數(shù);2、在應(yīng)用程序中添加軟件定時(shí)器功能(eg_timer工程)三、基礎(chǔ)知識軟件定時(shí)器:1、軟件定時(shí)器是許多操作系統(tǒng)提供的必備功能,它使得應(yīng)用程序定時(shí)執(zhí)行某一段代碼。2、但是,在uC/OS-II的內(nèi)核中沒有提供軟件定時(shí)器的功能。3、本實(shí)驗(yàn)采用一種簡單的方法實(shí)現(xiàn)軟件定時(shí)器功能。、軟件定時(shí)器管理函數(shù):1、在UCOS-IIIncludes.h中包含了關(guān)于軟件定時(shí)器管理的相關(guān)函數(shù)的聲明2、軟件定時(shí)器管理函數(shù)在UCOS-IIeg_tmrOS_TIMER.c文件中實(shí)現(xiàn)軟件定時(shí)器初始化:OSTmrInit創(chuàng)建軟件定時(shí)器:OSCreateTimer打開軟件定時(shí)器:OSEnableTimer關(guān)閉軟件定時(shí)器:OSDisableTimer刪除軟件定時(shí)器:OSDeleteTimer軟件定時(shí)器實(shí)現(xiàn)方法分析 :1、調(diào)用OSTmrInit函數(shù)完成定時(shí)器管理功能初始化,在該函數(shù)中將創(chuàng)建一個(gè)優(yōu)先級為4的高優(yōu)先級任務(wù),它應(yīng)該是系統(tǒng)中最高優(yōu)先級的任務(wù),在創(chuàng)建其它任務(wù)時(shí)請使用5或者過大的優(yōu)先級數(shù)。這個(gè)任務(wù)每個(gè)時(shí)鐘節(jié)拍都將運(yùn)行,在其中檢查是否有定時(shí)器就緒,如果就緒將執(zhí)行相應(yīng)的定時(shí)器函數(shù),否則將進(jìn)行任務(wù)調(diào)度。2、采用這種方法實(shí)現(xiàn)軟件定時(shí)器有一個(gè)前提,就是定時(shí)器管理任務(wù)的優(yōu)先級應(yīng)該比任何其它應(yīng)用任務(wù)優(yōu)先級高,另外,這種方式實(shí)現(xiàn)的定時(shí)器精度有限,在本系統(tǒng)中,定時(shí)器精度小于10ms,且由于需要頻繁進(jìn)行任務(wù)切換,CPU開銷較大。3、但是這種方法實(shí)現(xiàn)起來比較簡單,而且對于一般應(yīng)用已經(jīng)足夠,如果要求更高要求的定時(shí)器功能,可以考慮直接采用硬件定時(shí)器實(shí)現(xiàn)。創(chuàng)建定時(shí)器 :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); 定時(shí)器服務(wù)函數(shù)實(shí)現(xiàn):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;四、實(shí)驗(yàn)步驟1、觀看“實(shí)驗(yàn)三.avi”視頻文件2、打開實(shí)驗(yàn)三模板工程3、編輯Eg_Timer.c,在TaskLED中創(chuàng)建三個(gè)定時(shí)器,并在其定時(shí)器服務(wù)函數(shù)TmrFunc1中實(shí)現(xiàn)定時(shí)器1,關(guān)閉定時(shí)器1,打開定時(shí)器2,并閃爍跑馬燈定時(shí)器2,關(guān)閉定時(shí)器2,打開定時(shí)器3定時(shí)器3,關(guān)閉定時(shí)器3,打開定時(shí)器1 編輯原代碼如下:#includeIncludes.h #include option.h#include 2410lib.h#include uhal.h/* 任務(wù)棧 */OS_STK StackLEDSTACKSIZE= 0, ; / 任務(wù)LED任務(wù)棧OS_STK StackSEGSTACKSIZE= 0, ; / 任務(wù)SEG任務(wù)棧/* 任務(wù)ID */char IdLED = 1; / 任務(wù)LED IDchar IdSEG = 2; / 任務(wù)SEG ID/* 任務(wù)處理函數(shù) */void TaskLED(void *Id); / 任務(wù)LED任務(wù)處理函數(shù)void TaskSEG(void *Id); / 任務(wù)SEG任務(wù)處理函數(shù)/* 定時(shí)器服務(wù)函數(shù),三個(gè)定時(shí)器公用一個(gè)定時(shí)器服務(wù)函數(shù) */void TmrFunc1(INT8U arg);/* 定時(shí)器1、2、3 */OS_TMR *Tmr1;OS_TMR *Tmr2;OS_TMR *Tmr3;/* * 跑馬燈閃爍函數(shù),調(diào)用一次,四個(gè)跑馬燈由亮變滅或者由滅變亮 */void User_LED_Blink(void)static int led_status = 0;led_status += 1;if(led_status % 2 = 0)Led_Display(0x0f);elseLed_Display(0x00);/* * 數(shù)碼管顯示實(shí)驗(yàn),由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;/* * 定時(shí)器Tmr1、Tmr2、Tmr3處理函數(shù) * 1、根據(jù)arg參數(shù)確定定時(shí)器 * 2、三個(gè)定時(shí)器同時(shí)只打開一個(gè),即Tmr1、Tmr2、Tmr3,三個(gè)定時(shí)器總和閃爍一次跑馬燈 */void TmrFunc1(INT8U arg)/* 根據(jù)arg參數(shù)處理不同的定時(shí)器 */switch(arg)/* 定時(shí)器1,關(guān)閉定時(shí)器1,打開定時(shí)器2 */case 1:OSEnableTimer(Tmr2);OSDisableTimer(Tmr1);User_LED_Blink();break;/* 定時(shí)器2,關(guān)閉定時(shí)器2,打開定時(shí)器3 */case 2:OSEnableTimer(Tmr3);OSDisableTimer(Tmr2);break;/* 定時(shí)器3,關(guān)閉定時(shí)器3,打開定時(shí)器1 */case 3:OSEnableTimer(Tmr1);OSDisableTimer(Tmr3);break;/* * 任務(wù)LED任務(wù)處理函數(shù) * 1、OSStart調(diào)用之前創(chuàng)建的最高優(yōu)先級任務(wù),在該函數(shù)重啟動(dòng)時(shí)鐘節(jié)拍定時(shí)器 * 2、創(chuàng)建三個(gè)定時(shí)器,定時(shí)時(shí)間都為2秒鐘,它們使用同樣的TmrFunc1定時(shí)器服務(wù)函數(shù),但是使用不同的參數(shù),定時(shí)器1的初始狀態(tài)為開,其余為關(guān) */void TaskLED(void *Id)char key_press;char led_status = 0x0; INT8U err; /* 啟動(dòng)時(shí)鐘節(jié)拍定時(shí)器,開始多任務(wù)調(diào)度 */ ARMTargetStart(); uHALr_printf(Task1() calledn);/* 初始化定時(shí)器 */OSTmrInit();/* 創(chuàng)建三個(gè)定時(shí)器,定時(shí)時(shí)間都為2秒鐘,它們使用同樣的TmrFunc1定時(shí)器服務(wù)函數(shù),但是使用不同的參數(shù),定時(shí)器1的初始狀態(tài)為開,其余為關(guān) */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);/* 該任務(wù)到此完成,不斷延時(shí) */ for (;) OSTimeDly(100); /* * 任務(wù)SEG任務(wù)處理函數(shù) * 1、每隔100 ticks即1000ms,閃爍數(shù)碼管 */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函數(shù). * 1、初始化目標(biāo)系統(tǒng),初始化硬件定時(shí)器等,與操作系統(tǒng)無關(guān) * 2、調(diào)用OSInit初始化uC/OS-II軟件數(shù)據(jù)結(jié)構(gòu)等,必須在打開時(shí)鐘節(jié)拍中斷之前調(diào)用 * 3、創(chuàng)建兩個(gè)任務(wù),TaskLED和TaskSEG,TaskLED的優(yōu)先級為5,TaskSEG的優(yōu)先級為13,TaskLED的優(yōu)先級高于TaskSEG * 4、調(diào)用OSStart啟動(dòng)uC/OS-II */void Main(void) /* * 目標(biāo)系統(tǒng)初始化 */ARMTargetInit(); /* * uC/OS-II軟件初始化 */OSInit(); /* * 創(chuàng)建兩個(gè)任務(wù),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); /* * 啟動(dòng)多任務(wù)調(diào)度 */ OSStart(); /* * 正常情況下,永遠(yuǎn)不會(huì)執(zhí)行到這里 */return; 4. 編譯工程Eg_Timer,如果出錯(cuò),進(jìn)行修改后再編譯。5、將Eg_Timer下載并運(yùn)行,觀察結(jié)果。五、實(shí)驗(yàn)現(xiàn)象實(shí)驗(yàn)現(xiàn)象為每6秒鐘跑馬燈閃爍一次 。串口打印結(jié)果如下:實(shí)驗(yàn)四 多任務(wù)編程實(shí)驗(yàn) 一、實(shí)驗(yàn)?zāi)康?了解uC/OS-II中怎樣創(chuàng)建一個(gè)任務(wù)以及了解uC/OS-II的多任務(wù)調(diào)度機(jī)制二、實(shí)驗(yàn)內(nèi)容 1、在Eg1的基礎(chǔ)上新建一個(gè)任務(wù);2、在該任務(wù)函數(shù)中打印提示信息。三、基礎(chǔ)知識聲明任務(wù)棧:1、 在eg1.c文件中聲明任務(wù)堆棧,任務(wù)棧以全局變量的方式靜態(tài)分配,然后在創(chuàng)建任務(wù)時(shí)使用。/* task stack */OS_STK StackLEDSTACKSIZE= 0, ;OS_STK StackSEGSTACKSIZE= 0, ;OS_STK StackTESTSTACKSIZE= 0, ;添加任務(wù)ID:/* task name string */char IdLED = 1;char IdSEG = 2;char IdTEST = 3;任務(wù)函數(shù)聲明:/* task entry function */void TaskLED(void *Id);void TaskSEG(void *Id);void TaskTEST(void *Id);任務(wù)函數(shù)實(shí)現(xiàn):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); 四、實(shí)驗(yàn)步驟1、打開實(shí)驗(yàn)四模板工程2、按照“基礎(chǔ)知識”部分內(nèi)容編輯Eg1.c文件 編輯源代碼如下:#includeIncludes.h #include option.h#include 2410lib.h#include uhal.h/* 任務(wù)棧 */OS_STK StackLEDSTACKSIZE= 0, ; / 任務(wù)LED任務(wù)棧OS_STK StackSEGSTACKSIZE= 0, ; / 任務(wù)SEG任務(wù)棧OS_STK StackTESTSTACKSIZE= 0, ;/* 任務(wù)ID */char IdLED = 1; / 任務(wù)LED IDchar IdSEG = 2; / 任務(wù)SEG IDchar IdTEST = 3;/* 任務(wù)處理函數(shù) */void TaskLED(void *Id); / 任務(wù)LED任務(wù)處理函數(shù)void TaskSEG(void *Id); / 任務(wù)SEG任務(wù)處理函數(shù)void TaskTEST(void *Id);/* * 跑馬燈閃爍函數(shù),調(diào)用一次,四個(gè)跑馬燈由亮變滅或者由滅變亮 */void User_LED_Blink(void)static int led_status = 0;led_status += 1;if(led_status % 2 = 0)Led_Display(0x0f);elseLed_Display(0x00);/* * 數(shù)碼管顯示實(shí)驗(yàn),由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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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ǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025屆泰安市重點(diǎn)中學(xué)七下數(shù)學(xué)期末達(dá)標(biāo)檢測模擬試題含解析
- 浙江省杭州西湖區(qū)杭州市公益中學(xué)2025年八年級數(shù)學(xué)第二學(xué)期期末檢測試題含解析
- 軟件設(shè)計(jì)師考試復(fù)習(xí)資料試題及答案
- 企業(yè)戰(zhàn)略目標(biāo)與風(fēng)險(xiǎn)承受能力評估試題及答案
- 開拓新思維的工作計(jì)劃
- 2025屆甘肅省慶陽市寧縣數(shù)學(xué)七下期末經(jīng)典模擬試題含解析
- 水務(wù)能源節(jié)約利用方案計(jì)劃
- 電子商務(wù)行業(yè)保安措施總結(jié)計(jì)劃
- 財(cái)務(wù)數(shù)據(jù)安全管理策略計(jì)劃
- 2024年中山市坦洲人民醫(yī)院招聘筆試真題
- 食堂庫存物的盤點(diǎn)表
- 單位閑置房屋盤活方案范本
- 美妙的高等數(shù)學(xué)(上)智慧樹知到課后章節(jié)答案2023年下江西師范大學(xué)
- 新員工入職報(bào)到通知書
- 2018年版電工-國家職業(yè)技能標(biāo)準(zhǔn)
- 淺談如何做好財(cái)務(wù)安全工作
- 電動(dòng)車分期付款的合同范本
- 高中英語-Live form the Louvre教學(xué)設(shè)計(jì)學(xué)情分析教材分析課后反思
- 2023北京高考英語答題卡ok
- 醫(yī)務(wù)科運(yùn)用PDCA循環(huán)提高門診醫(yī)生準(zhǔn)時(shí)出診率PDCA成果匯報(bào)
- 動(dòng)脈采血操作考核標(biāo)準(zhǔn)
評論
0/150
提交評論