dsp數(shù)字信號(hào)處理課程設(shè)計(jì)-- µcos-ii在dsp上的任務(wù)通訊_第1頁(yè)
已閱讀1頁(yè),還剩25頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、<p>  《DSP技術(shù)及應(yīng)用》課程設(shè)計(jì)報(bào)告</p><p>  選題名稱(chēng): µC/OS-II在DSP上的任務(wù)通訊 </p><p>  系(院): 計(jì)算機(jī)工程學(xué)院 </p><p>  專(zhuān) 業(yè): 計(jì)算機(jī)科學(xué)與技術(shù)(嵌入式系統(tǒng)軟件設(shè)計(jì))</p><p>  

2、班 級(jí): 計(jì)算機(jī)1073班 </p><p>  姓 名: 學(xué) 號(hào): </p><p>  指導(dǎo)教師: </p><p>  學(xué)年學(xué)期: 2009 ~ 2010 學(xué)年 第 2

3、學(xué)期 </p><p>  2010年 6 月 12 日</p><p><b>  摘要:</b></p><p>  在µC/OS-II中,有多種方法可以保護(hù)任務(wù)之間的共享數(shù)據(jù)和提供任務(wù)之間的通訊。一是利用宏OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()來(lái)關(guān)閉中斷和打開(kāi)中斷。二是

4、利用函數(shù)OSSchedLock()和OSSchekUnlock()對(duì)µC/OS-II中的任務(wù)調(diào)度函數(shù)上鎖和開(kāi)鎖。本文將介紹另外三種用于數(shù)據(jù)共享和任務(wù)通訊的方法:信號(hào)量、郵箱和消息隊(duì)列。本文將著重介紹了在DSP上任務(wù)和中斷服務(wù)子程序之間是如何進(jìn)行通訊的。一個(gè)任務(wù)或者中斷服務(wù)子程序可以通過(guò)事件控制塊ECB來(lái)向另外的任務(wù)發(fā)信號(hào),所有的信號(hào)都被看成是事件。一個(gè)任務(wù)還可以等待另一個(gè)任務(wù)或中斷服務(wù)子程序給它發(fā)送信號(hào),只有任務(wù)可以等待事件發(fā)

5、生,中斷服務(wù)子程序是不能這樣做的。對(duì)于處于等待狀態(tài)的任務(wù),還可以給它指定一個(gè)最長(zhǎng)等待時(shí)間,以此來(lái)防止因?yàn)榈却氖录](méi)有發(fā)生而無(wú)限期地等下去。多個(gè)任務(wù)可以同時(shí)等待同一個(gè)事件的發(fā)生,當(dāng)該事件發(fā)生后,所有等待該事件的任務(wù)中,優(yōu)先級(jí)最高的任務(wù)得到了該事件并進(jìn)入就緒狀態(tài),準(zhǔn)備執(zhí)行。這些事件,可以是信號(hào)量、郵箱或者消息隊(duì)列等。</p><p>  關(guān)鍵詞:µC/OS-II;信號(hào)量;郵箱;消息隊(duì)列;DSP</p

6、><p><b>  目錄</b></p><p><b>  1 課題綜述1</b></p><p>  1.1 課題性質(zhì)和目的1</p><p>  1.2 課題設(shè)計(jì)任務(wù)1</p><p>  1.3 課題設(shè)計(jì)要求1</p><p>  1

7、.4 課題背景1</p><p><b>  2 系統(tǒng)分析2</b></p><p>  2.1 CCS簡(jiǎn)介2</p><p>  2.2 µC/OS-II簡(jiǎn)介3</p><p><b>  2.3 信號(hào)量3</b></p><p><b> 

8、 2.4 郵箱4</b></p><p>  2.5 消息隊(duì)列5</p><p>  3 系統(tǒng)詳細(xì)設(shè)計(jì)8</p><p>  3.1 建立一個(gè)郵箱,OSMboxCreate()8</p><p>  3.2 等待一個(gè)郵箱中的消息,OSMboxPend()9</p><p>  3.3 發(fā)送一個(gè)消息

9、到郵箱中,OSMboxPost()11</p><p>  3.4 無(wú)等待地從郵箱中得到一個(gè)消息, OSMboxAccept()13</p><p>  3.5 查詢(xún)一個(gè)郵箱的狀態(tài), OSMboxQuery()14</p><p>  3.6 用郵箱作二值信號(hào)量15</p><p>  3.7 用郵箱實(shí)現(xiàn)延時(shí),而不使用OSTimeDl

10、y()15</p><p><b>  4 源程序16</b></p><p><b>  總 結(jié)20</b></p><p><b>  參考文獻(xiàn)21</b></p><p><b>  1 課題綜述</b></p><p&

11、gt;  1.1 課題性質(zhì)和目的</p><p>  《DSP技術(shù)及應(yīng)用》課程設(shè)計(jì)是一項(xiàng)重要的實(shí)踐性教育環(huán)節(jié),是學(xué)生在校期間必須接受的一項(xiàng)工程訓(xùn)練。在課程設(shè)計(jì)過(guò)程中,在教師指導(dǎo)下,運(yùn)用工程的方法,通過(guò)一個(gè)簡(jiǎn)單課題的設(shè)計(jì)練習(xí),可使學(xué)生初步體驗(yàn)定點(diǎn)DSP應(yīng)用系統(tǒng)的設(shè)計(jì)過(guò)程、設(shè)計(jì)要求、完成的工作內(nèi)容和具體的設(shè)計(jì)方法,了解必須提交的各項(xiàng)工程文件,也達(dá)到鞏固、充實(shí)和綜合運(yùn)用所學(xué)知識(shí)解決實(shí)際問(wèn)題的目的。</p>

12、<p>  通過(guò)課程設(shè)計(jì),應(yīng)能加強(qiáng)學(xué)生如下能力的培養(yǎng):獨(dú)立工作能力和創(chuàng)造力;綜合運(yùn)用專(zhuān)業(yè)及基礎(chǔ)知識(shí),解決實(shí)際工程技術(shù)問(wèn)題的能力;查閱圖書(shū)資料、產(chǎn)品手冊(cè)和各種工具書(shū)的能力;工程繪圖的能力;程序編寫(xiě)的能力;編寫(xiě)技術(shù)報(bào)告和編制技術(shù)資料的能力。</p><p>  1.2 課題設(shè)計(jì)任務(wù)</p><p>  布置一定難度的設(shè)計(jì)課題,要求獨(dú)立或協(xié)作完成。在設(shè)計(jì)過(guò)程中,養(yǎng)成良好的電路設(shè)計(jì)、編

