第一篇:青島理工嵌入式操作系統(tǒng)重點(diǎn)總結(jié)
1.磁盤掛載步驟
命令:mount[選項(xiàng)][類型] 步驟:1.確認(rèn)是否為Linux可以識別的文件系統(tǒng)。
2.確定設(shè)備的名稱,可通過使用命令“fdisk-l”查看。
3.必須確定掛載點(diǎn)已經(jīng)存在,也就是在/mnt下的相應(yīng)子目錄已經(jīng)存在 4.進(jìn)行掛載,使用完后可用umount卸載 2.shell腳本三個(gè)步驟 3.shellpot概念和任務(wù) 4.中斷系統(tǒng)調(diào)用的是硬中斷。5.中斷處理處理程序分為哪兩部分,上半部:功能是“登記中斷”。當(dāng)一個(gè)中斷發(fā)生時(shí),他就把設(shè)備驅(qū)動程序中中斷例程 的下半部掛到該設(shè)備的下半部執(zhí)行隊(duì)列中去,然后就等待新的中斷的到來。上半部是不可中斷的
下半部:功能是查看設(shè)備以獲得產(chǎn)生中斷的時(shí)間信息,并根據(jù)這些信息(一般通過讀設(shè)備上的寄存器得來的)進(jìn)行相應(yīng)的處理。下半部是可中斷的。6.信號與信號量的概念,程序和進(jìn)程的概念。
程序:是存放在磁盤文件中的可執(zhí)行文件,是機(jī)器代碼指令和數(shù)據(jù)的集合,不能獨(dú)立運(yùn)行
進(jìn)程:資源分配和獨(dú)立運(yùn)行的基本單位。
信號:信號是軟件中斷,信號機(jī)制是Unix系統(tǒng)中最為古老的進(jìn)程之間的通信機(jī)制,用于在一個(gè)或者多個(gè)進(jìn)程之間傳遞異步信號。
信號量:信號量是進(jìn)程通信處理同步互斥地機(jī)制,它是在多線程環(huán)境下使用的一種同步工具,負(fù)責(zé)協(xié)調(diào)各個(gè)線程,以保證他們能夠正確、合理的使用公共資源。7.Linux進(jìn)程的五種狀態(tài)
8.什么是管道,管道的分類(匿名管道的系統(tǒng)創(chuàng)建調(diào)用
管道的)
管道:是在內(nèi)存中創(chuàng)建一個(gè)分享文件,使通信雙方利用這個(gè)文件進(jìn)行信息傳遞,這個(gè)作為傳遞信息的共享文件就是管道
分類:匿名管道:匿名管道沒有名字,只能提供給進(jìn)程家族中的父子進(jìn)程間通信使用。
命名管道:FIFO(先進(jìn)先出),是一個(gè)能在互不相關(guān)進(jìn)程之間傳送數(shù)據(jù)的特殊文件。他是在實(shí)際文件系統(tǒng)的基礎(chǔ)上實(shí)現(xiàn)的一種通信機(jī)制
9.gcc編譯的四個(gè)階段,那四個(gè)階段。預(yù)處理,編譯,匯編,鏈接
10.編寫一個(gè) makefile 文件
11.創(chuàng)建子進(jìn)程的系統(tǒng)調(diào)用,fork函數(shù),三個(gè)返回值代表什么意思 int fork(): 返回值為0 創(chuàng)建成功,從子進(jìn)程返回
返回值>0
創(chuàng)建成功,從父進(jìn)程返回,其值為子進(jìn)程的pid號 返回值=-1 創(chuàng)建失敗
12.編寫守護(hù)進(jìn)程的步驟,五個(gè)步驟對應(yīng)的代碼,內(nèi)核編譯的三個(gè)步驟,每一步使用的命令。守護(hù)進(jìn)程步驟:1.創(chuàng)建子進(jìn)程,父進(jìn)程退出
if(pid>0)exit(0);else if(pid<0)return-1;
2.調(diào)用setsid以創(chuàng)建一個(gè)新的會話,并擔(dān)任該會話的組長
setsid();
3.改變當(dāng)前目錄為根目錄
chdir(“/”);
4.重設(shè)文件權(quán)限掩碼 umask(0);
5.關(guān)閉不再需要的文件描述符 for(i=0;i 15.Linux設(shè)備驅(qū)動程序分為那幾部分,每一部分的功能。 程序題 1.分析程序的輸出結(jié)果,exit,wait返回值,參數(shù) 信號的發(fā)送和捕獲。 設(shè)置時(shí)鐘的alarm()。 共享內(nèi)存的創(chuàng)建,鏈接,共享。。 消息隊(duì)列:7-6-1 課本上 第一章 mpumcu 嵌入式系統(tǒng)的組成 posix是什么標(biāo)準(zhǔn) linux內(nèi)核版本號,三位 11頁主分區(qū),擴(kuò)展分區(qū),邏輯分區(qū)。 什么叫掛載? 掛載:在Linux中把每一個(gè)分區(qū)和某一個(gè)目錄對應(yīng),以后對這個(gè)目錄的操作就是對這個(gè)分區(qū)的操作,這樣就實(shí)現(xiàn)了硬件管理手段和軟件目錄管理手段的統(tǒng)一。這個(gè)把分區(qū)和目錄對應(yīng)的過程就稱為掛載。12頁交換分區(qū)grub引導(dǎo)器。是一種引導(dǎo)裝入器,他負(fù)責(zé)裝入內(nèi)核并引導(dǎo)Linux系統(tǒng),位于硬盤的起始部分。 22頁文件的類型和屬性(四種) 23頁文件類型。普通文件,目錄文件,鏈接文件,設(shè)備文件 文件屬性 r:可讀 w:可寫 x:可執(zhí)行 文件用戶級別:文件擁有者u,所屬的用戶組g,系統(tǒng)其他用戶o 25頁Linux的結(jié)構(gòu) bin boot 第一位 etc home lib(動態(tài)鏈接庫)掛載。。proc root用戶 user var 第二章 30-54所有的命令 用戶切換su 普通用戶--超級用戶 切換 用戶管理(31頁) 系統(tǒng)管理命令(33頁) shutdown kill clear 磁盤相關(guān)的命令 磁盤掛載 步驟 文件目錄相關(guān)(37頁47) 改變文件目錄-cd 顯示當(dāng)前目錄-pwd 列出目錄內(nèi)容 -ls(-a)創(chuàng)建目錄149進(jìn)程通信同步互斥的概念 進(jìn)程間通信就是在不同進(jìn)程之間傳播或交換信息。 互斥:就是指某一資源同時(shí)只允許一個(gè)訪問者對其進(jìn)行訪問,即訪問是無序的。同步:是指在互斥的基礎(chǔ)上,通過其他機(jī)制實(shí)現(xiàn)訪問者對資源的有序訪問。 152信號量的概念,信號區(qū)別(用來解決進(jìn)程同步與互斥問題的機(jī)制)信號:信號是軟件中斷,信號機(jī)制是Unix系統(tǒng)中最為古老的進(jìn)程之間的通信機(jī)制,用于在一個(gè)或者多個(gè)進(jìn)程之間傳遞異步信號。 信號量:信號量是進(jìn)程通信處理同步互斥的機(jī)制,它是在多線程環(huán)境下使用的一種同步工具,負(fù)責(zé)協(xié)調(diào)各個(gè)線程,以保證他們能夠正確、合理的使用公共資源。169管道的定義分類,創(chuàng)建匿名管道的系統(tǒng)調(diào)用 管道:是在內(nèi)存中創(chuàng)建一個(gè)分享文件,使通信雙方利用這個(gè)文件進(jìn)行信息傳遞,這個(gè)作為傳遞信息的共享文件就是管道 分類:匿名管道:匿名管道沒有名字,只能提供給進(jìn)程家族中的父子進(jìn)程間通信使用。 命名管道:FIFO(先進(jìn)先出),是一個(gè)能在互不相關(guān)進(jìn)程之間傳送數(shù)據(jù)的特殊文件。他是在實(shí)際文件系統(tǒng)的基礎(chǔ)上實(shí)現(xiàn)的一種通信機(jī)制 171讀寫規(guī)則 系統(tǒng)對信號三種處理方式: 159映射調(diào)用了什么函數(shù)mmap 161共享內(nèi)存的打開和建立 164四個(gè)函數(shù)對應(yīng)程序。消息隊(duì)列 消息隊(duì)列:消息隊(duì)列是系統(tǒng)定義的內(nèi)存塊,用于臨時(shí)存儲消息。消息隊(duì)列就是一個(gè)消息的鏈表??梢园严⒖醋鲆粋€(gè)記錄,具有特定的格式及特定的優(yōu)先級。96存儲管理。使用虛擬內(nèi)存的優(yōu)勢: 使用虛擬內(nèi)存的優(yōu)勢:使計(jì)算機(jī)可以操縱更大的地址空間,還可以使系統(tǒng)中的每一個(gè)進(jìn)程都有自己的虛擬地址空間。97什么叫內(nèi)存映像。第三段四行。內(nèi)存映像:進(jìn)程的映像和虛擬進(jìn)程空間的連接稱為內(nèi)存影像 102根據(jù)讀的方式分為兩種,寫的方式分為兩種。高速緩存 貫穿讀出式 旁路讀出式 寫穿式回寫式 106頁分配器的伙伴算法 111slab根據(jù)對象的類型分類不同的cache 114-kmalloc 申請和是放假(較小較大)內(nèi)存分配函數(shù) 118什么用于將高。。 227輸入輸出系統(tǒng)的基本功能。存儲器統(tǒng)一編址和獨(dú)立編址 功能一:隱藏物理設(shè)備的細(xì)節(jié) 功能二:與設(shè)備的無關(guān)性 功能三:提高處理器與I/O設(shè)備的利用率 功能四:對I/O設(shè)備進(jìn)行控制 功能五:能確保對設(shè)備的正常共享 功能六:錯(cuò)誤處理 235linux設(shè)備驅(qū)動程序分為哪幾部分,每一部分的功能。自動配置和初始化子程序,負(fù)責(zé)檢測所要驅(qū)動的硬件設(shè)備是否存在和是否能正常工作。如果該設(shè)備正常,則對這個(gè)設(shè)備及其相關(guān)的、設(shè)備驅(qū)動程序需要的軟件狀態(tài)進(jìn)行初始化。這部分驅(qū)動程序只有在初始化時(shí)被調(diào)用一次。 完成用戶進(jìn)程請求的程序,即永恒進(jìn)程對設(shè)備的操控部分 設(shè)備中斷服務(wù)程序,通常分為上半部和下半部 200超級塊是文件的第一塊,主要包含文件系統(tǒng)的具體信息。201 vfs虛擬文件系統(tǒng)是系統(tǒng)對外的一個(gè)接口。僅存在于就內(nèi)存。207文件控制塊是文件存在的標(biāo)志。唯一。 CPU內(nèi)部結(jié)構(gòu) 8086分為兩個(gè)部分:總線接口部件BIU和執(zhí)行部件EU BIU主要功能負(fù)責(zé)CPU與存儲器、I/O接口之間的信息傳遞。 BIU部件包括(1).四個(gè)段地址寄存器:代碼段寄存器CS、數(shù)據(jù)段寄存器DS、堆棧段寄存器ss、附加段寄存器ES、(2).指令指針寄存器IP、(3).20位地址加法器、(4).6B的指令隊(duì)列、(5).總線控制邏輯電路。 EU主要功能負(fù)責(zé)指令的執(zhí)行。EU部件包括(1).四個(gè)通用寄存器:累加器AX、基址寄存器BX、計(jì)數(shù)器CX、數(shù)據(jù)寄存器DX。(2).四個(gè)專用寄存器:堆棧指針寄存器SP、基址指針寄存器BP、源變址寄存器SI、目的變址寄存器DI。(3).算數(shù)邏輯單元ALU。(4).標(biāo)志寄存器FR。(5).EU控制電路。 CPU寄存器 1.通用寄存器AX,BX,CX,DX,每一個(gè)寄存器都是16位的,既可以作為16位,又可以拆成高、低8位,分別作為兩個(gè)獨(dú)立8位寄存器使用。AX(AH,AL)累加器 BX(BH,BL)基址寄存器 CX(CH,CL)技術(shù)寄存器 DX(DH,DL)數(shù)據(jù)寄存器 2.專用寄存器SP,BP,SI,DI SP堆棧指針寄存器:在堆棧中存放棧頂偏移指針,永遠(yuǎn)指向堆棧的棧頂。BP基址指針寄存器:一般也用來存放訪問內(nèi)存時(shí)的基地址。 SI源變址寄存器、DI目的變址寄存器:它們常常用在變址尋址方式中。3.段寄存器CS,DS,SS,ES CS代碼段寄存器。DS數(shù)據(jù)段寄存器。SS堆棧段寄存器。ES附加段寄存器。 每一個(gè)段寄存器都是16位。4.指令指針寄存器IP 16位的指令指針寄存器IP 用于存放 下一條執(zhí)行指令的偏移地址。CPU取指令總以CS為段基址,以IP 位段內(nèi)偏移地址。當(dāng)CPU從CS段內(nèi)偏移地址為(IP)的內(nèi)存單元中取出指令代碼的一個(gè)字節(jié)后,IP 會自動加1,從而指向代碼的下一個(gè)字節(jié),用戶不能直接訪問IP寄存器。5.標(biāo)志寄存器FR 它是16位寄存器,但只使用其中的9位,這9位包括6個(gè)狀態(tài)標(biāo)志位和3個(gè)控制標(biāo)志位。狀態(tài)標(biāo)志記錄了前面算術(shù)邏輯運(yùn)算結(jié)果的一些特征;控制標(biāo)志是用戶自己通過指令設(shè)置的,設(shè)置后將對其后的操作產(chǎn)生控制作用。 指令、偽指令與宏指令 指令語句是可執(zhí)行語句,在匯編中要產(chǎn)生對應(yīng)的機(jī)器代碼,與機(jī)器指令有一一對應(yīng)關(guān)系,是CPU指令系統(tǒng)中的指令的符號形式,CPU根據(jù)這些代碼執(zhí)行相應(yīng)的操作。 偽指令語句是不可執(zhí)行語句,沒有機(jī)器指令與其對應(yīng),在匯編中不產(chǎn)生機(jī)器代碼,是匯編程序支持的一種命令,在匯編程序?qū)R編語言源程序匯編期間由匯編程序執(zhí)行,告訴匯編程序如何匯編源程序,可以完成數(shù)據(jù)的定義、內(nèi)存的分配等功能。 宏指令語句是以一條宏指令代表一段程序,經(jīng)過定義之后,在程序中出現(xiàn)該程序段的地方均可用宏指令代替,簡化了程序設(shè)計(jì)。在匯編時(shí),凡出現(xiàn)宏指令語句的位置都會被換成相應(yīng)的程序段。 DOS系統(tǒng)功能調(diào)用 DOS功能模塊位于BIOS的上層,對硬件的以來較小,DOS功能既可用于操作系統(tǒng)管理,又可用于匯編程序的設(shè)計(jì)。(1).設(shè)置所要調(diào)用功能的入口參數(shù)(2).在AH寄存器中存入搜要調(diào)用功能的功能號。 (3).通過INT n(系統(tǒng)功能調(diào)用用INT 21H)指令自動轉(zhuǎn)入中斷子程序入口。(4).相應(yīng)中斷子程序運(yùn)行完畢,可按規(guī) 定取得出口參數(shù)。 CPU與外設(shè)間信息調(diào)用 微機(jī)與外設(shè)之間的信息傳遞實(shí)際上是CPU與接口之間的信息傳遞,它們之間信息傳遞的主要方式有以下五種:(1).無條件傳送方式:又稱為同步方式,它所有的操作均由執(zhí)行程序完成,主要適用于CPU或外圍設(shè)備始終是準(zhǔn)備好了的情況,或者危機(jī)和外設(shè)是完全同步的情況。 (2).程序查詢方式:(3).中斷處理方式:(4).DMA控制方式:(5).I/O處理機(jī)方式: 8259A工作方式 1.中斷觸發(fā)方式(1).邊沿觸發(fā)方式。(2).電平觸發(fā)方式。2.連接系統(tǒng)總線方式 該方式用來確定系統(tǒng)總線與8259A數(shù)據(jù)總線之間是否需要進(jìn)行緩沖。(1).緩沖方式。(2).非緩沖方式。3.屏蔽中斷源的方式 8259A 8個(gè)中斷請求線上的每一個(gè)都可以根據(jù)需要決定是否屏蔽,屏蔽是通過編程使屏蔽寄存器IMR相應(yīng)位置0或置1,從而允許或禁止該位所對應(yīng)的中斷。 (1).普通屏蔽方式。(2).特殊屏蔽方式。4.優(yōu)先級排隊(duì)的方式 8259A對中斷優(yōu)先級的管理是中斷管理的核心問題。(1).全嵌套方式(2).特殊全嵌套方式(3).優(yōu)先權(quán)自動循環(huán)方式(4).優(yōu)先權(quán)特殊自動循環(huán)方式 5.中斷結(jié)束方式(1).自動中斷結(jié)束方式。(2).普通中斷結(jié)束方式。(3).特殊中斷結(jié)束方式。 實(shí)驗(yàn)一 嵌入式開發(fā)環(huán)境的建立 一、實(shí)驗(yàn)?zāi)康?/p> 通過此實(shí)驗(yàn)系統(tǒng),讀者可以了解嵌入式實(shí)時(shí)操作系統(tǒng) uC/OS-II 的內(nèi)核機(jī)制和運(yùn)行原理。本實(shí)驗(yàn)系統(tǒng)展示了 uC/OS-II 各方面的管理功能,包括信號量、隊(duì)列、內(nèi)存、時(shí)鐘等。在各個(gè)實(shí)驗(yàn)中具體介紹了 uC/OS-II 的相關(guān)函數(shù)。讀者在做實(shí)驗(yàn)的同時(shí)能夠結(jié)合理論知識加以分析,了解各個(gè)函數(shù)的作用和嵌入式應(yīng)用程序的設(shè)計(jì)方法,最終對整個(gè) uC/OS-II 和嵌入式操作系統(tǒng)的應(yīng)用有較為清楚的認(rèn)識。 二、實(shí)驗(yàn)步驟 1.安裝集成開發(fā)環(huán)境LambdaEDU 集成開發(fā)環(huán)境LambdaEDU 的安裝文件夾為 LambdaEDU,其中有一個(gè)名為“Setup.exe” 的文件,直接雙擊該文件便可啟動安裝過程。具體的安裝指導(dǎo)請看“LambdaEDU 安裝手 冊.doc”文件。 當(dāng) LambdaEDU 安裝完畢之后,我們看到的是一個(gè)空的界面,現(xiàn)在就開始一步一步地將 我們的實(shí)驗(yàn)項(xiàng)目建立并運(yùn)行起來。 2.建立項(xiàng)目 為了我們的實(shí)驗(yàn)運(yùn)行起來,需要建立1 個(gè)項(xiàng)目基于x86 虛擬機(jī)的標(biāo)準(zhǔn)應(yīng)用項(xiàng)目。通過點(diǎn) 擊“文件”、“新建”、“項(xiàng)目”開始根據(jù)向?qū)?chuàng)建一個(gè)項(xiàng)目。 在隨后出現(xiàn)的對話框中選擇“Tool/標(biāo)準(zhǔn)應(yīng)用項(xiàng)目”,點(diǎn)擊下一步,開始創(chuàng)建一個(gè)標(biāo)準(zhǔn)的 可執(zhí)行的應(yīng)用程序項(xiàng)目。 在隨后出現(xiàn)的對話框中填入項(xiàng)目名稱“ucos_x86_demo”。點(diǎn)擊“下一步”。 選擇“pc386 uC/OS-II 應(yīng)用(x86)”作為該項(xiàng)目的應(yīng)用框架。點(diǎn)擊“下一步” 選擇“pc386_elf_tra_debug”作為該項(xiàng)目的基本配置。點(diǎn)擊“完成”。 新創(chuàng)建的項(xiàng)目“ucos_x86_demo”將會被添加到項(xiàng)目列表。src 文件夾下保存了該項(xiàng)目中 包含的源文件。ucos2 文件夾中包含了移植到x86 虛擬機(jī)的全部代碼。init.c 文件是基于ucos2 和本虛擬機(jī)的一個(gè)應(yīng)用程序。在進(jìn)行ucos2 內(nèi)核實(shí)驗(yàn)中,只需要替換init.c 文件,即可。文 件名不限,但是文件名中最好不要使用英文符號和數(shù)字以外的其他字符,3.構(gòu)建項(xiàng)目 到這里,項(xiàng)目配置全部完成。接下來就可以進(jìn)行構(gòu)建項(xiàng)目了。 第一次構(gòu)建本項(xiàng)目,在此項(xiàng)目上點(diǎn)擊右鍵,選擇“重建BSP 及項(xiàng)目”。即可開始構(gòu)建。 之后彈出的對話框顯示了構(gòu)建的進(jìn)度??梢渣c(diǎn)擊“在后臺運(yùn)行”,以隱藏該對話框 在構(gòu)建的同時(shí),在右下角的“構(gòu)建信息”視圖輸出構(gòu)建過程中的詳細(xì)信息: 注:“重新構(gòu)建”將本項(xiàng)目中的全部源代碼進(jìn)行一次完全的編譯和連接,花費(fèi)時(shí)間較多?!皹?gòu)建項(xiàng)目”則僅僅將新修改過的源代碼進(jìn)行編譯和連接,花費(fèi)時(shí)間最少?!爸亟˙SP及項(xiàng) 目”,不但要完成“重新構(gòu)建”的全部工作,另外還要編譯與該項(xiàng)目有關(guān)的的LambdaEDU 中內(nèi)置的部分代碼,花費(fèi)時(shí)間最多。但是在項(xiàng)目剛建立后,第一次構(gòu)建時(shí)需要選擇“重建 BSP 及項(xiàng)目”。以后的構(gòu)建中選擇“重新構(gòu)建”或“構(gòu)建項(xiàng)目”即可。另外,在替換了源代 碼中的文件后,需要選擇“重新構(gòu)建”來完成該項(xiàng)目的構(gòu)建。 4.配置虛擬機(jī)和目標(biāo)機(jī)代理 (1)制作X86啟動盤 在 LambdaEDU 中依次點(diǎn)擊“工具”、“Bochs”、“制作虛擬機(jī)啟動映象”。對啟動盤進(jìn)行一些參數(shù)設(shè)置后(如下圖所示),系統(tǒng)將自動為你生成一個(gè)PC 虛擬機(jī)的 啟動盤映像。 (2)配置虛擬機(jī) 選擇使用的網(wǎng)絡(luò)適配器(網(wǎng)卡)后,點(diǎn)擊“確定”完成配置。 注意:如果計(jì)算機(jī)上有多網(wǎng)卡,請將其他網(wǎng)卡停用(包括 VMware 虛擬機(jī)添加的虛擬 網(wǎng)卡)。 (3)創(chuàng)建目標(biāo)機(jī)代理 配置好虛擬機(jī)后,創(chuàng)建目標(biāo)機(jī)代理:點(diǎn)擊LambdaEDU 左下方窗口中綠色的十字符號,在彈出的窗口中選擇“基于TA 的連接方式”,并點(diǎn)擊“下一步”。 在彈出的“新目標(biāo)機(jī)連接配置中”的這些參數(shù),應(yīng)該與之前制作啟動盤時(shí)設(shè)置的參數(shù)一致。 注意: 名字:輸入目標(biāo)機(jī)的名字(缺省是 default),注意如果和現(xiàn)有目標(biāo)機(jī)重名的話,改個(gè)名 字。 連接類型:默認(rèn)選擇 UDP IP地址:這里輸入目標(biāo)機(jī)(在本實(shí)驗(yàn)系統(tǒng)中是虛擬機(jī))的 IP地址; 最后點(diǎn)擊“確定”,在目標(biāo)機(jī)管理窗口中,可以看到新增加了一個(gè)名為default 的目標(biāo)機(jī) 節(jié)點(diǎn) (4)調(diào)試應(yīng)用 啟動虛擬機(jī)。 虛擬機(jī)啟動后的畫面如下(其中顯示的IP 地址創(chuàng)建虛擬機(jī)啟動盤時(shí)填入的IP 地址)中設(shè)置的IP 地址): 在成功完成構(gòu)建的項(xiàng)目ucos_x86_demo 中的“pc386_elf_tra_debug”上點(diǎn)擊鼠標(biāo)右鍵,在彈出的菜單中選擇“調(diào)試”,啟動調(diào)試器調(diào)試生成的程序: 第一次進(jìn)行調(diào)試/運(yùn)行,需要選擇目標(biāo)機(jī),如下圖,選擇“Default”,點(diǎn)擊“確定”,開 始向目標(biāo)機(jī)(虛擬機(jī))下載應(yīng)用程序。程序下載完成后,會彈出一個(gè)“確認(rèn)透視圖切換”對話框,選擇“是”,切換到調(diào)試透 視圖。 調(diào)試的界面如下: 點(diǎn)擊綠色的按鈕,全速運(yùn)行。 注意:全速運(yùn)行后,程序不能夠被暫停和停止。 三、實(shí)驗(yàn)過程中遇到的問題及體會 在設(shè)置IP地址時(shí),要求該IP地址與本計(jì)算機(jī)在同一個(gè)子網(wǎng)中,同時(shí)要求該 IP地址沒有被網(wǎng)絡(luò)上其他計(jì)算機(jī)使用。此外,通過構(gòu)建開發(fā)環(huán)境,處次體驗(yàn)到了嵌入式開發(fā)工作的樂趣。 實(shí)驗(yàn)二 任務(wù)的基本管理 一、實(shí)驗(yàn)?zāi)康?/p> 1.理解任務(wù)管理的基本原理,了解任務(wù)的各個(gè)基本狀態(tài)及其變遷過程; 2.掌握 uC/OS-II 中任務(wù)管理的基本方法(創(chuàng)建、啟動、掛起、解掛任務(wù)); 3.熟練使用 uC/OS-II 任務(wù)管理的基本系統(tǒng)調(diào)用。 二、實(shí)驗(yàn)原理及程序結(jié)構(gòu) 1.實(shí)驗(yàn)設(shè)計(jì) 為了展現(xiàn)任務(wù)的各種基本狀態(tài)及其變遷過程,本實(shí)驗(yàn)設(shè)計(jì)了 Task0、Task1 兩個(gè)任務(wù): 任務(wù) Task0 不斷地掛起自己,再被任務(wù) Task1 解掛,兩個(gè)任務(wù)不斷地切換執(zhí)行。通過本實(shí)驗(yàn),讀者可以清晰地了解到任務(wù)在各個(gè)時(shí)刻的狀態(tài)以及狀態(tài)變遷的原因。2.運(yùn)行流程 描述如下: (1)系統(tǒng)經(jīng)歷一系列的初始化過程后進(jìn)入 boot_card()函數(shù),在其中調(diào)用 ucBsp_init()進(jìn) 行板級初始化后,調(diào)用 main()函數(shù); (2)main()函數(shù)調(diào)用 OSInit()函數(shù)對 uC/OS-II 內(nèi)核進(jìn)行初始化,調(diào)用 OSTaskCreate 創(chuàng) 建起始任務(wù) TaskStart; (3)main()函數(shù)調(diào)用函數(shù) OSStart()啟動 uC/OS-II 內(nèi)核的運(yùn)行,開始多任務(wù)的調(diào)度,執(zhí) 行當(dāng)前優(yōu)先級最高的就緒任務(wù) TaskStart;(4)TaskStart 完成如下工作: a、安裝時(shí)鐘中斷并初始化時(shí)鐘,創(chuàng)建 2 個(gè)應(yīng)用任務(wù); b、掛起自己(不再被其它任務(wù)喚醒),系統(tǒng)切換到當(dāng)前優(yōu)先級最高的就緒任務(wù)Task0。之后整個(gè)系統(tǒng)的運(yùn)行流程如下: ? t1 時(shí)刻,Task0 開始執(zhí)行,它運(yùn)行到 t2 時(shí)刻掛起自己; ? t2 時(shí)刻,系統(tǒng)調(diào)度處于就緒狀態(tài)的優(yōu)先級最高任務(wù) Task1 執(zhí)行,它在 t3 時(shí)刻喚醒Task0,后者由于優(yōu)先級較高而搶占 CPU; ? Task0 執(zhí)行到 t4 時(shí)刻又掛起自己,內(nèi)核調(diào)度 Task1 執(zhí)行; ? Task1 運(yùn)行至 t5 時(shí)刻再度喚醒 Task0; ? …… 3.μC/OS-Ⅱ中的任務(wù)描述 一個(gè)任務(wù)通常是一個(gè)無限的循環(huán),由于任務(wù)的執(zhí)行是由操作系統(tǒng)內(nèi)核調(diào)度的,因此任務(wù)是絕不會返回的,其返回參數(shù)必須定義成 void。在μC/OS-Ⅱ中,當(dāng)一個(gè)運(yùn)行著的任務(wù)使一個(gè)比它優(yōu)先級高的任務(wù)進(jìn)入了就緒態(tài),當(dāng)前任務(wù)的 CPU 使用權(quán)就會被搶占,高優(yōu)先級任務(wù)會立刻得到 CPU 的控制權(quán)(在系統(tǒng)允許調(diào)度和任務(wù)切換的前提下)。μC/OS-Ⅱ可以管理多達(dá) 64 個(gè)任務(wù),但目前版本的μC/OS-Ⅱ有兩個(gè)任務(wù)已經(jīng)被系統(tǒng)占用了(即空閑任務(wù)和統(tǒng)計(jì)任務(wù))。必須給每個(gè)任務(wù)賦以不同的優(yōu)先級,任務(wù)的優(yōu)先級號就是任務(wù)編號(ID),優(yōu)先級可以從 0 到 OS_LOWEST_PR10-2。優(yōu)先級號越低,任務(wù)的優(yōu)先級越高。μC/OS-Ⅱ總是運(yùn)行進(jìn)入就緒態(tài)的優(yōu)先級最高的任務(wù)。4.源程序說明(1)TaskStart任務(wù) TaskStart 任務(wù)負(fù)責(zé)安裝操作系統(tǒng)的時(shí)鐘中斷服務(wù)例程、初始化操作系統(tǒng)時(shí)鐘,并創(chuàng)建所 有的應(yīng)用任務(wù): UCOS_CPU_INIT();/* Install uC/OS-II's clock tick ISR */ UCOS_TIMER_START();/*Timer 初始化*/ TaskStartCreateTasks();/* Create all the application tasks */ OSTaskSuspend(OS_PRIO_SELF); 具體負(fù)責(zé)應(yīng)用任務(wù)創(chuàng)建的 TaskStartCreateTasks 函數(shù)代碼如下,它創(chuàng)建了兩個(gè)應(yīng)用任務(wù) Task0 和 Task1: void TaskStartCreateTasks(void){ INT8U i; for(i = 0;i < N_TASKS;i++)// Create tasks { TaskData[i] = i;// Each task will display itsown information } OSTaskCreate(Task0,(void *)&TaskData[0], &TaskStk[0][TASK_STK_SIZE1], 6);} TaskStart 任務(wù)完成上述操作后將自己掛起,操作系統(tǒng)將調(diào)度當(dāng)前優(yōu)先級最高的應(yīng)用任務(wù)Task0 運(yùn)行。(2)應(yīng)用任務(wù) 應(yīng)用任務(wù) Task0 運(yùn)行后將自己掛起,之后操作系統(tǒng)就會調(diào)度處于就緒狀態(tài)的優(yōu)先級最高的任務(wù),具體代碼如下: void Task0(void *pdata){ INT8U i;INT8U err;i=*(int *)pdata;for(;;){ printf(“Application tasks switched %d times!nr”,++count); printf(“TASK_0 IS RUNNING..............................................................nr”);printf(“task_1 is suspended!nr”); printf(“**************************************************nr”);err=OSTaskSuspend(5);// suspend itself } } 應(yīng)用任務(wù) Task1 運(yùn)行后將 Task0 喚醒,使其進(jìn)入到就緒隊(duì)列中: void Task1(void *pdata){ INT8U i;INT8U err;i=*(int *)pdata;for(;;){ OSTimeDly(150); printf(“Application tasks switched %d times!nr”,++count);printf(“task_0 is suspended!nr”);printf(“TASK_1 IS RUNNING..............................................................nr”);printf(“**************************************************nr”);OSTimeDly(150); err=OSTaskResume(5);/* resume task0 */ } } 三、運(yùn)行及觀察應(yīng)用輸出信息 按照本實(shí)驗(yàn)手冊第一部分所描述的方法建立應(yīng)用項(xiàng)目并完成構(gòu)建,當(dāng)我們在 LambdaEDU 調(diào)試器的控制下運(yùn)行構(gòu)建好的程序后,將看到在μC/OS-Ⅱ內(nèi)核的調(diào)度管理下,兩個(gè)應(yīng)用任務(wù)不斷切換執(zhí)行的情形: 四、本實(shí)驗(yàn)中用到的μC/OS-Ⅱ相關(guān)函數(shù) 4.1 OSTaskCreate() OSTaskCreate()建立一個(gè)新任務(wù)。任務(wù)的建立可以在多任務(wù)環(huán)境啟動之前,也可以在 正在運(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ì)說明請參考所用處理器的手冊。函數(shù)原型: INT8U OSTaskCreate(void(*task)(void *pd), void *pdata, OS_STK *ptos, INT8U prio); 參數(shù)說明: task 是指向任務(wù)代碼首地址的指針。 pdata 指向一個(gè)數(shù)據(jù)結(jié)構(gòu),該結(jié)構(gòu)用來在建立任務(wù)時(shí)向任務(wù)傳遞參數(shù)。 ptos 為指向任務(wù)堆棧棧頂?shù)闹羔?。任?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)存高地址 向 低 地 址 增 長,此時(shí) ptos 應(yīng) 該 指 向任 務(wù)堆 棧 空 間 的 最 高 地 址。反 之,如 果OS_STK_GROWTH 設(shè)為 0,堆棧將從內(nèi)存的低地址向高地址增長。prio 為任務(wù)的優(yōu)先級。每個(gè)任務(wù)必須有一個(gè)唯一的優(yōu)先級作為標(biāo)識。數(shù)字越小,優(yōu)先級越高。返回值: OSTaskCreate()的返回值為下述之一: ? OS_NO_ERR:函數(shù)調(diào)用成功。 ? OS_PRIO_EXIST:具有該優(yōu)先級的任務(wù)已經(jīng)存在。 ? OS_PRIO_INVALID:參數(shù)指定的優(yōu)先級大于 OS_LOWEST_PRIO。? OS_NO_MORE_TCB:系統(tǒng)中沒有 OS_TCB 可以分配給任務(wù)了。注意: 任務(wù)堆棧必須聲明為 OS_STK 類型。 在任務(wù)中必須調(diào)用μC/OS 提供的下述過程之一:延時(shí)等待、任務(wù)掛起、等待事件發(fā)生(等待信號量,消息郵箱、消息隊(duì)列),以使其他任務(wù)得到 CPU。用 戶 程 序 中 不 能 使 用 優(yōu) 先 級 0,1,2,3,以 及 OS_LOWEST_PRIO-3, OS_LOWEST_PRIO-2, OS_LOWEST_PRIO-1, OS_LOWEST_PRIO。這些優(yōu)先級μC/OS 系統(tǒng) 保留,其余的 56 個(gè)優(yōu)先級提供給應(yīng)用程序。4.2 OSTaskSuspend() OSTaskSuspend()無條件掛起一個(gè)任務(wù)。調(diào)用此函數(shù)的任務(wù)也可以傳遞參數(shù) OS_PRIO_SELF,掛起調(diào)用任務(wù)本身。當(dāng)前任務(wù)掛起后,只有其他任務(wù)才能喚醒。任務(wù)掛起 后,系統(tǒng)會重新進(jìn)行任務(wù)調(diào)度,運(yùn)行下一個(gè)優(yōu)先級最高的就緒任務(wù)。喚醒掛起任務(wù)需要調(diào)用 函數(shù) OSTaskResume()。 任務(wù)的掛起是可以疊加到其他操作上的。例如,任務(wù)被掛起時(shí)正在進(jìn)行延時(shí)操作,那么 任務(wù)的喚醒就需要兩個(gè)條件:延時(shí)的結(jié)束以及其他任務(wù)的喚醒操作。又如,任務(wù)被掛起時(shí)正 在等待信號量,當(dāng)任務(wù)從信號量的等待對列中清除后也不能立即運(yùn)行,而必須等到被喚醒后。函數(shù)原型: INT8U OSTaskSuspend(INT8U prio);參數(shù)說明: prio 為指定要獲取掛起的任務(wù)優(yōu)先級,也可以指定參數(shù) OS_PRIO_SELF,掛起任務(wù)本 身。此時(shí),下一個(gè)優(yōu)先級最高的就緒任務(wù)將運(yùn)行。返回值: OSTaskSuspend()的返回值為下述之一: ? OS_NO_ERR:函數(shù)調(diào)用成功。 ? OS_TASK_ SUSPEND_IDLE:試圖掛起 μC/OS-II 中的空閑任務(wù)(Idle task)。此為非法操作。 ? OS_PRIO_INVALID :參數(shù)指定的優(yōu)先級大于 OS_LOWEST_PRIO 或沒有設(shè)定 ? OS_PRIO_SELF 的值。 ? OS_TASK_ SUSPEND _PRIO:要掛起的任務(wù)不存在。注意: 在程序中 OSTaskSuspend()和 OSTaskResume()應(yīng)該成對使用。用 OSTaskSuspend()掛起的任務(wù)只能用 OSTaskResume()喚醒。4.3 OSTaskResume() OSTaskResume()喚醒一個(gè)用 OSTaskSuspend()函數(shù)掛起的任務(wù)。OSTaskResume()也是唯一能“解掛”掛起任務(wù)的函數(shù)。函數(shù)原型: INT8UOSTaskResume(INT8U prio);參數(shù)說明: prio 指定要喚醒任務(wù)的優(yōu)先級。返回值: OSTaskResume()的返回值為下述之一: ? OS_NO_ERR:函數(shù)調(diào)用成功。 ? OS_TASK_RESUME_PRIO:要喚醒的任務(wù)不存在。 ? OS_TASK_NOT_SUSPENDED:要喚醒的任務(wù)不在掛起狀態(tài)。 ? OS_PRIO_INVALID:參數(shù)指定的優(yōu)先級大于或等于 OS_LOWEST_PRIO。 五、實(shí)驗(yàn)過程中遇到的問題及體會 實(shí)驗(yàn)過程中體會到了嵌入式開發(fā)的樂趣,對上課老師所講的內(nèi)容有了進(jìn)一步的認(rèn)識與理解。17 實(shí)驗(yàn)三 信號量:哲學(xué)家就餐問題的實(shí)現(xiàn) 一、實(shí)驗(yàn)?zāi)康?/p> 掌握在基于嵌入式實(shí)時(shí)操作系統(tǒng) uC/OS-II 的應(yīng)用中,任務(wù)使用信號量的一般原理。通 過經(jīng)典的哲學(xué)家就餐實(shí)驗(yàn),了解如何利用信號量來對共享資源進(jìn)行互斥訪問。 二、實(shí)驗(yàn)原理及程序結(jié)構(gòu) 1.實(shí)驗(yàn)設(shè)計(jì) 掌握在基于嵌入式實(shí)時(shí)操作系統(tǒng) uC/OS-II 的應(yīng)用中,任務(wù)使用信號量的一般原理。通 過經(jīng)典的哲學(xué)家就餐實(shí)驗(yàn),了解如何利用信號量來對共享資源進(jìn)行互斥訪問。2.源程序說明 五個(gè)哲學(xué)家任務(wù)(ph1、ph2、ph3、ph4、ph5)主要有兩種過程:思考(即睡眠一段時(shí) 間)和就餐。每個(gè)哲學(xué)家任務(wù)在就餐前必須申請并獲得一左一右兩支筷子,就餐完畢后釋放 這兩支筷子。五個(gè)哲學(xué)家圍成一圈,每兩人之間有一支筷子。一共有五支筷子,在該實(shí)驗(yàn)中 用了五個(gè)互斥信號量來代表。每個(gè)任務(wù)的代碼都一樣,如下所示: void Task(void *pdata){ INT8U err;INT8U i;INT8U j; i=*(int *)pdata;j=(i+1)% 5; uC/OS-II 實(shí)驗(yàn)指導(dǎo)書 for(;;){ TaskThinking2Hungry(i);OSSemPend(fork[i], 0, &err); OSSemPend(fork[j], 0, &err);/* Acquire semaphores to eat */ TaskEat(i); OSSemPost(fork[j]); OSSemPost(fork[i]);/* Release semaphore */ OSTimeDly(200);/* Delay 10 clock tick */ } } 操作系統(tǒng)配置 修改 uC_OS-II/OS_CFG.h: :: : #define OS_MAX_EVENTS 10 /*最多可以有 10 個(gè)事件*/ #define OS_MAX_FLAGS 5 /*最多可以有 5 個(gè)事件標(biāo)志*/ #define OS_MAX_MEM_PART 5 /*最多可以劃分 5 個(gè)內(nèi)存塊*/ #define OS_MAX_QS 2 /*最多可以使用 2 個(gè)隊(duì)列*/ #define OS_MAX_TASKS 8 /*最多可以創(chuàng)建 8 個(gè)任務(wù)*/ #define OS_LOWEST_PRIO 14 /*任務(wù)優(yōu)先級不可以大于 14*/ #define OS_TASK_IDLE_STK_SIZE 1024 /*空閑任務(wù)堆棧大小*/ #define OS_TASK_STAT_EN 1 /*是否允許使用統(tǒng)計(jì)任務(wù)*/ #define OS_TASK_STAT_STK_SIZE 1024 /*統(tǒng)計(jì)任務(wù)堆棧大小*/ #define OS_FLAG_EN 1 /*是否允許使用事件標(biāo)志功能*/ #define OS_FLAG_WAIT_CLR_EN 1 /*是否允許等待清除事件標(biāo)志*/ #define OS_FLAG_ACCEPT_EN 1 /*是否允許使用 OSFlagAccept()*/ #define OS_FLAG_DEL_EN 1 /*是否允許使用 OSFlagDel()*/ #define OS_FLAG_QUERY_EN 1 /*是否允許使用 OSFlagQuery()*/ #define OS_MBOX_EN 0 /*是否允許使用郵箱功能*/ #define OS_MEM_EN 0 /*是否允許使用內(nèi)存管理的功能*/ #define OS_MUTEX_EN 0 /*是否允許使用互斥信號量的功能*/ #define OS_Q_EN 0 /*是否允許使用隊(duì)列功能*/ #define OS_SEM_EN 1 /*是否允許使用信號量功能*/ #define OS_SEM_ACCEPT_EN 1 /*是否允許使用 OSSemAccept()*/ #define OS_SEM_DEL_EN 1 /*是否允許使用OSSemDel()*/ #define OS_SEM_QUERY_EN 1 /*是否允許使用OSSemQuery()*/ #define OS_TASK_CHANGE_PRIO_EN 1 /* 是 否 允 許 使 用 OSTaskChangePrio()*/ #define OS_TASK_CREATE_EN 1 /*是否允許使用 OSTaskCreate()*/ #define OS_TASK_CREATE_EXT_EN 1 /*是否允許使用 OSTaskCreateExt()*/ #define OS_TASK_DEL_EN 1 /*是否允許使用 OSTaskDel()*/ #define OS_TASK_SUSPEND_EN 1 /* 是 否 允 許 使 用 OSTaskSuspend()and OSTaskResume()*/ #define OS_TASK_QUERY_EN 1 /*是否允許使用 OSTaskQuery()*/ #define OS_TIME_DLY_HMSM_EN 1 /* 是 否 允 許 使 用 OSTimeDlyHMSM()*/ #define OS_TIME_DLY_RESUME_EN 1 /* 是 否 允 許 使 用 OSTimeDlyResume()*/ #define OS_TIME_GET_SET_EN 1 /* 是否允許使用 OSTimeGet()和 OSTimeSet()*/ #define OS_SCHED_LOCK_EN 1 /* 是 否 允 許 使 用 OSSchedLock()和 OSSchedUnlock()*/ #define OS_TICKS_PER_SEC 200 /*設(shè)置每秒之內(nèi)的時(shí)鐘節(jié)拍數(shù)目*/ 三、運(yùn)行及觀察應(yīng)用輸出信息 開始,所有的哲學(xué)家先處于 thinking 狀態(tài),然后都進(jìn)入 hungry 狀態(tài): 后首先獲得兩個(gè)信號量的 1、3 號哲學(xué)家開始 eating,待他們釋放相關(guān)信號量之后,哲 學(xué)家 2、5、4 獲得所需的信號量并 eating: 應(yīng)用如此這般地循環(huán)執(zhí)行程序下去?? 四、本實(shí)驗(yàn)中用到的μC/OS-Ⅱ相關(guān)函數(shù) 4.1 OSSemCreate() OSSemCreate()函數(shù)建立并初始化一個(gè)信號量。信號量的作用如下: ? 允許一個(gè)任務(wù)和其他任務(wù)或者中斷同步 ? 取得設(shè)備的使用權(quán) ? 標(biāo)志事件的發(fā)生 函數(shù)原型: OS_EVENT *OSSemCreate((((WORD value))))參數(shù)說明: value 參數(shù)是所建立的信號量的初始值,可以取 0 到 65535 之間的任何值。返回值: OSSemCreate()函數(shù)返回指向分配給所建立的信號量的控制塊的指針。如果沒有可用的 控制塊,OSSemCreate()函數(shù)返回空指針。注意: 必須先建立信號量,然后使用。4.2 OSSemPend() OSSemPend()函數(shù)用于任務(wù)試圖取得設(shè)備的使用權(quán),任務(wù)需要和其他任務(wù)或中斷同 步,任務(wù)需要等待特定事件的發(fā)生的場合。如果任務(wù)調(diào)用 OSSemPend()函數(shù)時(shí),信號量 的值大于零,OSSemPend()函數(shù)遞減該值并返回該值。如果調(diào)用時(shí)信號量等于零,OSSemPend()函數(shù)函數(shù)將任務(wù)加入該信號量的等待隊(duì)列。OSSemPend()函數(shù)掛起當(dāng)前 任務(wù)直到其他的任務(wù)或中斷置起信號量或超出等待的預(yù)期時(shí)間。如果在預(yù)期的時(shí)鐘節(jié)拍內(nèi)信 號量被置起,μC/OS-Ⅱ默認(rèn)最高優(yōu)先級的任務(wù)取得信號量恢復(fù)執(zhí)行。一個(gè)被 OSTaskSuspend()函數(shù)掛起的任務(wù)也可以接受信號量,但這個(gè)任務(wù)將一直保持掛起狀態(tài)直到通過調(diào)用 OSTaskResume()函數(shù)恢復(fù)任務(wù)的運(yùn)行。函數(shù)原型: :: : Void OSSemPend(OS_EVNNT *pevent, INT16U timeout, int8u *err);參數(shù)說明: :: : pevent 是指向信號量的指針。該指針的值在建立該信號量時(shí)可以得到。(參考 OSSemCreate()函數(shù))。 Timeout 允許一個(gè)任務(wù)在經(jīng)過了指定數(shù)目的時(shí)鐘節(jié)拍后還沒有得到需要的信號量時(shí) 恢復(fù)就緒狀態(tài)。如果該值為零表示任務(wù)將持續(xù)地等待信號量,最大的等待時(shí)間為 65535 個(gè)時(shí) 鐘節(jié)拍。這個(gè)時(shí)間長度并不是非常嚴(yán)格的,可能存在一個(gè)時(shí)鐘節(jié)拍的誤差。 Err 是指向包含錯(cuò)誤碼的變量的指針。OSSemPend()函數(shù)返回的錯(cuò)誤碼可能為下述幾 種: ? OS_NO_ERR :信號量不為零。 ? OS_TIMEOUT :信號量沒有在指定數(shù)目的時(shí)鐘周期內(nèi)被設(shè)置。 ? OS_ERR_PEND_ISR :從中斷調(diào)用該函數(shù)。雖然規(guī)定了不允許從中斷調(diào)用該函數(shù),但 μC/OS-Ⅱ仍然包含了檢測這種情況的功能。 ? OS_ERR_EVENT_TYPE :pevent 不是指向信號量的指針。返回值: 無 注意: 必須先建立信號量,然后使用。不允許從中斷調(diào)用該函數(shù)。 4.3 OSSemPost() OSSemPost()函數(shù)置起指定的信號量。如果指定的信號量是零或大于零,OSSemPost()函數(shù)遞增該信號量并返回。如果有任何任務(wù)在等待信號量,最高優(yōu)先級的任務(wù)將得到信 號量并進(jìn)入就緒狀態(tài)。任務(wù)調(diào)度函數(shù)將進(jìn)行任務(wù)調(diào)度,決定當(dāng)前運(yùn)行的任務(wù)是否仍然為最高 優(yōu)先級的就緒狀態(tài)的任務(wù)。函數(shù)原型: INT8U OSSemPost(OS_EVENT *pevent);參數(shù)說明: pevent 是指向信號量的指針。該指針的值在建立該信號量時(shí)可以得到。(參考 OSSemCreate()函數(shù))。返回值: OSSemPost()函數(shù)的返回值為下述之一: ? OS_NO_ERR :信號量被成功地設(shè)置 ? OS_SEM_OVF :信號量的值溢出 ? OS_ERR_EVENT_TYPE :pevent 不是指向信號量的指針 注意: 必須先建立信號量,然后使用。4.4 OSTimeDly() OSTimeDly()將一個(gè)任務(wù)延時(shí)若干個(gè)時(shí)鐘節(jié)拍。如果延時(shí)時(shí)間大于 0,系統(tǒng)將立即進(jìn) 行任務(wù)調(diào)度。延時(shí)時(shí)間的長度可從 0 到 65535 個(gè)時(shí)鐘節(jié)拍。延時(shí)時(shí)間 0 表示不進(jìn)行延時(shí),函 數(shù)將立即返回調(diào)用者。延時(shí)的具體時(shí)間依賴于系統(tǒng)每秒鐘有多少時(shí)鐘節(jié)拍(由文件 SO_CFG.H 中的常量 OS_TICKS_PER_SEC 設(shè)定)。函數(shù)原型: void OSTimeDly(INT16U ticks);參數(shù)說明: ticks 為要延時(shí)的時(shí)鐘節(jié)拍數(shù)。返回值: 無 注意: 注意到延時(shí)時(shí)間 0 表示不進(jìn)行延時(shí)操作,而立即返回調(diào)用者。為了確保設(shè)定的延時(shí)時(shí)間,建議用戶設(shè)定的時(shí)鐘節(jié)拍數(shù)加 1。例如,希望延時(shí) 10 個(gè)時(shí)鐘節(jié)拍,可設(shè)定參數(shù)為 11。 五、實(shí)驗(yàn)過程中遇到的問題及體會 在實(shí)驗(yàn)前要對該問題進(jìn)行深入的理解,即五個(gè)哲學(xué)家任務(wù)(ph1、ph2、ph3、ph4、ph5)主要有兩種過程:思考(即睡眠一段時(shí)間)和就餐。每個(gè)哲學(xué)家任務(wù)在就餐前必須申請并獲得一左一右兩支筷子,就餐完畢后釋放這兩支筷子。五個(gè)哲學(xué)家圍成一圈,每兩人之間有一支筷子。只有理解了,才能更好的進(jìn)行實(shí)驗(yàn)。 華北水利水電大學(xué) North China University of Water Resources and Electric Power 嵌入式操作系統(tǒng)課程報(bào)告 題目 嵌入式系統(tǒng)課程綜和論述 學(xué) 院 物理與電子學(xué)院 專 業(yè) 電子信息工程 姓 名 李天澤 學(xué) 號 201816516 組 員 完成時(shí)間 2020.12.22 目 錄 一、嵌入式系統(tǒng)的介紹 (1)、嵌入式系統(tǒng)的概念……………………………………3 (2)、嵌入式系統(tǒng)的特點(diǎn)……………………………………4 二、嵌入式系統(tǒng)的發(fā)展和應(yīng)用……………………………5 三、總結(jié)和心得……………………………………………7 參考文獻(xiàn)……………………………………………7 附錄…………………………………………………8 摘要: 如今,嵌入式系統(tǒng)經(jīng)過半個(gè)多實(shí)際的發(fā)展和革新,在各個(gè)產(chǎn)業(yè)都可以看見它的身影。在電子消費(fèi)領(lǐng)域,它已經(jīng)廣泛應(yīng)用于手機(jī)、VCD、數(shù)字電視和路由器等常見家用電器和電子產(chǎn)品,或許在你的家里有著幾十甚至幾百個(gè)微型嵌入式計(jì)算機(jī)無時(shí)無刻地不在為你服務(wù)。 在工業(yè)控制方面,一輛豪華轎車的控制系統(tǒng)就包含著至少50個(gè)嵌入式微處理器,它們分布于火花塞、傳動軸和安全氣囊等等。而一架先進(jìn)的飛機(jī),一臺人造衛(wèi)星就可能包含著幾十套嵌入式系統(tǒng)和上百臺微型嵌入式計(jì)算機(jī),沒有這些裝載,飛機(jī)和衛(wèi)星的控制系統(tǒng)就不能有效地工作,它們的導(dǎo)航系統(tǒng)就不能滿足嚴(yán)格的要求。 在通信領(lǐng)域也有著數(shù)不勝數(shù)的嵌入式系統(tǒng)的應(yīng)用,由于帶寬網(wǎng)絡(luò)的發(fā)展,交換機(jī)、路由器和各種傳輸設(shè)備等都逐漸需要更多的嵌入式系統(tǒng)來滿足它們互聯(lián)的需求,而這些基于32位的嵌入式系統(tǒng)品種多樣,絕大多數(shù)都價(jià)格低廉,能夠?yàn)槠髽I(yè)和家庭的網(wǎng)絡(luò)選擇提供更加廉價(jià)而多樣的方案。 一、嵌入式系統(tǒng)的介紹 1、嵌入式系統(tǒng)的概念: 上世紀(jì)的40年代人類社會誕生了當(dāng)時(shí)最偉大的發(fā)明之一——計(jì)算機(jī)。1946年賓夕法尼亞大學(xué)研制出了世界上第一臺計(jì)算機(jī)“ENIAC”,吹響了人類向信息時(shí)代進(jìn)發(fā)的號角。如今半個(gè)多世紀(jì)過去了,總體來看,計(jì)算機(jī)已經(jīng)經(jīng)歷了兩個(gè)大的發(fā)展階段:大型計(jì)算機(jī)階段和個(gè)人中小型計(jì)算機(jī)階段。而今后,計(jì)算機(jī)技術(shù)將邁入下一個(gè)充滿機(jī)遇和挑戰(zhàn)的新階段—— “無處不在的計(jì)算機(jī)”階段,即“后PC發(fā)展階段”。“無處不在的計(jì)算機(jī)”是指在數(shù)以千計(jì)乃至萬計(jì)的計(jì)算機(jī)之間彼此相互關(guān)聯(lián),其與使用者的比例高達(dá)100%,這些計(jì)算機(jī)中包括有傳統(tǒng)的通用式計(jì)算機(jī)和嵌入式計(jì)算機(jī),而后者占絕大多數(shù),可以達(dá)到95%的比例。 施樂公司研究中心的主任Mark Weiser 認(rèn)為:“以長遠(yuǎn)的發(fā)展來看,PC和計(jì)算機(jī)工作站將逐漸衰落,因?yàn)橛?jì)算機(jī)將會變得無處不在,它們會在墻上,在手腕上,在口袋里等等,計(jì)算機(jī)將會像手寫紙一樣,隨用隨取,伸手可得?!?/p> 目前全世界范圍的計(jì)算機(jī)研究者都在逐步形成一種共識,那就是在計(jì)算機(jī)將來的發(fā)展中,它必然不會成為像科幻電影中的那種會背叛人類,傷害人類的機(jī)械怪物,恰恰相反它們將變得小巧玲瓏而且無處不在。它們會出現(xiàn)在任何你能看的見、聽得到、摸得著的地方,功能強(qiáng)大而且隨處可用,這就是“無處不在的計(jì)算機(jī)”。 嵌入式計(jì)算機(jī)系統(tǒng)就是所謂的“看不見的計(jì)算機(jī)”,一般情況下它只是運(yùn)行平臺,并不能作為獨(dú)立的開發(fā)平臺來使用。而且它不能夠被用戶編程,對用戶的I/O接口是專用的。所以不嚴(yán)謹(jǐn)?shù)卣f:任意包含可編程計(jì)算機(jī)的設(shè)備而且這種設(shè)備不是作為通用計(jì)算機(jī)而設(shè)計(jì)的都可以稱作嵌入式系統(tǒng)。 時(shí)至今日嵌入式系統(tǒng)已經(jīng)逐漸滲透到人們的日常生活中,但因?yàn)槠洳煌膽?yīng)用形式和相異的名稱,目前對嵌入式系統(tǒng)還沒有一個(gè)統(tǒng)一的定義。但一般認(rèn)為,它有以下概念: (1)嵌入式系統(tǒng)的中心是應(yīng)用功能,基礎(chǔ)是計(jì)算機(jī)技術(shù),其軟件和硬件可以裁剪,對應(yīng)用系統(tǒng)的功能、可靠性、成本、體積大小和功率損耗都有十分嚴(yán)格的要求和指標(biāo)。 (2)國際電氣和電子工程師協(xié)會認(rèn)為嵌入式系統(tǒng)的定義是“Device used to control, monitor, or assist the operation of equipment , machinery or plants.” (3)嵌入式系統(tǒng)是計(jì)算機(jī)技術(shù)、半導(dǎo)體技術(shù)、電子技術(shù)等與各個(gè)行業(yè)的具體應(yīng)用相結(jié)合后的產(chǎn)物,是一個(gè)技術(shù)集中、資源集中、應(yīng)用高度分散、技術(shù)不斷革新的集成系統(tǒng)。 2、嵌入式系統(tǒng)的特點(diǎn): 1)嵌入式系統(tǒng)通常都是多樣的有特定應(yīng)用功能的軟硬件綜合體,用于特定的任務(wù),其硬件和軟件設(shè)計(jì)都是高效而簡潔的。其中嵌入式軟件的應(yīng)用程序和操作程序是一體化的,不同于傳統(tǒng)的通用計(jì)算機(jī)操作系統(tǒng)和應(yīng)用程序有著分明的界限。 2)嵌入式系統(tǒng)能夠受到多個(gè)處理器和體系結(jié)構(gòu)的支持,不同于通用的計(jì)算機(jī)只能夠使用少數(shù)的處理器類型和體系結(jié)構(gòu)。目前已經(jīng)生產(chǎn)有上千種嵌人式微處理器和幾十種微處理器的體系結(jié)構(gòu),其中比較主流常見的有ARM,MIPS, PowerPC,X86和SuperH等。 4)嵌入式系統(tǒng)有實(shí)時(shí)性和可靠性的特點(diǎn),其主要表現(xiàn)在:目前絕大多數(shù)實(shí)時(shí)操作系統(tǒng)都是嵌人式系統(tǒng);嵌人式系統(tǒng)都有實(shí)時(shí)性的要求,其軟件通常都是固化或直接加載到內(nèi)存中運(yùn)行的,啟動十分快速 另外,嵌人式系統(tǒng)通常都有處錯(cuò)能力和自動復(fù)位的功能,目前在絕大多數(shù)嵌式系統(tǒng)中都包含著用于保證系統(tǒng)運(yùn)行可靠性的軟硬件處理機(jī)制,比如看門狗定時(shí)器和內(nèi)存保護(hù)重啟機(jī)制等。 5)嵌入式系統(tǒng)通常都使用可以適應(yīng)多種類型處理器、可裁剪量輕、實(shí)時(shí)性和可靠性高以及可以固化的。同嵌入式微處理器,嵌入式的操作系統(tǒng)也是多種多樣的,不僅可以支持多種處理器,還可以進(jìn)行裁剪量輕來匹配應(yīng)用的功能,而且規(guī)模較小,能夠節(jié)省資源等等。 二、嵌入式系統(tǒng)的發(fā)展和應(yīng)用 第一代電子計(jì)算機(jī)體積大,耗電快,而且可靠性和實(shí)時(shí)性都無法滿足嵌入式計(jì)算的要求。到了20世紀(jì)60年代,由晶體管、磁芯存儲制造的第二代計(jì)算機(jī)開始用于航海航空等領(lǐng)域,它的CPU能夠處理從電子系統(tǒng)傳來的信號,具有了數(shù)據(jù)總線的一些基本特性。而與此同時(shí),嵌人式計(jì)算機(jī)也逐步應(yīng)用于工業(yè)和制造等方面。 至60年代末,采用集成電路的第三代計(jì)算機(jī)問世,1965年發(fā)射Gemini3號是人們第一次使用機(jī)載數(shù)字計(jì)算機(jī)。而后的阿波羅探測飛船則使用了嵌人式計(jì)算機(jī)系統(tǒng)來提供和保障人機(jī)的交互功能來用于引導(dǎo)飛行。1963年DEC公司推廣了第一臺商用小型機(jī),它具有嵌入式系統(tǒng)的結(jié)構(gòu),具備單總線結(jié)構(gòu)、高速寄存器和實(shí)時(shí)性、可靠性強(qiáng)的中斷系統(tǒng)以及交叉存取功能,標(biāo)志著嵌入式系統(tǒng)的興起。 1971 年,英特爾公司成功推出了世界上第一片微處理器Intel 4004。它的體積小、質(zhì)量輕、價(jià)格實(shí)惠、使用方便,在當(dāng)時(shí)銷量很好,Intel公司將它進(jìn)一步改進(jìn)后推出了4位的微處理器4040和8位的8008。 1973-1977 年短短四年之間全球許多廠家推出了各種各樣的8位微處理器,其中比較流行的有英特爾公司的8080/ 8085系列,摩托羅拉公司的6800/6802系列,齊洛格公司的Z80和羅克韋爾公司的6502等。這些微處理器的廣泛應(yīng)用為嵌入式系統(tǒng)開辟了廣闊的市場,促成了嵌入式系統(tǒng)的快速發(fā)展。計(jì)算機(jī)廠商開始以插件的形式為用戶提供所需的OEM產(chǎn)品,并構(gòu)成符合用戶要求的微型控制計(jì)算機(jī),嵌入到系統(tǒng)設(shè)備中。 嵌入式系統(tǒng)的大發(fā)展還要?dú)w功于20世紀(jì)80年代軟件技術(shù)的進(jìn)步。最初的嵌入式計(jì)算機(jī)的軟件都是十分專用的,其程序也只能用匯編語言來編寫,因此嵌入式系統(tǒng)的開發(fā)周期過長,效率太低,不利于廣泛地推廣和應(yīng)用。得益于微電子技術(shù)的進(jìn)步,嵌入式計(jì)算機(jī)的軟件開發(fā)不再局限于匯編語言,可以使用C或PL等高級語言,是編程更加多樣和簡潔化,加快了嵌入式系統(tǒng)的開發(fā)效率。時(shí)間步入20世紀(jì)90年代,當(dāng)時(shí)對分布控制、柔性制造和數(shù)字通信電等技術(shù)有著巨大需求,而這種需求也刺激著嵌人式系統(tǒng)的軟硬技術(shù)的革新和發(fā)展,促進(jìn)了嵌入式系統(tǒng)的應(yīng)用擴(kuò)大化。 如今,嵌入式系統(tǒng)經(jīng)過半個(gè)多實(shí)際的發(fā)展和革新,在各個(gè)產(chǎn)業(yè)都可以看見它的身影。在電子消費(fèi)領(lǐng)域,它已經(jīng)廣泛應(yīng)用于手機(jī)、VCD、數(shù)字電視和路由器等常見家用電器和電子產(chǎn)品,或許在你的家里有著幾十甚至幾百個(gè)微型嵌入式計(jì)算機(jī)無時(shí)無刻地不在為你服務(wù)。 在工業(yè)控制方面,一輛豪華轎車的控制系統(tǒng)就包含著至少50個(gè)嵌入式微處理器,它們分布于火花塞、傳動軸和安全氣囊等等。而一架先進(jìn)的飛機(jī),一臺人造衛(wèi)星就可能包含著幾十套嵌入式系統(tǒng)和上百臺微型嵌入式計(jì)算機(jī),沒有這些裝載,飛機(jī)和衛(wèi)星的控制系統(tǒng)就不能有效地工作,它們的導(dǎo)航系統(tǒng)就不能滿足嚴(yán)格的要求。 在通信領(lǐng)域也有著數(shù)不勝數(shù)的嵌入式系統(tǒng)的應(yīng)用,由于帶寬網(wǎng)絡(luò)的發(fā)展,交換機(jī)、路由器和各種傳輸設(shè)備等都逐漸需要更多的嵌入式系統(tǒng)來滿足它們互聯(lián)的需求,而這些基于32位的嵌入式系統(tǒng)品種多樣,絕大多數(shù)都價(jià)格低廉,能夠?yàn)槠髽I(yè)和家庭的網(wǎng)絡(luò)選擇提供更加廉價(jià)而多樣的方案。 時(shí)至今日,嵌入式系統(tǒng)的應(yīng)用已經(jīng)從微至著,廣泛分布。但它還在不斷地更新發(fā)展,其構(gòu)成的計(jì)算機(jī)也會變得更小巧,更靈敏,更高效,更智能,相信在未來的某一天,會如Mark Weiser所說的那樣:“它們會在墻上,在手腕上,在口袋里,就像手寫紙一樣,隨用隨取,伸手可得?!?/p> 三、總結(jié)和心得 嵌入式系統(tǒng)作為一門計(jì)算機(jī)開發(fā)的學(xué)科,有著不同于傳統(tǒng)通用計(jì)算機(jī)系統(tǒng)的特點(diǎn)和概念,具有獨(dú)特長處。同時(shí)它的應(yīng)用遍布于電子消費(fèi)、通信工程、工業(yè)控制和軍事國防等多種領(lǐng)域,其發(fā)展前景是非常廣闊的,是一門十分值得深入學(xué)習(xí)和研究的學(xué)科。 通過一個(gè)學(xué)期的學(xué)習(xí),我了解了許多嵌入式實(shí)時(shí)操作系統(tǒng)的應(yīng)用知識,比如“任務(wù)的管理和調(diào)度”、“同步、互斥與通信”以及“中斷和時(shí)間管理”等全新的理論知識,同時(shí)也通過多次的實(shí)驗(yàn)操作理解了對嵌入式系統(tǒng)軟硬件工作方式和應(yīng)用。所謂溫故而知新,通過撰寫課程報(bào)告,我對嵌入式系統(tǒng)的各個(gè)方面有了新的了解,大大提高了對這門學(xué)科的興趣,在今后的學(xué)習(xí)中,我也會更加深入地去學(xué)習(xí)這門課程的相關(guān)內(nèi)容,豐富自己的知識領(lǐng)域,開闊眼界,掌握更多的技能,為自己將來的發(fā)展做好鋪墊。 參考文獻(xiàn): 甄鵬------《嵌入式實(shí)時(shí)Linux的移植及應(yīng)用技術(shù)的研究》2008,(02) 郭軍------《基于Petri網(wǎng)的嵌入式系統(tǒng)高層級設(shè)計(jì)方法與技術(shù)研究》2007,(04) 吳敏------《基于嵌入式的家庭網(wǎng)關(guān)控制平臺的研究與設(shè)計(jì)》2007,(05) 劉青云;焦鉻-------《嵌入式Web Service模型實(shí)現(xiàn)及應(yīng)用》2019,(01) 田婧---------《嵌入式μCOSⅡ在DSP中的移植與應(yīng)用研究》2007,(04) 附錄 附查重報(bào)告: 第1章 1.嵌入式系統(tǒng)是指操作系統(tǒng)和功能軟件集成于計(jì)算機(jī)硬件系統(tǒng)之中。嵌入式系統(tǒng)一般有3個(gè)主要的組成部分:硬件、實(shí)時(shí)操作系統(tǒng)以及應(yīng)用軟件。 2.嵌入式系統(tǒng)的三要素是嵌入、專用、計(jì)算機(jī);即以應(yīng)用為中心、以計(jì)算機(jī)技術(shù)為基礎(chǔ)、軟件硬件可裁剪、適應(yīng)應(yīng)用系統(tǒng)對功能、可靠性、成本、體積、功耗嚴(yán)格要求的專用計(jì)算機(jī)系統(tǒng)。 3.目前國際較為知名的有:VxWorks、NeutrinoRTOS、Nucleus Plus、OS/ 9、VRTX、LynuxOS,RTLinux、BlueCat RT等。 4.嵌入式系統(tǒng)一般由硬件層、中間層、軟件層和功能層組成。其作用分別如下: (1)硬件層 :由嵌入式微處理器、外圍電路和外設(shè)組成。操作系統(tǒng)和應(yīng)用程序都可以固化在ROM或者Flash中。為方便使用,有的模塊在此基礎(chǔ)上增加了LCD、鍵盤、USB接口,以及其他一些功能的擴(kuò)展電路。 (2)中間層 :硬件層與軟件層之間為中間層,其作用將系統(tǒng)軟件與底層硬件部分隔離,使得系統(tǒng)的底層設(shè)備驅(qū)動程序與硬件無關(guān); (3)軟件層 :主要是操作系統(tǒng),有的還包括文件系統(tǒng)、圖形用戶接口和網(wǎng)絡(luò)系統(tǒng)等。操作系統(tǒng)是一個(gè)標(biāo)準(zhǔn)的內(nèi)核,將中斷、I/O、定時(shí)器等資源都封裝起來,以方便用戶使用。(4)功能層 :由基于操作系統(tǒng)開發(fā)的應(yīng)用程序組成,用來完成對被控對象的控制功能。5.非占先式調(diào)度法也稱作合作型多任務(wù)(cooperative multitasking),各個(gè)任務(wù)彼此合作共享一個(gè)CPU。中斷服務(wù)可以使一個(gè)高優(yōu)先級的任務(wù)由掛起狀態(tài)變?yōu)榫途w狀態(tài)。但中斷服務(wù)以后控制權(quán)還是回到原來被中斷了的那個(gè)任務(wù),直到該任務(wù)主動放棄CPU的使用權(quán)時(shí),那個(gè)高優(yōu)先級的任務(wù)才能獲得CPU的使用權(quán)。當(dāng)系統(tǒng)響應(yīng)時(shí)間很重要時(shí),要使用占先式(preemptive)內(nèi)核。最高優(yōu)先級的任務(wù)一旦就緒,總能得到CPU的控制權(quán)。當(dāng)一個(gè)運(yùn)行著的任務(wù)使一個(gè)比它優(yōu)先級高的任務(wù)進(jìn)入了就緒態(tài),當(dāng)前任務(wù)的CPU使用權(quán)就被剝奪了。6.在實(shí)時(shí)系統(tǒng)中,如果系統(tǒng)在指定的時(shí)間內(nèi)未能實(shí)現(xiàn)某個(gè)確定的任務(wù),會導(dǎo)致系統(tǒng)的全面失敗,這樣的系統(tǒng)被稱硬實(shí)時(shí)系統(tǒng)。在弱實(shí)時(shí)系統(tǒng)中,超時(shí)卻不會發(fā)生致命的錯(cuò)誤。其實(shí)時(shí)性的要求比硬實(shí)時(shí)系統(tǒng)要差一些。 7.嵌入式系統(tǒng)的設(shè)計(jì)步驟及各部分的主要工作如下。(1)需求分析階段,羅列出用戶的需求; (2)體系結(jié)構(gòu)設(shè)計(jì)階段,描述系統(tǒng)的功能如何實(shí)現(xiàn); (3)詳細(xì)設(shè)計(jì)階段,進(jìn)行硬件系統(tǒng)與軟件系統(tǒng)的分類劃分,以決定哪些功能用硬件實(shí)現(xiàn),哪些用軟件實(shí)現(xiàn); (4)系統(tǒng)集成,把系統(tǒng)的軟件、硬件和執(zhí)行裝置集成在一起,進(jìn)行調(diào)試,發(fā)現(xiàn)并改進(jìn)在設(shè)計(jì)過程中的錯(cuò)誤; (5)系統(tǒng)測試,對設(shè)計(jì)好的系統(tǒng)進(jìn)行測試,看其是否滿足給定的要求。8.Linux作為嵌入式操作系統(tǒng)的優(yōu)勢主要有以下幾點(diǎn): (1)可應(yīng)用于多種硬件平臺。 (2)Linux的高度模塊化使添加部件非常容易。 (3)Linux是一個(gè)和Unix相似、以內(nèi)核為基礎(chǔ)的、具有完全的內(nèi)存訪問控制,支持大量硬件的一種通用操作系統(tǒng)。 (4)Linux可以隨意地配置,不需要任何的許可證或商家的合作關(guān)系。 (5)Linux帶有Unix用戶熟悉的完善的開發(fā)工具。其強(qiáng)大的語言編譯器GCC,C++等也可以很容易得到,不但成熟完善,而且使用方便。9. Linux執(zhí)行進(jìn)程調(diào)度一般是在以下情況發(fā)生的:(1)正在執(zhí)行的進(jìn)程運(yùn)行完畢; (2)正在執(zhí)行的進(jìn)程調(diào)用阻塞原語將自己阻塞起來進(jìn)入等待狀態(tài);(3)正在執(zhí)行的進(jìn)程調(diào)用了P原語操作,從而因資源不足而被阻塞;(4)執(zhí)行中的進(jìn)程提出I/O請求后被阻塞;(5)系統(tǒng)分配的時(shí)間片已經(jīng)用完; (6)就緒隊(duì)列中的某個(gè)進(jìn)程的優(yōu)先級變得高于當(dāng)前運(yùn)行進(jìn)程的優(yōu)先級。 第4章 1、Linux 內(nèi)核的編譯菜單有好幾個(gè)版本,運(yùn)行: (1)make config:進(jìn)入命令行,可以一行一行的配置,但使用不十分方便。 (2)make menuconfig:大多數(shù)開發(fā)人員使用的Linux 內(nèi)核編譯菜單,使用方便。 (3)make xconfig:在2.4.X 以及以前版本中xconfig 菜單是基于TCL/TK 的圖形庫的。 2、在完成內(nèi)核的裁減之后,內(nèi)核的編譯就只要執(zhí)行以下幾條命令: make clean 編譯內(nèi)核之前先把環(huán)境給清理干凈。make dep 編譯相關(guān)依賴文件 make zImage 創(chuàng)建內(nèi)核鏡像文件 make modules 創(chuàng)建內(nèi)核模塊。 make install 把相關(guān)文件拷貝到默認(rèn)的目錄。 3、此命令是裝載壓縮映像文件zImage到flash存儲器中,地址是kernel分區(qū),并采用xmodem傳輸協(xié)議。 4、此命令是設(shè)置網(wǎng)卡1的地址192.168.1.1,掩碼為255.255.255.0,不寫netmask參數(shù)則默認(rèn)為255.255.255.0。 5、此命令將nfs服務(wù)的共享目錄sharedir加載到/mnt/nfs。 6、此命令是裝載根文件系統(tǒng)root.cramfs到flash存儲器中,地址是根文件系統(tǒng)分區(qū),并采用xmodem傳輸協(xié)議。 7、這個(gè)命令的操作同時(shí)進(jìn)行了分區(qū)和格式化,0~128K存放vivi,128K~192K存放VIVI控制臺指令,192K~1216K存放kernel,1216K~4288K存放root,其余部分存放應(yīng)用程序。 第6章 1.使用虛擬地址尋址整個(gè)系統(tǒng)的主存和輔存的方式在現(xiàn)代操作系統(tǒng)中被稱為虛擬內(nèi)存。虛擬內(nèi)存的管理方法使系統(tǒng)既可以運(yùn)行體積比物理內(nèi)存還要大的應(yīng)用程序,也可以實(shí)現(xiàn)“按需調(diào)頁”策略,既滿足了程序的運(yùn)行速度,又節(jié)約了物理內(nèi)存空間。2.進(jìn)程內(nèi)存區(qū)域涉及到5種數(shù)據(jù)段,即: ①代碼段:代碼段是用來存放可執(zhí)行文件的操作指令。 ②數(shù)據(jù)段:數(shù)據(jù)段用來存放可執(zhí)行文件中已初始化全局變量。③BSS段:BSS段包含了程序中未初始化的全局變量。④堆(heap):用于存放進(jìn)程運(yùn)行中被動態(tài)分配的內(nèi)存段,它的大小并不固定,可動態(tài)擴(kuò)張或縮減。 ⑤棧:棧是用戶存放程序臨時(shí)創(chuàng)建的局部變量。3.在Linux系統(tǒng)中,內(nèi)核在最高級執(zhí)行,也稱為“系統(tǒng)態(tài)”,在這一級任何操作都可以執(zhí)行。而應(yīng)用程序則執(zhí)行在最低級,即所謂的“用戶態(tài)”。在這一級處理器禁止對硬件的直接訪問和對內(nèi)存的未授權(quán)訪問。模塊是在所謂的“內(nèi)核空間”中運(yùn)行的,而應(yīng)用程序則是在“用戶空間”中運(yùn)行的。它們分別引用不同的內(nèi)存映射,也就是程序代碼使用不同的“地址空間”。4.共享內(nèi)存區(qū)域是被多個(gè)進(jìn)程共享的一部分物理內(nèi)存。如果多個(gè)進(jìn)程都把該內(nèi)存區(qū)域映射到自己的虛擬地址空間,則這些進(jìn)程就都可以直接訪問該共享內(nèi)存區(qū)域,從而可以通過該區(qū)域進(jìn)行通信。共享內(nèi)存是進(jìn)程間共享數(shù)據(jù)的一種最快的方法,一個(gè)進(jìn)程向共享內(nèi)存區(qū)域?qū)懭肓藬?shù)據(jù),共享這個(gè)內(nèi)存區(qū)域的所有進(jìn)程就可以立刻看到其中的內(nèi)容。5.內(nèi)存管理利用虛擬文件系統(tǒng)支持交換,交換進(jìn)程(swapd)定期由調(diào)度程序調(diào)度,這也是內(nèi)存管理依賴于進(jìn)程調(diào)度的唯一原因。當(dāng)一個(gè)進(jìn)程存取的內(nèi)存映射被換出時(shí),內(nèi)存管理向文件系統(tǒng)發(fā)出請求,同時(shí),掛起當(dāng)前正在運(yùn)行的進(jìn)程。 第9章 1.參考答案: Mutex互斥量,用于操作某個(gè)臨界資源時(shí)對該資源上鎖,以實(shí)現(xiàn)互斥地對獨(dú)占資源的使用。Semophore信號燈,信號燈內(nèi)有一計(jì)數(shù)器,可以用于對多個(gè)同類資源的分配。 Condition條件變量,條件變量用于等待信號。當(dāng)一個(gè)線程需要等待某個(gè)信號時(shí),就可到條件變量上等待,當(dāng)信號具備時(shí),系統(tǒng)會喚醒該線程繼續(xù)運(yùn)行。2.參考答案: 本地:共享內(nèi)存+信號量,適合于大量數(shù)據(jù)傳輸。Linux支持系統(tǒng)V和POSIX的共享內(nèi)存和信號量。(5分) 遠(yuǎn)程:Socket+應(yīng)用協(xié)議。適合于跨網(wǎng)絡(luò)的(大量)數(shù)據(jù)傳輸。Linux支持BSD的socket。應(yīng)用層協(xié)議需要自行設(shè)計(jì)。(5分) 3.答案要點(diǎn):程序是編譯后形成的可執(zhí)行代碼,是靜止的。進(jìn)程是程序的一次執(zhí)行,是活動的。線程是進(jìn)程的可執(zhí)行單元,同一進(jìn)程的不同線程共享進(jìn)程的資源和地址空間。4.兩種實(shí)現(xiàn)方法,一種是繼承Thread,另外一種是實(shí)現(xiàn)接口Runnable。 同步的實(shí)現(xiàn)方法有兩種,分別是synchronized, wait與notify。用synchronized可以對一段代碼、一個(gè)對象及一個(gè)方法進(jìn)行加鎖。用wait與notify可以使對象處于等待及喚醒方式導(dǎo)致同步,因?yàn)槊總€(gè)對象都直接或間接的繼承了Object類。 5、什么是BootLoader?主要有幾種工作模式及主要功能是什么? 答: Bootloader就是操作系統(tǒng)內(nèi)核運(yùn)行的一段小程序,完成進(jìn)行初始化系統(tǒng)硬件設(shè)置的任務(wù),(2分) 分為啟動加載模式和下載模式。(1啟動加載模式 啟動加載(Boot laoding)模式是指 Bootloader 從目標(biāo)機(jī)上的某個(gè)固態(tài)存儲設(shè)備上將操作系統(tǒng)加載到 RAM 中運(yùn)行,整個(gè)過程并沒有用戶的介入。(2分)(2)下載模式 在下載模式下,目標(biāo)機(jī)上的 Bootloader 將先通過串口連接或網(wǎng)絡(luò)連接等通信手段從宿主機(jī)下載文件。(2分) 6、簡述Bootloader有何作用? 答案要點(diǎn):(1)首先,bootloader是在特定硬件平臺運(yùn)行的程序,嚴(yán)重依賴于硬件平臺,需要移植;(2)是系統(tǒng)上電之后,第一個(gè)運(yùn)行的程序,系統(tǒng)在上電或復(fù)位時(shí)通常都從地址 0x0 處開始執(zhí)行,而在這個(gè)地址處安排的通常就是系統(tǒng)的 Boot Loader 程序;(3)bootloader程序的設(shè)計(jì)目標(biāo)是啟動嵌入式操作系統(tǒng),嵌入式操作系統(tǒng)的啟動需要一定的條件,這些條件由bootloader來滿足;(4)Bootloader一般具有對存儲器和網(wǎng)絡(luò)接口操作的功能;如擦除、讀寫Flash,通過USB、串口下載文件等第二篇:操作系統(tǒng)重點(diǎn)總結(jié)
第三篇:嵌入式操作系統(tǒng)實(shí)驗(yàn)報(bào)告
第四篇:嵌入式操作系統(tǒng)課程報(bào)告
第五篇:嵌入式Linux實(shí)時(shí)操作系統(tǒng)習(xí)題總結(jié)