13、程習(xí)慣,學(xué)會(huì)分析實(shí)際問(wèn)題能力,系統(tǒng)設(shè)計(jì)的能力和系統(tǒng)綜合的能力,鍛煉代碼調(diào)試技巧,撰寫(xiě)設(shè)計(jì)文檔。</p><p>  1.3 課題設(shè)計(jì)要求</p><p>  在課程教學(xué)大綱主要內(nèi)容和基本要求的基礎(chǔ)上,結(jié)合課程體系的實(shí)際需求及學(xué)生的實(shí)踐能力、實(shí)驗(yàn)條件等外部因素,選擇恰當(dāng)?shù)脑O(shè)計(jì)課題,既體現(xiàn)教學(xué)目的,又能反映實(shí)際教學(xué)情況。安排充足的實(shí)踐課時(shí),配備專(zhuān)門(mén)指導(dǎo)老師。學(xué)生完成設(shè)計(jì)任務(wù)后,應(yīng)按要求提交課程

14、設(shè)計(jì)報(bào)告,課程設(shè)計(jì)報(bào)告力求規(guī)范化。</p><p><b>  1.4 課題背景</b></p><p>  在µC/OS-II中,有多種方法可以保護(hù)任務(wù)之間的共享數(shù)據(jù)和提供任務(wù)之間的通訊。一是利用宏OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()來(lái)關(guān)閉中斷和打開(kāi)中斷。當(dāng)兩個(gè)任務(wù)或者一個(gè)任務(wù)和一個(gè)中斷服務(wù)子程序共享某些數(shù)據(jù)時(shí),可以

15、采用OS_ENTER_CRITICAL() 和 OS_EXIT_CRITICAL()及OS_CPU.H。二是利用函數(shù)OSSchedLock()和OSSchekUnlock()對(duì)µC/OS-II中的任務(wù)調(diào)度函數(shù)上鎖和開(kāi)鎖。用這種方法也可以實(shí)現(xiàn)數(shù)據(jù)的共享,給調(diào)度器上鎖和開(kāi)鎖。本文將介紹另外三種用于數(shù)據(jù)共享和任務(wù)通訊的方法:信號(hào)量、郵箱和消息隊(duì)列。本文將著重介紹了任務(wù)和中斷服務(wù)子程序之間是如何進(jìn)行通訊的。 一個(gè)任務(wù)或者中斷服務(wù)子程序

16、可以通過(guò)事件控制塊ECB來(lái)向另外的任務(wù)發(fā)信號(hào),所有的信號(hào)都被看成是事件。一個(gè)任務(wù)還可以等待另一個(gè)任務(wù)或中斷服務(wù)子程序給它發(fā)送信號(hào),只有任務(wù)可以等待事件發(fā)生,中斷服務(wù)子程序是不能這樣做的。對(duì)于處于等待狀態(tài)的任務(wù),還可以給它指定一個(gè)最長(zhǎng)等待時(shí)間,以此來(lái)防止因?yàn)榈却氖录](méi)有發(fā)生而無(wú)限期地等下去。多個(gè)任務(wù)可以同時(shí)等待同一個(gè)事</p><p><b>  2 系統(tǒng)分析</b></p>

17、<p><b>  2.1 CCS簡(jiǎn)介</b></p><p>  CCS是一種針對(duì)TMS320系列DSP的集成開(kāi)發(fā)環(huán)境,在Windows操作系統(tǒng)下,采用圖形接口界面,提供有環(huán)境配置、源文件編輯、程序調(diào)試、跟蹤和分析等工具。 CCS有兩種工作模式,即 軟件仿真器模式:可以脫離DSP芯片,在PC機(jī)上模擬DSP的指令集和工作機(jī)制,主要用于前期算法實(shí)現(xiàn)和調(diào)試。 硬件在線(xiàn)編程模式:可以實(shí)時(shí)

18、運(yùn)行在DSP芯片上,與硬件開(kāi)發(fā)板相結(jié)合在線(xiàn)編程和調(diào)試應(yīng)用程序。</p><p>  CCS的開(kāi)發(fā)系統(tǒng)主要由以下組件構(gòu)成:TMS320C54x集成代碼產(chǎn)生工具;CCS集成開(kāi)發(fā)環(huán)境;DSP/BIOS實(shí)時(shí)內(nèi)核插件及其應(yīng)用程序接口API;實(shí)時(shí)數(shù)據(jù)交換的RTDX插件以及相應(yīng)的程序接口API;由TI公司以外的第三方提供的各種應(yīng)用模塊插件。</p><p>  CCS的功能十分強(qiáng)大,它集成了代碼的編輯、

19、編譯、鏈接和調(diào)試等諸多功能,而且支持C/C++和匯編的混合編程,其主要功能如下:具有集成可視化代碼編輯界面,用戶(hù)可通過(guò)其界面直接編寫(xiě)C、匯編、.cmd文件等;含有集成代碼生成工具,包括匯編器、優(yōu)化C編譯器、鏈接器等,將代碼的編輯、編譯、鏈接和調(diào)試等諸多功能集成到一個(gè)軟件環(huán)境中;高性能編輯器支持匯編文件的動(dòng)態(tài)語(yǔ)法加亮顯示,使用戶(hù)很容易閱讀代碼,發(fā)現(xiàn)語(yǔ)法錯(cuò)誤;工程項(xiàng)目管理工具可對(duì)用戶(hù)程序?qū)嵭许?xiàng)目管理。在生成目標(biāo)程序和程序庫(kù)的過(guò)程中,建立不同

20、程序的跟蹤信息,通過(guò)跟蹤信息對(duì)不同的程序進(jìn)行分類(lèi)管理;基本調(diào)試工具具有裝入執(zhí)行代碼、查看寄存器、存儲(chǔ)器、反匯編、變量窗口等功能,并支持C源代碼級(jí)調(diào)試;斷點(diǎn)工具,能在調(diào)試程序的過(guò)程中,完成硬件斷點(diǎn)、軟件斷點(diǎn)和條件斷點(diǎn)的設(shè)置;探測(cè)點(diǎn)工具,可用于算法的仿真,數(shù)據(jù)的實(shí)時(shí)監(jiān)視等;分析工具,包括模擬器和仿真器分析,可用于模擬和監(jiān)視硬件的功能、評(píng)價(jià)代碼執(zhí)行的時(shí)鐘;數(shù)據(jù)的圖形顯示工具,可以將運(yùn)算結(jié)果用圖形顯示,包括顯示時(shí)域/頻域波形、眼圖、星座圖、圖像

21、等,并能進(jìn)行自動(dòng)刷新;提供GEL工具。利用GEL擴(kuò)展語(yǔ)言,用戶(hù)可以編寫(xiě)自己的控</p><p>  CCS支持多DSP的調(diào)試,支持RTDX技術(shù),可在不中斷目標(biāo)系統(tǒng)運(yùn)行的情況下,實(shí)現(xiàn)DSP與其他應(yīng)用程序的數(shù)據(jù)交換,提供DSP/BIOS工具,增強(qiáng)對(duì)代碼的實(shí)時(shí)分析能力。</p><p>  2.2 µC/OS-II簡(jiǎn)介</p><p>  uC/OS是一種免費(fèi)

22、公開(kāi)源代碼、結(jié)構(gòu)小巧、具有可剝奪實(shí)時(shí)內(nèi)核的實(shí)時(shí)操作系統(tǒng)。μC/OS-II 的前身是μC/OS,最早出自于1992 年美國(guó)嵌入式系統(tǒng)專(zhuān)家Jean J.Labrosse 在《嵌入式系統(tǒng)編程》雜志的5月和6月刊上刊登的文章連載,并把μC/OS 的源碼發(fā)布在該雜志的B B S 上。</p><p>  μC/OS和μC/OS-II是專(zhuān)門(mén)為計(jì)算機(jī)的嵌入式應(yīng)用設(shè)計(jì)的, 絕大部分代碼是用C語(yǔ)言編寫(xiě)的。CPU硬件相關(guān)部分是用匯編

23、語(yǔ)言編寫(xiě)的、總量約200行的匯編語(yǔ)言部分被壓縮到最低限度,為的是便于移植到任何一種其它的CPU上。用戶(hù)只要有標(biāo)準(zhǔn)的ANSI的C交叉編譯器,有匯編器、連接器等軟件工具,就可以將μC/OS-II嵌人到開(kāi)發(fā)的產(chǎn)品中。μC/OS-II具有執(zhí)行效率高、占用空間小、實(shí)時(shí)性能優(yōu)良和可擴(kuò)展性強(qiáng)等特點(diǎn), 最小內(nèi)核可編譯至 2KB 。μC/OS-II 已經(jīng)移植到了幾乎所有知名的CPU上。</p><p>  嚴(yán)格地說(shuō)uC/OS-II

24、只是一個(gè)實(shí)時(shí)操作系統(tǒng)內(nèi)核,它僅僅包含了任務(wù)調(diào)度,任務(wù)管理,時(shí)間管理,內(nèi)存管理和任務(wù)間的通信和同步等基本功能。沒(méi)有提供輸入輸出管理,文件系統(tǒng),網(wǎng)絡(luò)等額外的服務(wù)。但由于uC/OS-II良好的可擴(kuò)展性和源碼開(kāi)放,這些非必須的功能完全可以由用戶(hù)自己根據(jù)需要分別實(shí)現(xiàn)。</p><p>  uC/OS-II目標(biāo)是實(shí)現(xiàn)一個(gè)基于優(yōu)先級(jí)調(diào)度的搶占式的實(shí)時(shí)內(nèi)核,并在這個(gè)內(nèi)核之上提供最基本的系統(tǒng)服務(wù),如信號(hào)量,郵箱,消息隊(duì)列,內(nèi)存管理

25、,中斷管理等。</p><p><b>  2.3 信號(hào)量 </b></p><p>  µC/OS-II中的信號(hào)量由兩部分組成:一個(gè)是信號(hào)量的計(jì)數(shù)值,它是一個(gè)16位的無(wú)符號(hào)整數(shù)(0 到65,535之間);另一個(gè)是由等待該信號(hào)量的任務(wù)組成的等待任務(wù)表。用戶(hù)要在OS_CFG.H中將OS_SEM_EN開(kāi)關(guān)量常數(shù)置成1,這樣µC/OS-II才能支持信號(hào)量

26、。 在使用一個(gè)信號(hào)量之前,首先要建立該信號(hào)量,也即調(diào)用OSSemCreate()函數(shù),對(duì)信號(hào)量的初始計(jì)數(shù)值賦值。該初始值為0到65,535之間的一個(gè)數(shù)。如果信號(hào)量是用來(lái)表示一個(gè)或者多個(gè)事件的發(fā)生,那么該信號(hào)量的初始值應(yīng)設(shè)為0。如果信號(hào)量是用于對(duì)共享資源的訪(fǎng)問(wèn),那么該信號(hào)量的初始值應(yīng)設(shè)為1(例如,把它當(dāng)作二值信號(hào)量使用)。最后,如果該信號(hào)量是用來(lái)表示允許任務(wù)訪(fǎng)問(wèn)n個(gè)相同的資源,那么該初始值顯然應(yīng)該是n,并把該信號(hào)量作為一個(gè)可計(jì)數(shù)的信號(hào)量使

27、用。 </p><p>  µC/OS-II提供了5個(gè)對(duì)信號(hào)量進(jìn)行操作的函數(shù)。它們是:OSSemCreate(),OSSemPend(),OSSemPost(),OSSemAccept()和OSSemQuery()函數(shù)。圖2-1說(shuō)明了任務(wù)、中斷服務(wù)子程序和信號(hào)量之間的關(guān)系。圖中用鑰匙或者旗幟的符號(hào)來(lái)表示信號(hào)量:如果信號(hào)量用于對(duì)共享資源的訪(fǎng)問(wèn),那么信號(hào)量就用鑰匙符號(hào)。符號(hào)旁邊的數(shù)字N代表可用資源數(shù)。對(duì)于二

28、值信號(hào)量,該值就是1;如果信號(hào)量用于表示某事件的發(fā)生,那么就用旗幟符號(hào)。這時(shí)的數(shù)字N代表事件已經(jīng)發(fā)生的次數(shù)。從圖2-1中可以看出OSSemPost()函數(shù)可以由任務(wù)或者中斷服務(wù)子程序調(diào)用,而OSSemPend()和OSSemQuery()函數(shù)只能有任務(wù)程序調(diào)用。 </p><p><b>  2.4 郵箱 </b></p><p>  郵箱是µC/OS-II

29、中另一種通訊機(jī)制,它可以使一個(gè)任務(wù)或者中斷服務(wù)子程序向另一個(gè)任務(wù)發(fā)送一個(gè)指針型的變量。該指針指向一個(gè)包含了特定“消息”的數(shù)據(jù)結(jié)構(gòu)。為了在µC/OS-II中使用郵箱,必須將OS_CFG.H中的OS_MBOX_EN常數(shù)置為1。使用郵箱之前,必須先建立該郵箱。該操作可以通過(guò)調(diào)用OSMboxCreate()函數(shù)來(lái)完成,并且要指定指針的初始值。一般情況下,這個(gè)初始值是NULL,但也可以初始化一個(gè)郵箱,使其在最開(kāi)始就包含一條消息。如果使用

30、郵箱的目的是用來(lái)通知一個(gè)事件的發(fā)生(發(fā)送一條消息),那么就要初始化該郵箱為NULL,因?yàn)樵陂_(kāi)始時(shí),事件還沒(méi)有發(fā)生。如果用戶(hù)用郵箱來(lái)共享某些資源,那么就要初始化該郵箱為一個(gè)非NULL的指針。在這種情況下,郵箱被當(dāng)成一個(gè)二值信號(hào)量使用。µC/OS-II提供了5種對(duì)郵箱的操作:OSMboxCreate(),OSMboxPend(),OSMboxPost(), OSMboxAccept()和OSMboxQuery()函數(shù)。圖2-2描述

31、了任務(wù)、中斷服務(wù)子程序和郵箱之間的關(guān)系,這里用符號(hào)“I”表示郵箱。郵箱包含的內(nèi)容是一個(gè)指向一條消息的指針。一個(gè)郵箱只能</p><p>  圖 2-2 任務(wù)、中斷服務(wù)子程序和郵箱之間的關(guān)系</p><p><b>  2.5 消息隊(duì)列 </b></p><p>  消息隊(duì)列是µC/OS-II中另一種通訊機(jī)制,它可以使一個(gè)任務(wù)或者中斷

32、服務(wù)子程序向另一個(gè)任務(wù)發(fā)送以指針?lè)绞蕉x的變量。因具體的應(yīng)用有所不同,每個(gè)指針指向的數(shù)據(jù)結(jié)構(gòu)變量也有所不同。為了使用µC/OS-II的消息隊(duì)列功能,需要在OS_CFG.H 文件中,將OS_Q_EN常數(shù)設(shè)置為1,并且通過(guò)常數(shù)OS_MAX_QS來(lái)決定µC/OS-II支持的最多消息隊(duì)列數(shù)。在使用一個(gè)消息隊(duì)列之前,必須先建立該消息隊(duì)列。這可以通過(guò)調(diào)用OSQCreate()函數(shù),并定義消息隊(duì)列中的單元數(shù)(消息數(shù))來(lái)完成。

33、81;C/OS-II提供了7個(gè)對(duì)消息隊(duì)列進(jìn)行操作的函數(shù):OSQCreate(),OSQPend(),OSQPost(), OSQPostFront(),OSQAccept(),OSQFlush()和OSQQuery()函數(shù)。圖2-3是任務(wù)、中斷服務(wù)子程序和消息隊(duì)列之間的關(guān)系。其中,消息隊(duì)列的符號(hào)很像多個(gè)郵箱。實(shí)際上,我們可以將消息隊(duì)列看作時(shí)多個(gè)郵箱組成的數(shù)組,只是它們共用一個(gè)等待任務(wù)列表。每個(gè)指針?biāo)赶虻臄?shù)據(jù)結(jié)構(gòu)是由具體的應(yīng)用程序決定的

34、。N代表了消息隊(duì)列中的總單元數(shù)。當(dāng)調(diào)用OSQPend()或者OSQAccept()</p><p>  圖 2-3 任務(wù)、中斷服務(wù)子程序和消息隊(duì)列之間的關(guān)系</p><p>  圖2-4是實(shí)現(xiàn)消息隊(duì)列所需要的各種數(shù)據(jù)結(jié)構(gòu)。這里也需要事件控制塊來(lái)記錄等待任務(wù)列表,而且,事件控制塊可以使多個(gè)消息隊(duì)列的操作和信號(hào)量操作、郵箱操作相同的代碼。當(dāng)建立了一個(gè)消息隊(duì)列時(shí),一個(gè)隊(duì)列控制塊(OS_Q結(jié)構(gòu),見(jiàn)

35、OS_Q.C文件)也同時(shí)被建立,并通過(guò)OS_EVENT中的.OSEventPtr域鏈接到對(duì)應(yīng)的事件控制塊。在建立一個(gè)消息隊(duì)列之前,必須先定義一個(gè)含有與消息隊(duì)列最大消息數(shù)相同個(gè)數(shù)的指針數(shù)組。數(shù)組的起始地址以及數(shù)組中的元素?cái)?shù)作為參數(shù)傳遞給OSQCreate()函數(shù)。事實(shí)上,如果內(nèi)存占用了連續(xù)的地址空間,也沒(méi)有必要非得使用指針數(shù)組結(jié)構(gòu)。文件OS_CFG.H中的常數(shù)OS_MAX_QS定義了在µC/OS- II中可以使用的最大消息隊(duì)列數(shù)

36、,這個(gè)值最小應(yīng)為2。µC/OS-II在初始化時(shí)建立一個(gè)空閑的隊(duì)列控制塊鏈表,如圖2-5所示。 </p><p>  圖2-4 用于消息隊(duì)列的數(shù)據(jù)結(jié)構(gòu)</p><p>  圖 2-5 空閑隊(duì)列控制塊鏈表</p><p>  隊(duì)列控制塊是一個(gè)用于維護(hù)消息隊(duì)列信息的數(shù)據(jù)結(jié)構(gòu),它包含了以下的一些域。這里,仍然在各個(gè)變量前加入一個(gè)[.]來(lái)表示它們是數(shù)據(jù)結(jié)構(gòu)中的一個(gè)域

37、。.OSQPtr在空閑隊(duì)列控制塊中鏈接所有的隊(duì)列控制塊。一旦建立了消息隊(duì)列,該域就不再有用了。而.OSQStart是指向消息隊(duì)列的指針數(shù)組的起始地址的指針。用戶(hù)應(yīng)用程序在使用消息隊(duì)列之前必須先定義該數(shù)組。 .OSQEnd是指向消息隊(duì)列結(jié)束單元的下一個(gè)地址的指針。該指針使得消息隊(duì)列構(gòu)成一個(gè)循環(huán)的緩沖區(qū)。 .OSQIn是指向消息隊(duì)列中插入下一條消息的位置的指針。當(dāng).OSQIn和.OSQEnd相等時(shí),.OSQIn被調(diào)整指向消息隊(duì)列的起始單元。

38、 .OSQOut是指向消息隊(duì)列中下一個(gè)取出消息位置的指針。當(dāng).OSQOut和.OSQEnd相等時(shí),.OSQOut被調(diào)整指向消息隊(duì)列的起始單元。 .OSQSize是消息隊(duì)列中總的單元數(shù)。該值是在建立消息隊(duì)列時(shí)由用戶(hù)應(yīng)用程序決定的。在µC/OS-II中,該值最大可以是6553 5。.OSQEntries是消息隊(duì)列中當(dāng)前的消息數(shù)量。當(dāng)消息隊(duì)列是空的時(shí),該值為0。當(dāng)消息隊(duì)列滿(mǎn)了以后,該值和.OSQSize值一樣。 在消息隊(duì)列剛剛<

39、;/p><p>  圖 2-6 消息隊(duì)列是一個(gè)由指針組成的循環(huán)緩沖區(qū)</p><p><b>  3 系統(tǒng)詳細(xì)設(shè)計(jì)</b></p><p>  3.1 建立一個(gè)郵箱,OSMboxCreate() </p><p>  下面是OSMboxCreate()函數(shù)的源代碼。在于事件控制塊的類(lèi)型被設(shè)置成OS_EVE NT_TYPE_M

40、BOX,以及使用.OSEventPtr域來(lái)容納消息指針,而不是使用.OSEventCnt域。OSMboxCreate()函數(shù)的返回值是一個(gè)指向事件控制塊的指針。這個(gè)指針在調(diào)用函數(shù)OSMboxPend (),OSMboxPost(),OSMboxAccept()和OSMb oxQuery()時(shí)使用。因此,該指針可以看作是對(duì)應(yīng)郵箱的句柄。值得注意的是,如果系統(tǒng)中已經(jīng)沒(méi)有事件控制塊可用,函數(shù)OSMboxCreate()將返回一個(gè)NULL指針。

41、郵箱一旦建立,是不能被刪除的。比如,如果有任務(wù)正在等待一個(gè)郵箱的信息,這時(shí)刪除該郵箱,將有可能產(chǎn)生災(zāi)難性的后果。 </p><p>  OS_EVENT *OSMboxCreate (void *msg) </p><p><b>  { </b></p><p>  OS_EVENT *pevent; </p><p>

42、;  OS_ENTER_CRITICAL(); </p><p>  pevent = OSEventFreeList; </p><p>  if (OSEventFreeList != (OS_EVENT *)0)</p><p><b>  { </b></p><p>  OSEventFreeList = (O

43、S_EVENT *)OSEventFreeList->OSEventPtr; </p><p><b>  } </b></p><p>  OS_EXIT_CRITICAL(); </p><p>  if (pevent != (OS_EVENT *)0) </p><p><b>  { </

44、b></p><p>  pevent->OSEventType = OS_EVENT_TYPE_MBOX; </p><p>  pevent->OSEventPtr = msg; </p><p>  OSEventWaitListI

45、nit(pevent); </p><p><b>  } </b></p><p>  return (pevent); </p><p><b>  } </b></p><p>  3.2 等待一個(gè)郵箱

46、中的消息,OSMboxPend() </p><p>  下面是OSMboxPend()函數(shù)的源代碼。OSMboxPend()首先檢查該事件控制塊是由OSMboxCreate()函數(shù)建立的。當(dāng).OSEventPtr域是一個(gè)非NULL的指針時(shí),說(shuō)明該郵箱中有可用的消息。這種情況下,OSMboxPend()函數(shù)將該域的值復(fù)制到局部變量msg中,然后將.OSEventPtr置為NULL。這正是我們所期望的,也是執(zhí)行OS

47、 MboxPend()函數(shù)最快的路徑。如果此時(shí)郵箱中沒(méi)有消息是可用的(.OSEvent Ptr域是NULL指針),OSMbox Pend()函數(shù)檢查它的調(diào)用者是否是中斷服務(wù)子程序。和OSSemPend()函數(shù)一樣,不能在中斷服務(wù)子程序中調(diào)用OSMboxPend(),因?yàn)橹袛喾?wù)子程序是不能等待的。這里的代碼同樣是為了以防萬(wàn)一.但是,如果郵箱中有可用的消息,即使從中斷服務(wù)子程序中調(diào)用OSMboxPend()函數(shù),也一樣是成功的。如果郵箱中

48、沒(méi)有可用的消息,OSMboxPend()的調(diào)用任務(wù)就被掛起,直到郵箱中有了消息或者等待超時(shí)。當(dāng)有其它的任務(wù)向該郵箱發(fā)送了消息后(或者等待時(shí)間超時(shí)),這時(shí),該任務(wù)再一次成為最高優(yōu)先級(jí)任務(wù),OSS ched</p><p>  void *OSMboxPend (OS_EVENT *pevent, INT16U timeout, INT8U *err) </p><p><b>  

49、{ </b></p><p>  void *msg; </p><p>  OS_ENTER_CRITICAL(); </p><p>  if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) </p><p>  { </p><p

50、>  OS_EXIT_CRITICAL(); </p><p>  *err = OS_ERR_EVENT_TYPE; </p><p>  return ((void *)0); </p><p><b>  } </b></p><p>  msg = pevent->OSEventPtr; </p

51、><p>  if (msg != (void *)0) </p><p>  { </p><p>  pevent->OSEventPtr = (void *)0; </p><p>  OS_EXIT_C

52、RITICAL(); </p><p>  *err = OS_NO_ERR; </p><p><b>  } </b></p><p>  else if (OSIntNesting > 0) </p><p>  { </p><

53、;p>  OS_EXIT_CRITICAL(); </p><p>  *err = OS_ERR_PEND_ISR; </p><p><b>  } </b></p><p><b>  else </b></p><p><b>  { </b></p>

54、<p>  OSTCBCur->OSTCBStat |= OS_STAT_MBOX; </p><p>  OSTCBCur->OSTCBDly = timeout; </p><p>  OSEventTaskWait(pevent); </p><p>  OS_EXIT_CRITICAL

55、(); </p><p>  OSSched(); </p><p>  OS_ENTER_CRITICAL(); </p><p>  if ((msg = OSTCBCur->OSTCBMsg) != (void *)0) </p><p><b>  {</b></p><p>  O

56、STCBCur->OSTCBMsg = (void *)0; </p><p>  OSTCBCur->OSTCBStat= OS_STAT_RDY; </p><p>  OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0; </p><p>  OS_EXIT_CRITICAL(); </p><

57、p>  *err= OS_NO_ERR; </p><p><b>  } </b></p><p>  else if (OSTCBCur->OSTCBStat & OS_STAT_MBOX) </p><p>  { </p><p>  OSEventTO(pevent);

58、 </p><p>  OS_EXIT_CRITICAL(); </p><p>  msg= (void *)0; </p><p>  *err= OS_TIMEOUT; </p><p><b>  } </b>&l

59、t;/p><p><b>  else { </b></p><p>  msg= pevent->OSEventPtr; </p><p>  pevent->OSEventPtr= (void *)0; </p><p>  OSTCBCur-&

60、gt;OSTCBEventPtr = (OS_EVENT *)0; </p><p>  OS_EXIT_CRITICAL(); </p><p>  *err= OS_NO_ERR; </p><p><b>  } </b></p><p><b>  } </b>&l

61、t;/p><p>  return (msg); </p><p><b>  } </b></p><p>  在OSMboxPend()函數(shù)中,通過(guò)檢查任務(wù)控制塊中的.OSTCBStat域中的OS_ STAT _MBOX位,可以知道是否等待超時(shí)。如果該域被置1,說(shuō)明任務(wù)等待已經(jīng)超時(shí)。這時(shí),通過(guò)調(diào)用函數(shù)OSEventTo()可以將任務(wù)從郵箱的等待

62、列表中刪除。因?yàn)榇藭r(shí)郵箱中沒(méi)有消息,所以返回的指針是NULL。如果OS_STAT_MBOX位沒(méi)有被置1,說(shuō)明所等待的消息已經(jīng)被發(fā)出。OSMboxPend()的調(diào)用函數(shù)得到指向消息的指針。此后,OSMboxPend()函數(shù)通過(guò)將郵箱事件控制塊的.OSEventPtr域置為NULL清空該郵箱,并且要將任務(wù)任務(wù)控制塊中指向郵箱事件控制塊的指針刪除。 </p><p>  3.3 發(fā)送一個(gè)消息到郵箱中,OSMboxPos

63、t() </p><p>  下面是OSMboxPost()函數(shù)的源代碼。檢查了事件控制塊是否是一個(gè)郵箱后,OSM boxPost()函數(shù)還要檢查是否有任務(wù)在等待該郵箱中的消息。如果事件控制塊中的OSEv entGrp域包含非零值,就暗示著有任務(wù)在等待該消息。這時(shí),調(diào)用OSEventTaskRdy()將其中的最高優(yōu)先級(jí)任務(wù)從等待列表中刪除,加入系統(tǒng)的就緒任務(wù)列表中,準(zhǔn)備運(yùn)行。然后,調(diào)用OSSched()函數(shù),檢查

64、該任務(wù)是否是系統(tǒng)中最高優(yōu)先級(jí)的就緒任務(wù)。如果是,執(zhí)行任務(wù)切換,該任務(wù)得以執(zhí)行。如果該任務(wù)不是最高優(yōu)先級(jí)的任務(wù),OSSched()返回,OSMboxPost()的調(diào)用函數(shù)繼續(xù)執(zhí)行。如果沒(méi)有任何任務(wù)等待該消息,指向消息的指針就被保存到郵箱中(假設(shè)此時(shí)郵箱中的指針不是非NULL的)。這樣,下一個(gè)調(diào)用OSM boxPend()函數(shù)的任務(wù)就可以立刻得到該消息了。注意,如果OSMboxPost()函數(shù)是從中斷服務(wù)子程序中調(diào)用的,那么,這時(shí)并不發(fā)生上

65、下文的切換。</p><p>  INT8U OSMboxPost (OS_EVENT *pevent, void *msg) </p><p><b>  { </b></p><p>  OS_ENTER_CRITICAL(); </p><p>  if (pevent->OSEventType != OS_

66、EVENT_TYPE_MBOX) </p><p><b>  { </b></p><p>  OS_EXIT_CRITICAL(); </p><p>  return (OS_ERR_EVENT_TYPE); </p><p><b>  } </b></p><p>

67、  if (pevent->OSEventGrp) </p><p>  { </p><p>  OSEventTaskRdy(pevent, msg, OS_STAT_MBOX); </p><p>  OS_EXIT_CRITICAL(); </p><p>  OS

68、Sched(); </p><p>  return (OS_NO_ERR); </p><p><b>  } </b></p><p><b>  else </b></p><p><b>  { </b&

69、gt;</p><p>  if (pevent->OSEventPtr != (void *)0) </p><p>  { </p><p>  OS_EXIT_CRITICAL(); </p><p>  return (OS_MBOX_FULL); </p><p><b

70、>  } </b></p><p><b>  else </b></p><p><b>  { </b></p><p>  pevent->OSEventPtr = msg; </p><p>  OS_EXIT_CRITICAL(); </p>&l

71、t;p>  return (OS_NO_ERR); </p><p><b>  } </b></p><p><b>  } </b></p><p><b>  } </b></p><p>  3.4 無(wú)等待地從郵箱中得到一個(gè)消息, OSMboxAccept() &

72、lt;/p><p>  應(yīng)用程序也可以以無(wú)等待的方式從郵箱中得到消息。這可以通過(guò)下面程序中的OSMboxAccept()函數(shù)來(lái)實(shí)現(xiàn)。OSMboxAccept()函數(shù)開(kāi)始也是檢查事件控制塊是否是由OSMboxCreate()函數(shù)建立的。接著,它得到郵箱中的當(dāng)前內(nèi)容,并判斷是否有消息是可用的。如果郵箱中有消息,就把郵箱清空,而郵箱中原來(lái)指向消息的指針被返回給OSMboxAccept()的調(diào)用函數(shù)。OSMboxAccept

73、()函數(shù)的調(diào)用函數(shù)必須檢查該返回值是否為NULL。如果該值是NULL,說(shuō)明郵箱是空的,沒(méi)有可用的消息。如果該值是非NULL值,說(shuō)明郵箱中有消息可用,而且該調(diào)用函數(shù)已經(jīng)得到了該消息。中斷服務(wù)子程序在試圖得到一個(gè)消息時(shí),應(yīng)該使用OSMbox Accept()函數(shù),而不能使用OSMboxPend()函數(shù)。OSMboxAccept()函數(shù)的另一個(gè)用途是,用戶(hù)可以用它來(lái)清空一個(gè)郵箱中現(xiàn)有的內(nèi)容。 </p><p>  v

74、oid *OSMboxAccept (OS_EVENT *pevent) </p><p><b>  { </b></p><p>  void *msg; </p><p>  OS_ENTER_CRITICAL(); </p><p>  if (pevent->OSEventType != OS_EVEN

75、T_TYPE_MBOX) </p><p><b>  { </b></p><p>  OS_EXIT_CRITICAL(); </p><p>  return ((void *)0); </p><p><b>  } </b></p><p>  msg = peve

76、nt->OSEventPtr; </p><p>  if (msg != (void *)0) </p><p>  { </p><p>  pevent->OSEventPtr = (void *)0;

77、 </p><p><b>  } </b></p><p>  OS_EXIT_CRITICAL(); </p><p>  return (msg); </p><p><b>  、} </b></p><p>  3

78、.5 查詢(xún)一個(gè)郵箱的狀態(tài), OSMboxQuery() </p><p>  OSMboxQuery()函數(shù)使應(yīng)用程序可以隨時(shí)查詢(xún)一個(gè)郵箱的當(dāng)前狀態(tài)。下面是該函數(shù)的源代碼。它需要兩個(gè)參數(shù):一個(gè)是指向郵箱的指針pevent。該指針是在建立該郵箱時(shí),由OSMboxCreate()函數(shù)返回的;另一個(gè)是指向用來(lái)保存有關(guān)郵箱的信息的OS_MBOX _ DATA數(shù)據(jù)結(jié)構(gòu)的指針pdata。在調(diào)用OSMboxCreate()函數(shù)

79、之前,必須先定義該結(jié)構(gòu)變量,用來(lái)保存有關(guān)郵箱的信息。之所以定義一個(gè)新的數(shù)據(jù)結(jié)構(gòu),是因?yàn)檫@里關(guān)心的只是和特定郵箱有關(guān)的內(nèi)容,而非整個(gè)OS_EVENT數(shù)據(jù)結(jié)構(gòu)的內(nèi)容。后者還包含了另外兩個(gè)域(.OSEventCnt和.OSEventType),而OS_MBOX_DATA只包含郵箱中的消息指針(.OSMsg)和該郵箱現(xiàn)有的等待任務(wù)列表(.OSEventTbl[]和.OSEventGrp)。和前面的所以函數(shù)一樣,該函數(shù)也是先檢查事件控制是否是郵箱

80、。然后,將郵箱中的等待任務(wù)列表和郵箱中的消息從OS_EVENT數(shù)據(jù)結(jié)構(gòu)復(fù)制到OS_MBOX_DATA數(shù)據(jù)結(jié)構(gòu)。</p><p>  INT8U OSMboxQuery (OS_EVENT *pevent, OS_MBOX_DATA *pdata) </p><p><b>  { </b></p><p>  INT8U i; </p&

81、gt;<p>  INT8U *psrc; </p><p>  INT8U *pdest; </p><p>  OS_ENTER_CRITICAL(); </p><p>  if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) </p><p>  { <

82、;/p><p>  OS_EXIT_CRITICAL(); </p><p>  return (OS_ERR_EVENT_TYPE); </p><p><b>  } </b></p><p>  pdata->OSEventGrp = pevent->OSEventGrp;

83、</p><p>  psrc= &pevent->OSEventTbl[0]; </p><p>  pdest= &pdata->OSEventTbl[0]; </p><p>  for (i = 0; i < OS_EVENT_TBL_SIZE; i++) </p><p><b>  {

84、</b></p><p>  *pdest++ = *psrc++; </p><p><b>  } </b></p><p>  pdata->OSMsg= pevent->OSEventPtr; </p><p>  OS_EXIT_CRITICAL(); &l

85、t;/p><p>  return (OS_NO_ERR); </p><p><b>  } </b></p><p>  3.6 用郵箱作二值信號(hào)量 </p><p>  一個(gè)郵箱可以被用作二值的信號(hào)量。首先,在初始化時(shí),將郵箱設(shè)置為一個(gè)非零的指針(如 void *1)。這樣,一個(gè)任務(wù)可以調(diào)用OSMboxPend()函數(shù)

86、來(lái)請(qǐng)求一個(gè)信號(hào)量,然后通過(guò)調(diào)用OSMboxPost()函數(shù)來(lái)釋放一個(gè)信號(hào)量。下面程序說(shuō)明了這個(gè)過(guò)程是如何工作的。如果用戶(hù)只需要二值信號(hào)量和郵箱,這樣做可以節(jié)省代碼空間。這時(shí)可以將OS_SEM_EN設(shè)置為0,只使用郵箱就可以了。 </p><p>  OS_EVENT *MboxSem; </p><p>  void Task1 (void *pdata) </p><

87、;p><b>  { </b></p><p>  INT8U err; </p><p><b>  for (;;) </b></p><p><b>  { </b></p><p>  OSMboxPend(MboxSem, 0, &err); /*

88、獲得對(duì)資源的訪(fǎng)問(wèn)權(quán) */ </p><p><b>  .</b></p><p>  . /* 任務(wù)獲得信號(hào)量,對(duì)資源進(jìn)行訪(fǎng)問(wèn) */ </p><p><b>  .</b></p><p>  OSMboxPost(MboxSem, (void*)1); /* 釋放對(duì)資源的訪(fǎng)問(wèn)權(quán) */ &

89、lt;/p><p><b>  } </b></p><p><b>  } </b></p><p>  3.7 用郵箱實(shí)現(xiàn)延時(shí),而不使用OSTimeDly() </p><p>  郵箱的等待超時(shí)功能可以被用來(lái)模仿OSTimeDly()函數(shù)的延時(shí),如下程序所示。如果在指定的時(shí)間段TIMEOUT內(nèi),沒(méi)

90、有消息到來(lái),Task1()函數(shù)將繼續(xù)執(zhí)行。這和OSTim eDly(TIMEOUT)功能很相似。但是,如果Task2()在指定的時(shí)間結(jié)束之前,向該郵箱發(fā)送了一個(gè)“啞”消息,Task1()就會(huì)提前開(kāi)始繼續(xù)執(zhí)行。這和調(diào)用OSTimeDlyResume()函數(shù)的功能是一樣的。注意,這里忽略了對(duì)返回的消息的檢查,因?yàn)榇藭r(shí)關(guān)心的不是得到了什么樣的消息。 </p><p>  OS_EVENT *MboxTimeDly;

91、</p><p>  void Task1 (void *pdata) </p><p><b>  { </b></p><p>  INT8U err; </p><p><b>  for (;;) </b></p><p><b>  { </b>

92、;</p><p>  OSMboxPend(MboxTimeDly, TIMEOUT, &err); /* 延時(shí)該任務(wù) */ </p><p><b>  .</b></p><p>  . /* 延時(shí)結(jié)束后執(zhí)行的代碼 */ </p><p><b>  . </b></p

93、><p><b>  } </b></p><p><b>  } </b></p><p>  void Task2 (void *pdata) </p><p><b>  { </b></p><p>  INT8U err; </p>

94、<p><b>  for (;;) </b></p><p><b>  { </b></p><p>  OSMboxPost(MboxTimeDly, (void *)1); /* 取消任務(wù)1的延時(shí) */ </p><p><b>  . </b></p><

95、p><b>  . </b></p><p><b>  } </b></p><p><b>  } </b></p><p><b>  4 源程序</b></p><p>  #include "includes.h" &l

96、t;/p><p>  #include "ioports.h"</p><p>  #define IMR*(volatile unsigned int*)0x00</p><p>  #define IFR*(volatile unsigned int*)0x01</p><p>  #define TASK_STK_S

97、IZE 256 /* Size of each task's stacks (# of WORDs) */</p><p>  #define N_TASKS 2 /* Number of identical tasks */</p><p>  OS_STK TaskStk[N_TASKS][TASK_STK_SIZE]; /* Tasks stac

98、ks */</p><p>  OS_STK task_startStk[TASK_STK_SIZE];</p><p>  #define ADJUST_DSP_CLKclk_adjust</p><p>  void task_start(void *data);</p><p>  void task_led(void *d

99、ata);</p><p>  void task_segs(void *data);</p><p>  unsigned int seg7[16] = </p><p>  {0x03f|0x80, 0x006, 0x05b, 0x04f, 0x066, 0x06d, 0x07d, 0x007,</p><p>  0x07f, 0x06

100、f, 0x077, 0x07c, 0x039, 0x05e, 0x079, 0x071};</p><p>  /* mailbox event control blocks */</p><p>  OS_EVENT *Mbox;</p><p>  void hard_delay(int cnt)</p><p><b>  {

101、</b></p><p>  while(cnt--);</p><p><b>  }</b></p><p>  void clk_adjust()</p><p><b>  {</b></p><p>  asm("stm #0b, CLKM

102、D");</p><p>  asm("ChkForRdy:");</p><p>  asm("ldmCLKMD, A");</p><p>  asm("and #01b,A");</p><p>  asm("bc ChkFo

103、rRdy, ANEQ");</p><p>  asm("stm #33efh, CLKMD");</p><p>  asm("rpt #80h");</p><p>  asm("nop");</p><p><b>  }</b>&

104、lt;/p><p>  void main()</p><p>  { /* 板卡IO端口及外設(shè)初始狀態(tài)初始化 */</p><p>  LED_DAT = 0x01;</p><p>  ADJUST_DSP_CLK();</p><p>  INIT_C54(); </p><p><b

105、>  OSInit();</b></p><p>  OSTaskCreate(task_start, (void *)0, </p><p>  (void *)&task_startStk[TASK_STK_SIZE - 1], 0);</p><p>  OSStart();</p><p><b>

106、  while(1);</b></p><p><b>  }</b></p><p>  void task_start(void *data)</p><p><b>  { </b></p><p>  UBYTE err;</p><p>  OS_E

107、NTER_CRITICAL();</p><p>  StartTimer();/* install the C54x Timer */</p><p>  OS_EXIT_CRITICAL();</p><p>  Mbox = OSMboxCreate((void *)0); </p><p>  OSTaskCreate(

108、task_led, (void *)0, </p><p>  (void *)&TaskStk[0][TASK_STK_SIZE - 1], 2);</p><p>  OSTaskCreate(task_segs, (void *)0, </p><p>  (void *)&TaskStk[1][TASK_STK_SIZE - 1], 3);

109、</p><p><b>  for (;;){</b></p><p><b>  err++;</b></p><p>  OSTimeDly(100); /* Delay 100 clock tick */</p><p><b>  }</b></p>

110、<p><b>  }</b></p><p>  void task_led(void *data)</p><p><b>  {</b></p><p>  int index = 0;</p><p>  for( index = 0; ; index++)</p>

111、<p><b>  {</b></p><p>  OSMboxPost(Mbox, (void*)(index&0x07));</p><p>  LED_DAT = 0x01<<(index&0x07);</p><p>  OSTimeDly(2000); </p><p>

112、;<b>  }</b></p><p><b>  }</b></p><p>  void task_segs(void *data)</p><p><b>  {</b></p><p>  int Msg;</p><p>  INT8U

113、err;</p><p>  SEG7_CLOSE(2);</p><p>  SEG7_CLOSE(3);</p><p>  SEG7_CLOSE(4);</p><p>  SEG7_CLOSE(5);</p><p>  SEG7_CLOSE(6);</p><p>  SEG7_CL

114、OSE(7);</p><p>  SEG7_CLOSE(8);</p><p>  SEG7_OPEN(1);</p><p><b>  while(1)</b></p><p>  {/* wait for a message from the input mailbox */</p><p&

115、gt;  Msg = (int)OSMboxPend(Mbox, 0, &err);</p><p>  SEG7_DAT = ~seg7[Msg];</p><p><b>  }</b></p><p><b>  return;</b></p><p><b>  }<

116、/b></p><p><b>  總結(jié)</b></p><p>  通過(guò)本次課程設(shè)計(jì),我掌握了µC/OS-II中用郵箱的方法保護(hù)任務(wù)之間的共享數(shù)據(jù)和提供任務(wù)之間的通訊,同時(shí)也對(duì)DSP有了更好的掌握。在其的過(guò)程中我們遇到了很多問(wèn)題,如:CCS軟件的調(diào)試和硬件的實(shí)現(xiàn)等。整個(gè)課程設(shè)計(jì)的難點(diǎn)在于軟件的調(diào)試。在課程設(shè)計(jì)的最后才發(fā)現(xiàn)了缺少一個(gè).lib系統(tǒng)文件

117、,通過(guò)添加其最后完成了調(diào)試。在硬件的實(shí)現(xiàn)方面也遇到了困難。終于經(jīng)過(guò)一次次的教訓(xùn)后,最終顯示了正確的結(jié)果。</p><p>  通過(guò)本次課程設(shè)計(jì),對(duì)DSP硬件電路有了很多更新的認(rèn)識(shí),讓原來(lái)紙面化的知識(shí)變成了實(shí)際的。也讓模擬電路、數(shù)字電路和DSP應(yīng)用相關(guān)的知識(shí)得到了鞏固,同時(shí)基本熟練了CCS軟件和其對(duì)應(yīng)試驗(yàn)箱的使用。在實(shí)際的實(shí)踐過(guò)程中,不僅是讓我們了解DSP基礎(chǔ)的理論知識(shí),更重要的是培養(yǎng)解決實(shí)際問(wèn)題的能力,所以相信通

118、過(guò)此次實(shí)習(xí)可以提高我們分析設(shè)計(jì)能力和實(shí)踐能力,為后續(xù)課程的學(xué)習(xí)及實(shí)踐打下良好的基礎(chǔ)。</p><p>  在這次短短的課程實(shí)踐里,我們得到了zz老師的關(guān)心和幫助。他給了我們很多的信息,與我一起探討問(wèn)題,詢(xún)問(wèn)我遇到了哪些問(wèn)題并耐心給予指導(dǎo)。當(dāng)我遇到技術(shù)上難以解決的問(wèn)題時(shí),他就會(huì)指導(dǎo)我們解決問(wèn)題,他把自己多年來(lái)積累的經(jīng)驗(yàn)教授給我,使我順利地完成了課程實(shí)踐任務(wù)。時(shí)間過(guò)得真快,大學(xué)生活不知不覺(jué)就走過(guò)了快3年了,在近3年的

119、大學(xué)學(xué)習(xí)和課程實(shí)踐階段的提高,使我們本身知識(shí)得到提高的同時(shí),也增強(qiáng)了我們對(duì)未來(lái)工作的信心,我們相信自己未來(lái)兩年的學(xué)習(xí)更使我們有能力勝任將來(lái)的工作。</p><p><b>  參考文獻(xiàn)</b></p><p>  1 喬瑞萍,崔濤,張芳娟.TMS320C54x DSP原理及應(yīng)用.西安:西安電子科技大學(xué)出版社,2009</p><p>  2 李

120、利.DSP原理及應(yīng)用.北京:中國(guó)水利水電出版社,2004</p><p>  3 張勇.C/C++語(yǔ)言硬件程序設(shè)計(jì)——基于TMS320C5000系列DSP.西安:西安電子科技大學(xué)出版社 2003</p><p>  4 鄒彥.DSP原理及應(yīng)用.北京:電子工業(yè)出版社,2005</p><p>  5 張雄偉.DSP集成開(kāi)發(fā)與應(yīng)用實(shí)例.北京:電子工業(yè)出版社,2002&l

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論