版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、嵌入式Linux實(shí)時(shí)操作系統(tǒng)及應(yīng)用編程嵌入式Linux實(shí)時(shí)操作系統(tǒng)及應(yīng)用編程嵌入式Linux實(shí)時(shí)操作系統(tǒng)及應(yīng)用編程嵌入式Linux實(shí)時(shí)操作系統(tǒng)及應(yīng)用編程附錄A 習(xí)題參考答案嵌入式Linux實(shí)時(shí)操作系統(tǒng)及應(yīng)用編程第1章1嵌入式系統(tǒng)是指操作系統(tǒng)和功能軟件集成于計(jì)算機(jī)硬件系統(tǒng)之中。簡單的說就是系統(tǒng)的應(yīng)用軟件與系統(tǒng)的硬件一體化,類似與BIOS的工作方式。具有軟件代碼小,高度自動(dòng)化,響應(yīng)速度快等特點(diǎn)。特別適合于要求實(shí)時(shí)的和多任務(wù)的體系。根據(jù)IEEE(國際電氣和電子工程師協(xié)會(huì))的定義:嵌入式系統(tǒng)是“用于控制、監(jiān)視或者輔助操作機(jī)器和設(shè)備的裝置”(原文為devices used to control, mon
2、itor, or assist the operation of equipment, machinery or plants)。簡單地講就是嵌入到對(duì)象體中的專用計(jì)算機(jī)系統(tǒng)。嵌入式系統(tǒng)一般有3個(gè)主要的組成部分:硬件、實(shí)時(shí)操作系統(tǒng)以及應(yīng)用軟件。 圖1.1 嵌入式系統(tǒng)三個(gè)組成部分硬件:包括處理器、存儲(chǔ)器(ROM、RAM)、輸入輸出設(shè)備、其他部分輔助系統(tǒng)等。 實(shí)時(shí)操作系統(tǒng)(Real-Time Operating System,RTOS):用于管理應(yīng)用軟件,并提供一種機(jī)制,使得處理器分時(shí)地執(zhí)行各個(gè)任務(wù)并完成一定的時(shí)限要求 。 應(yīng)用軟件:實(shí)現(xiàn)具體業(yè)務(wù)邏輯功能。2嵌入式系統(tǒng)的三要素是嵌入、專用、計(jì)算機(jī);其
3、中嵌入性指的是嵌入到對(duì)象體系中,有對(duì)象環(huán)境要求;專用性是指軟、硬件按對(duì)象要求裁減;計(jì)算機(jī)指實(shí)現(xiàn)對(duì)象的智能化功能。廣義地說一個(gè)嵌入式系統(tǒng)就是一個(gè)具有特定功能或用途的計(jì)算機(jī)軟硬件集合體。即以應(yīng)用為中心、以計(jì)算機(jī)技術(shù)為基礎(chǔ)、軟件硬件可裁剪、適應(yīng)應(yīng)用系統(tǒng)對(duì)功能、可靠性、成本、體積、功耗嚴(yán)格要求的專用計(jì)算機(jī)系統(tǒng) 。3嵌入式實(shí)時(shí)操作系統(tǒng)(Real-Time Operating System,RTOS)是指操作系統(tǒng)本身要能在一個(gè)固定時(shí)限內(nèi)對(duì)程序調(diào)用(或外部事件)做出正確的反應(yīng),亦即對(duì)時(shí)序與穩(wěn)定性的要求十分嚴(yán)格。目前國際較為知名的有:VxWorks、NeutrinoRTOS、Nucleus Plus、 OS/
4、9、VRTX、LynuxOS,RTLinux、BlueCat RT等。4嵌入式系統(tǒng)一般由硬件層、中間層、軟件層和功能層組成。其作用分別如下:(1)硬件層 :由嵌入式微處理器、外圍電路和外設(shè)組成。外圍電路有:電源電路、復(fù)位電路、調(diào)試接口和存儲(chǔ)器電路,就構(gòu)成一個(gè)嵌入式核心控制模塊。操作系統(tǒng)和應(yīng)用程序都可以固化在ROM或者Flash中。為方便使用,有的模塊在此基礎(chǔ)上增加了LCD、鍵盤、USB接口,以及其他一些功能的擴(kuò)展電路。(2)中間層 :硬件層與軟件層之間為中間層,也稱為BSP(Board Support Package,板級(jí)支持包)。作用:將系統(tǒng)軟件與底層硬件部分隔離,使得系統(tǒng)的底層設(shè)備驅(qū)動(dòng)程序
5、與硬件無關(guān);功能:一般應(yīng)具有相關(guān)硬件的初始化、數(shù)據(jù)的輸入/輸出操作和硬件設(shè)備的配置等功能。BSP是主板硬件環(huán)境和操作系統(tǒng)的中間接口,是軟件平臺(tái)中具有硬件依賴性的那一部分,主要目的是為了支持操作系統(tǒng),使之能夠更好地運(yù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)用程序組成,用來完成對(duì)被控對(duì)象的控制功能。功能層是面向被控對(duì)象和用戶的,為了方便用戶操作,往往需要具有友好的人機(jī)界面。5非占先式調(diào)度法也稱作合作型多任務(wù)(cooperati
6、ve multitasking),各個(gè)任務(wù)彼此合作共享一個(gè)CPU。中斷服務(wù)可以使一個(gè)高優(yōu)先級(jí)的任務(wù)由掛起狀態(tài)變?yōu)榫途w狀態(tài)。但中斷服務(wù)以后控制權(quán)還是回到原來被中斷了的那個(gè)任務(wù),直到該任務(wù)主動(dòng)放棄CPU的使用權(quán)時(shí),那個(gè)高優(yōu)先級(jí)的任務(wù)才能獲得CPU的使用權(quán)。當(dāng)系統(tǒng)響應(yīng)時(shí)間很重要時(shí),要使用占先式(preemptive)內(nèi)核。最高優(yōu)先級(jí)的任務(wù)一旦就緒,總能得到CPU的控制權(quán)。當(dāng)一個(gè)運(yùn)行著的任務(wù)使一個(gè)比它優(yōu)先級(jí)高的任務(wù)進(jìn)入了就緒態(tài),當(dāng)前任務(wù)的CPU使用權(quán)就被剝奪了,或者說被掛起了,那個(gè)高優(yōu)先級(jí)的任務(wù)立刻得到了CPU的控制權(quán)。6在實(shí)時(shí)系統(tǒng)中,如果系統(tǒng)在指定的時(shí)間內(nèi)未能實(shí)現(xiàn)某個(gè)確定的任務(wù),會(huì)導(dǎo)致系統(tǒng)的全面失敗
7、,這樣的系統(tǒng)被稱為強(qiáng)實(shí)時(shí)系統(tǒng)或硬實(shí)時(shí)系統(tǒng)。強(qiáng)實(shí)時(shí)系統(tǒng)響應(yīng)時(shí)間一般在毫秒或微秒級(jí)。在弱實(shí)時(shí)系統(tǒng)中,雖然響應(yīng)時(shí)間同樣重要,但是超時(shí)卻不會(huì)發(fā)生致命的錯(cuò)誤。其系統(tǒng)響應(yīng)時(shí)間在毫秒至秒的數(shù)量級(jí)上,其實(shí)時(shí)性的要求比強(qiáng)實(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)測(cè)試,對(duì)設(shè)計(jì)好的系統(tǒng)進(jìn)行測(cè)試,看其是
8、否滿足給定的要求。 8Linux作為嵌入式操作系統(tǒng)的優(yōu)勢(shì)主要有以下幾點(diǎn): (1)可應(yīng)用于多種硬件平臺(tái)。Linux已經(jīng)被移植到多種硬件平臺(tái),這對(duì)于經(jīng)費(fèi),時(shí)間受限制的研究與開發(fā)項(xiàng)目是很有吸引力的。原型可以在標(biāo)準(zhǔn)平臺(tái)上開發(fā)后移植到 具體的硬件上,加快了軟件與硬件的開發(fā)過程。Linux采用一個(gè)統(tǒng)一的框架對(duì)硬件進(jìn)行管理,從一個(gè)硬件平臺(tái)到另一個(gè)硬件平臺(tái)的改動(dòng)與上層應(yīng)用無關(guān)。(2)Linux的高度模塊化使添加部件非常容易。本身內(nèi)置網(wǎng)絡(luò)支持,而目前嵌入式系統(tǒng)對(duì)網(wǎng)絡(luò)支持要求越來越高。(3)Linux是一個(gè)和Unix相似、以內(nèi)核為基礎(chǔ)的、具有完全的內(nèi)存訪問控制,支持大量硬件(包括X86,Alpha、ARM和Mot
9、orola等現(xiàn)有的大 部分芯片)等特性的一種通用操作系統(tǒng)。(4)Linux可以隨意地配置,不需要任何的許可證或商家的合作關(guān)系。其程序源碼全部公開,任何人可以修改并在GUN通用公共許可證(GNU General Public License)下發(fā)行。這樣,開發(fā)人員可以對(duì)操作系統(tǒng)進(jìn)行定制,適應(yīng)其特殊需要。 (5)Linux帶有Unix用戶熟悉的完善的開發(fā)工具,幾乎所有的Unix系統(tǒng)的應(yīng)用軟件都已移植到了Linux上。其強(qiáng)大的語言編譯器GCC,C+等也可以很容易得到,不但成熟完善,而且使用方便。9(參考答案)Linux執(zhí)行進(jìn)程調(diào)度一般是在以下情況發(fā)生的:(1)正在執(zhí)行的進(jìn)程運(yùn)行完畢;(2)正在執(zhí)行的
10、進(jìn)程調(diào)用阻塞原語將自己阻塞起來進(jìn)入等待狀態(tài);(3)正在執(zhí)行的進(jìn)程調(diào)用了P原語操作,從而因資源不足而被阻塞;或調(diào)用了V原語操作激活了等待資源的進(jìn)程隊(duì)列;(4)執(zhí)行中的進(jìn)程提出I/O請(qǐng)求后被阻塞;(5)系統(tǒng)分配的時(shí)間片已經(jīng)用完;以上都是CPU為不可剝奪方式下的引起進(jìn)程調(diào)度的原因。在CPU方式是可剝奪時(shí),還有下面的原因:(6)就緒隊(duì)列中的某個(gè)進(jìn)程的優(yōu)先級(jí)變得高于當(dāng)前運(yùn)行進(jìn)程的優(yōu)先級(jí),從而也將引起進(jìn)程調(diào)度。嵌入式Linux實(shí)時(shí)操作系統(tǒng)及應(yīng)用編程第2章 一.填空題:1、改變目錄位置至用戶的工作目錄2、改變目錄位置至相對(duì)路徑user 的目錄下3、查看當(dāng)前目錄下的文件 4、查看文件.bash_profile
11、的內(nèi)容5、分頁查看inittab文件內(nèi)容6、將目錄/tmp 下的文件file1 復(fù)制到當(dāng)前目錄下,文件名為f i l e 27、將文件file1移到目錄dir1 下,文件名仍為file18、建立一新目錄d i r 19、刪除目錄dir1,但dir1 下必須沒有文件存在,否則無法刪除10、刪除文件名中有五個(gè)字符且前四個(gè)字符為file 的所有文件11、文件config的內(nèi)容依次顯示到屏幕上12、以分頁方式查看文件名file1 的內(nèi)容13、以分頁方式查看文件名file1 的內(nèi)容14、顯示目錄dir1 的總?cè)萘?5、對(duì)于目錄d i r 1,設(shè)定成任何使用者皆有讀取及執(zhí)行的權(quán)利,但只有所有者可做修改16
12、、對(duì)于文件f i l e 1,設(shè)定只有所有者可以讀、寫和執(zhí)行的權(quán)利。17、將文件file4 鏈接至文件f i l e 3。18、尋找文件f i l e 1中包含字符串a(chǎn)bc 所在行的文本內(nèi)容。19、自根目錄下尋找文件file1 的路徑。20、比較目錄dir1 與dir2 內(nèi)各文件的不同之處。二、單項(xiàng)選擇題1.A 2.B 3.D 4.C 5.B 6.C 7.A 8.C 9.D 10.B 11.A 12.D 13.D 14.B 15.B 16.B 17.A 18.D 19.B 20.B嵌入式Linux實(shí)時(shí)操作系統(tǒng)及應(yīng)用編程第3章一.填空題:1 next 2命令模式3預(yù)處理、編譯、匯編和連接4. s
13、tep next5. 末行模式6.預(yù)處理 鏈接7.匯編8. w test.txt 二、綜合題1參考答案:pr1: prog.o subr.ogcc o pr1 prog.o subr.oprog.o: prog.c prog.hgcc c o prog.o prog.csubr.o: subr.c subr.hgcc c o subr.o subr.c2. (1)hello: main.o list.o symbol.o table.o gcc -o prog main.o list.o symbol.o table.omain.o: main.c table.h symbol.h list.
14、h gcc -c -o main.o main.clist.o: list.c list.h gcc -c -o list.o list.csymbol.o: symbol.c symbol.h gcc -c -o symbol.o symbol.ctable.o: table.c table.h symbol.h list.hgcc -c -o table.o table.cclean:rm hello *.o(2) mount t nfs o noclock 0:/home/armtest/hello /mnt3.hello.c:# include <stdio
15、.h># include <stdlib.h># include <string.h># include "hello.h"int main (int argc,char *argv) printf("Hello World!n"); message(); &
16、#160;return 0; hello.h:void message(void);message.c:# include <stdio.h>void message (void) printf("This is a message!n");三選擇題1 C 2 A 3 B 4 B 5 B 6 C 7 C 8. D 9 D 10 A 11 A嵌入式Linux實(shí)時(shí)操作系統(tǒng)及應(yīng)用編程第4章一選擇題1. A 2 C 3 D 4. D 5. C 6 B 7 C 8. A 9. D
17、 10. D 11D 12D 13D 14B 15 D16B 17A 18C 19C 20C 二.簡答題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)境給清理干凈。有時(shí)你也可以用make realclean 或
18、make mrproper 來徹底清除相關(guān)依賴,保證沒有不正確的.o 文件存在。make dep 編譯相關(guān)依賴文件make zImage 創(chuàng)建內(nèi)核鏡像文件make modules 創(chuàng)建內(nèi)核模塊,若不創(chuàng)建內(nèi)核模塊,這步可以不要。make install 把相關(guān)文件拷貝到默認(rèn)的目錄。在給嵌入式設(shè)備編譯時(shí)這步可以不要。因?yàn)榫唧w的內(nèi)核安裝還需要你手工進(jìn)行。3、此命令是裝載壓縮映像文件zImage到flash存儲(chǔ)器中,地址是kernel分區(qū),并采用xmodem傳輸協(xié)議。4、此命令是設(shè)置網(wǎng)卡1的地址,掩碼為,不寫netmask參數(shù)則默認(rèn)為255.255.25
19、5.0。5、此命令將nfs服務(wù)的共享目錄sharedir加載到/mnt/nfs。6、此命令是裝載根文件系統(tǒng)root.cramfs到flash存儲(chǔ)器中,地址是根文件系統(tǒng)分區(qū),并采用xmodem傳輸協(xié)議。7、這個(gè)命令的操作同時(shí)進(jìn)行了分區(qū)和格式化,0128K存放vivi,128K192K存放VIVI控制臺(tái)指令,192K1216K存放kernel,1216K4288K存放root,其余部分存放應(yīng)用程序。嵌入式Linux實(shí)時(shí)操作系統(tǒng)及應(yīng)用編程第5章一選擇題1B 2 C 3 C 4 C 5 D 6 C二.綜合應(yīng)用題1. Tom is my friendJack is my friendHarr
20、y is my friend2. (1)程序注釋#!/bin/sh 定義實(shí)用的shell# /etc/rc.d/rc.httpd 注釋行,凡是以星號(hào)開始的行均為注釋行。# Start/stop/restart the Apache web server.# To make Apache start automatically at boot, make this # file executable: chmod 755 /etc/rc.d/rc.httpd#case "$1" in #case結(jié)構(gòu)開始,判斷“位置參數(shù)”決定執(zhí)行的操作。本程序攜帶一個(gè)“位置參數(shù)”,即$1
21、9;start') #若位置參數(shù)為start/usr/sbin/apachectl start ; #啟動(dòng)httpd進(jìn)程'stop') #若位置參數(shù)為stop/usr/sbin/apachectl stop ; #關(guān)閉httpd進(jìn)程'restart') #若位置參數(shù)為stop/usr/sbin/apachectl restart ; #重新啟動(dòng)httpd進(jìn)程*) #若位置參數(shù)不是start、stop或restart時(shí)echo "usage $0 start|stop|restart" ; #顯示命令提示信息:程序的調(diào)用方法esac #
22、case結(jié)構(gòu)結(jié)束(2)程序的功能是啟動(dòng),停止或重新啟動(dòng)httpd進(jìn)程(3)程序的調(diào)用方式有三種:啟動(dòng),停止和重新啟動(dòng)。3. #!/bin/shFILENAME=echo “Input file name:” read FILENAME if -c "$FILENAME" thencp $FILENAME /devfi 4. #/bin/bashtypeset first secondread -p "Input the first number:" firstread -p "Input the second number:" sec
23、ondresult=$first+$secondecho "result is : $result"exit 05、#!/bin/shi=1while i -le 50 doif -d /userdata ;thenmkdir -p /userdata/user$ichmod 754 /userdata/user$iecho "user$i"let "i = i + 1" (或i=$($i1)elsemkdir /userdatamkdir -p /userdata/user$ichmod 754 /userdata/user$iec
24、ho "user$i"let "i = i + 1" (或i=$($i1)fidone嵌入式Linux實(shí)時(shí)操作系統(tǒng)及應(yīng)用編程第6章一簡答題1使用虛擬地址尋址整個(gè)系統(tǒng)的主存和輔存的方式在現(xiàn)代操作系統(tǒng)中被稱為虛擬內(nèi)存。MMU 便是實(shí)現(xiàn)虛擬內(nèi)存的必要條件。嵌入式處理器如果存在MMU ,由于在MMU具備內(nèi)存地址映射和尋址功能,操作系統(tǒng)會(huì)使用它完成從虛擬地址到物理地址的轉(zhuǎn)換, 所有的應(yīng)用程序只需要使用虛擬地址尋址數(shù)據(jù)。 虛擬內(nèi)存的管理方法使系統(tǒng)既可以運(yùn)行體積比物理內(nèi)存還要大的應(yīng)用程序,也可以實(shí)現(xiàn)“按需調(diào)頁”策略,既滿足了程序的運(yùn)行速度,又節(jié)約了物理內(nèi)存空
25、間。2進(jìn)程內(nèi)存區(qū)域涉及到5種數(shù)據(jù)段,即:代碼段:代碼段是用來存放可執(zhí)行文件的操作指令,也就是說是它是可執(zhí)行程序在內(nèi)存中的鏡像。數(shù)據(jù)段:數(shù)據(jù)段用來存放可執(zhí)行文件中已初始化全局變量,換句話說就是存放程序靜態(tài)分配的變量和全局變量。BSS段:BSS段包含了程序中未初始化的全局變量,在內(nèi)存中 BSS段全部置零。堆(heap):堆是用于存放進(jìn)程運(yùn)行中被動(dòng)態(tài)分配的內(nèi)存段,它的大小并不固定,可動(dòng)態(tài)擴(kuò)張或縮減。當(dāng)進(jìn)程調(diào)用malloc等函數(shù)分配內(nèi)存時(shí),新分配的內(nèi)存就被動(dòng)態(tài)添加到堆上(堆被擴(kuò)張);當(dāng)利用free等函數(shù)釋放內(nèi)存時(shí),被釋放的內(nèi)存從堆中被剔除(堆被縮減)棧:棧是用戶存放程序臨時(shí)創(chuàng)建的局部變量,也就是說函數(shù)
26、括弧“”中定義的變量(但不包括static聲明的變量,static意味著在數(shù)據(jù)段中存放變量)。除此以外,在函數(shù)被調(diào)用時(shí),其參數(shù)也會(huì)被壓入發(fā)起調(diào)用的進(jìn)程棧中,并且待到調(diào)用結(jié)束后,函數(shù)的返回值也會(huì)被存放回棧中。3在Linux系統(tǒng)中,內(nèi)核在最高級(jí)執(zhí)行,也稱為“系統(tǒng)態(tài)”,在這一級(jí)任何操作都可以執(zhí)行。而應(yīng)用程序則執(zhí)行在最低級(jí),即所謂的“用戶態(tài)”。在這一級(jí)處理器禁止對(duì)硬件的直接訪問和對(duì)內(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)程都把該
27、內(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)容。這塊共享虛擬內(nèi)存的頁面,出現(xiàn)在每一個(gè)共享該頁面的進(jìn)程的頁表中。但是它不需要在所有進(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ā)出請(qǐng)求,同時(shí),掛起當(dāng)前正在運(yùn)行的進(jìn)程。二.編程題1參考程序:#include&
28、lt;stdlib.h>struct testint a10;char b20;int main()struct test *ptr=calloc(sizeof(struct test),10);2參考程序:#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include<unistd.h>#include<sys/mman.h>main()int fd;void *start;struct stat sb;fd=open(“/etc/passwd”,O_RDO
29、NLY); /*打開/etc/passwd*/fstat(fd,&sb); /*取得文件大小*/start=mmap(NULL,sb.st_size,PROT_READ,MAP_PRIVATE,fd,0);if(start= = MAP_FAILED) /*判斷是否映射成功*/return;printf(“%s”,start);munma(start,sb.st_size); /*解除映射*/closed(fd);嵌入式Linux實(shí)時(shí)操作系統(tǒng)及應(yīng)用編程第7章一、單項(xiàng)選擇題1A 2. B 3. A 4. D 5 6. A 7. C 二.編程題1. (1)Void main(void)in
30、t fid;fid = open(“./test.txt”,O_RDWR|O_CREAT); if(fid=-1)Printf(“open or create error n”);exit(0);Close(fid);(2) objects = main.o exec = main all:$(objects)gcc o $(exec) $(objects)main.o:main.c gcc c main.c clean:rm r $(exec) $(objects)2.參考程序:#include <sys/types.h>#include <sys/stat.h>#i
31、nclude <fcntl.h>#include <stdlib.h>#include <unistd.h>#include <stdio.h>#define BUFFER_SIZE 1024 int main(int argc,char *argv) int from_fd,to_fd;int bytes_read,bytes_write; char bufferBUFFER_SIZE; char *ptr; if(argc!=3)
32、; fprintf(stderr,"Usage:%s fromfile tofilena",argv0);exit(1); /* 打開源文件 */ if(from_fd=open(argv1,O_RDONLY)=-1) fprintf(stderr,"Open %s Error:%sn",argv1,strerror(errno); exit(1); /* 創(chuàng)建目的文件 */ if(to_fd=open(argv2,O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR)=-1)
33、; fprintf(stderr,"Open %s Error:%sn",argv2,strerror(errno); exit(1); /* 以下代碼是一個(gè)經(jīng)典的拷貝文件的代碼 */ while(bytes_read=read(from_fd,buffer,BUFFER_SIZE) if(bytes_read=-1)&&(errno!=EINTR) break; /*發(fā)生讀錯(cuò)誤,退出循環(huán)*/
34、;else if(bytes_read>0) ptr=buffer; while(bytes_write=write(to_fd,ptr,bytes_read) if(bytes_write=-1)&&(errno!=EINTR)break; /*若寫錯(cuò)誤,退出循環(huán)*/* 寫完了所有讀的字節(jié) */ else if(bytes_write=bytes_read) break;/*讀寫字節(jié)不等退出循環(huán)*/ else
35、0;if(bytes_write>0) /* 只寫了一部分,繼續(xù)寫 */ ptr+=bytes_write; bytes_read-=bytes_write; if(bytes_write=-1)break; /* 寫的時(shí)候發(fā)生的致命錯(cuò)誤 */ close(from_fd); close(to_fd); exit(0); 3參考程序:#include <stdio.h>struct student char name10;
36、int age; ;int main() FILE *fp; int i; struct student boya2, boyb2, *pp, *qq; if(fp = fopen("7-6.txt","w+")= NULL) /打開文件 printf("Can not open file, exit .n"); return -1; pp = boya; qq = boyb; printf("please input data:n");/輸入學(xué)生信息 for (i = 0; i < 2; i+, pp+)
37、scanf("%s%d", pp->name, &pp->age); pp = boya; fwrite(pp, sizeof(struct student), 2, fp); /把學(xué)生信息寫入文件 rewind(fp); /重定位文件 fread(qq, sizeof(struct student), 2, fp); /從文件中讀取學(xué)生信息 printf("namettagen"); for(i = 0; i < 2; i+, qq+) printf("%stt%dn", qq->name, qq-&
38、gt;age); fclose(fp); return 0;4參考程序如下:嵌入式Linux實(shí)時(shí)操作系統(tǒng)及應(yīng)用編程第8章一、單項(xiàng)選擇題1、B2、A 3、A4、D 5、C 6. D7、C 8、D 9、C 10、B 二.閱讀程序題1答案要點(diǎn):(1) 將數(shù)據(jù)緩沖區(qū)清0 (2) 創(chuàng)建管道 (3) 創(chuàng)建子進(jìn)程 (4) 關(guān)閉子進(jìn)程寫描述符 (5) 子進(jìn)程讀取管道內(nèi)容 (6) 關(guān)閉子進(jìn)程讀描述符 (7) 父進(jìn)程運(yùn)行控制語句 (8) 關(guān)閉父進(jìn)程的讀描述符 (9) 將數(shù)據(jù)寫入緩沖區(qū) (10) 關(guān)閉父進(jìn)程寫描述符 三程序設(shè)計(jì)1參考程序如下:void main() key_t unique_key; /* 定義一個(gè)
39、IPC關(guān)鍵字*/int id;struct sembuf lock_it;union semun options;int i; unique_key = ftok(".", 'a'); /* 生成關(guān)鍵字,字符'a'是一個(gè)隨機(jī)種子*/* 創(chuàng)建一個(gè)新的信號(hào)量集合*/id = semget(unique_key, 1, IPC_CREAT | IPC_EXCL | 0666);printf("semaphore id=%dn", id);options.val = 1; /*設(shè)置變量值*/semctl(id, 0, S
40、ETVAL, options); /*設(shè)置索引0的信號(hào)量*/ /*打印出信號(hào)量的值*/i = semctl(id, 0, GETVAL, 0);printf("value of semaphore at index 0 is %dn", i); /*下面重新設(shè)置信號(hào)量*/lock_it.sem_num = 0; /*設(shè)置哪個(gè)信號(hào)量*/lock_it.sem_op = -1; /*定義操作*/lock_it.sem_flg = IPC_NOWAIT; /*操作方式*/ if (semop(id, &lock_it, 1) = -1) pr
41、intf("can not lock semaphore.n");exit(1); i = semctl(id, 0, GETVAL, 0);printf("value of semaphore at index 0 is %dn", i); /*清除信號(hào)量*/semctl(id, 0, IPC_RMID, 0);2參考程序:(1)init.c清單 #include < unistd.h > #include < signal.h > #include < sys/param.h > #includ
42、e < sys/types.h > #include < sys/stat.h > void init_daemon(void) int pid;int i; if(pid=fork() exit(0);/是父進(jìn)程,結(jié)束父進(jìn)程 else if(pid< 0) exit(1);/fork失敗,退出 /是第一子進(jìn)程,后臺(tái)繼續(xù)執(zhí)行 setsid();/第一子進(jìn)程成為新的會(huì)話組長和進(jìn)程組長并與控制終端分離if(pid=fork()exit(0);/是第一子進(jìn)程,結(jié)束第一子進(jìn)程 else if(pid< 0)exit(1);/fork失敗,退出 /是第二子進(jìn)程,繼續(xù)
43、/第二子進(jìn)程不再是會(huì)話組長 for(i=0;i< NOFILE;+i)/關(guān)閉打開的文件描述符 close(i); chdir("/tmp");/改變工作目錄到/tmp umask(0);/重設(shè)文件創(chuàng)建掩模return; (2)test.c清單 #include < stdio.h > #include < time.h > void init_daemon(void);/守護(hù)進(jìn)程初始化函數(shù) main() FILE *fp; time_t t; init_daemon();/初始化為Daemon while(1)/每隔一分鐘向test.log報(bào)告
44、運(yùn)行狀態(tài) sleep(60);/睡眠一分鐘 if(fp=fopen("test.log","a") >=0) t=time(0);re at %sn",asctime(localtime(&t) ); fclose(fp); 以上程序在RedHat Linux6.0下編譯通過。步驟如下:編譯:gcc -g -o test init.c test.c 查看進(jìn)程:ps -ef 程的各種特性滿足上面的要求。3參考程序:#define INPUT 0#define OUTPUT 1void main() int file_descript
45、ors2;/*定義子進(jìn)程號(hào) */pid_t pid;char buf256;int returned_count;/*創(chuàng)建無名管道*/pipe(file_descriptors);/*創(chuàng)建子進(jìn)程*/if(pid = fork() = -1) printf("Error in forkn");exit(1);/*執(zhí)行子進(jìn)程*/if(pid = 0) printf("in the spawned (child) process.n");/*子進(jìn)程向父進(jìn)程寫數(shù)據(jù),關(guān)閉管道的讀端*/close(file_descriptorsINPUT);write(file_
46、descriptorsOUTPUT, "test data", strlen("test data");exit(0); else /*執(zhí)行父進(jìn)程*/printf("in the spawning (parent) process.n");/*父進(jìn)程從管道讀取子進(jìn)程寫的數(shù)據(jù),關(guān)閉管道的寫端*/close(file_descriptorsOUTPUT);returned_count = read(file_descriptorsINPUT, buf, sizeof(buf);printf("%d bytes of data r
47、eceived from spawned process: %sn",returned_count, buf);在Linux系統(tǒng)下,有名管道可由兩種方式創(chuàng)建:命令行方式mknod系統(tǒng)調(diào)用和函數(shù)mkfifo。下面的兩種途徑都在當(dāng)前目錄下生成了一個(gè)名為myfifo的有名管道:方式一:mkfifo("myfifo","rw");方式二:mknod myfifo p生成了有名管道后,就可以使用一般的文件I/O函數(shù)如open、close、read、write等來對(duì)它進(jìn)行操作。下面即是一個(gè)簡單的例子,假設(shè)我們已經(jīng)創(chuàng)建了一個(gè)名為myfifo的有名管道。/*
48、進(jìn)程一:讀有名管道*/#include#includevoid main() FILE * in_file;int count = 1;char buf80;in_file = fopen("mypipe", "r");if (in_file = NULL) printf("Error in fdopen.n");exit(1);while (count = fread(buf, 1, 80, in_file) > 0)printf("received from pipe: %sn", buf);fclose
49、(in_file);/* 進(jìn)程二:寫有名管道*/#include#includevoid main() FILE * out_file;int count = 1;char buf80;out_file = fopen("mypipe", "w");if (out_file = NULL) printf("Error opening pipe.");exit(1);sprintf(buf,"this is test data for the named pipe examplen");fwrite(buf, 1,
50、80, out_file);fclose(out_file);嵌入式Linux實(shí)時(shí)操作系統(tǒng)及應(yīng)用編程第9章一、簡答題1參考答案: Mutex互斥量,用于操作某個(gè)臨界資源時(shí)對(duì)該資源上鎖,以實(shí)現(xiàn)互斥地對(duì)獨(dú)占資源的使用。(3分)Semophore信號(hào)燈,信號(hào)燈內(nèi)有一計(jì)數(shù)器,可以用于對(duì)多個(gè)同類資源的分配。當(dāng)資源用完時(shí),申請(qǐng)資源的線程會(huì)在信號(hào)量上睡眠,有線程釋放資源時(shí),再將該線程喚醒繼續(xù)運(yùn)行。(3分)Condition條件變量,條件變量用于等待信號(hào)。當(dāng)一個(gè)線程需要等待某個(gè)信號(hào)時(shí),就可到條件變量上等待,當(dāng)信號(hào)具備時(shí),系統(tǒng)會(huì)喚醒該線程繼續(xù)運(yùn)行。(4分)2參考答案:本地:共享內(nèi)存+信號(hào)量, 適合于大量數(shù)據(jù)傳輸
51、。Linux支持系統(tǒng)V和POSIX的共享內(nèi)存和信號(hào)量。(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í)行,是活動(dòng)的。線程是進(jìn)程的可執(zhí)行單元,同一進(jìn)程的不同線程共享進(jìn)程的資源和地址空間。4兩種實(shí)現(xiàn)方法,一種是繼承Thread,另外一種是實(shí)現(xiàn)接口Runnable。同步的實(shí)現(xiàn)方法有兩種,分別是synchronized, wait與notify。用synchronized可以對(duì)一段代碼、一個(gè)對(duì)象及一個(gè)方法進(jìn)行加鎖。用wait與notify可以使
52、對(duì)象處于等待及喚醒方式導(dǎo)致同步,因?yàn)槊總€(gè)對(duì)象都直接或間接的繼承了Object類。5參考答案:(每小點(diǎn)1分)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原語操作,從而因資源不足而被阻塞;或調(diào)用了V原語操作激活了等待資源的進(jìn)程隊(duì)列;(4)執(zhí)行中的進(jìn)程提出I/O請(qǐng)求后被阻塞;(5)系統(tǒng)分配的時(shí)間片已經(jīng)用完;以上都是CPU為不可剝奪方式下的引起進(jìn)程調(diào)度的原因。在CPU方式是可剝奪時(shí),還有下面的原因:(6)就緒隊(duì)列中的某個(gè)進(jìn)程的優(yōu)先級(jí)變得高于當(dāng)前運(yùn)行進(jìn)程的優(yōu)先級(jí),從而也將引起進(jìn)程調(diào)度。
53、二.編程題參考程序:/* 數(shù)據(jù)寫入緩沖區(qū) */void put(struct prodcons * b, int data)pthread_mutex_lock(&b->lock); /*獲得互斥鎖*/ while (b->writepos + 1) % BUFFER_SIZE = b->readpos) printf("wait for not fulln"); pthread_cond_wait(&b->notfull, &b->lock);/*等待b->notfull,不滿則跳出阻塞*/ b->buff
54、erb->writepos = data; /*寫入數(shù)據(jù)*/ b->writepos+; if (b->writepos >= BUFFER_SIZE) b->writepos = 0; pthread_cond_signal(&b->notempty); /*設(shè)置狀態(tài)變量*/pthread_mutex_unlock(&b->lock); /*釋放互斥鎖*/* 從緩沖區(qū)中讀出數(shù)據(jù) */int get(struct prodcons * b) int data;pthread_mutex_lock(&b->lock); /*
55、獲得互斥鎖*/ while (b->writepos = b->readpos) printf("wait for not emptyn");pthread_cond_wait(&b->notempty, &b->lock);/*等待b->notfull,不空則跳出阻塞*/ data = b->bufferb->readpos; /*讀出數(shù)據(jù)*/ b->readpos+; if (b->readpos >= BUFFER_SIZE) b->readpos = 0; pthread_cond_s
56、ignal(&b->notfull); /*設(shè)置狀態(tài)變量*/ pthread_mutex_unlock(&b->lock); /*釋放互斥鎖*/ return data;/*生產(chǎn)者進(jìn)程*/void * producer(void * data) int n; for (n = 0; n < 1000; n+) printf(" put->%dn", n); put(&buffer, n); put(&buffer, OVER); printf("producer stopped!n"); return NULL;/*消費(fèi)者進(jìn)程*/void * consumer(void * data) int d; while (1) d = get(&buffer); if (d = OVER ) break; printf(" %d->getn", d); printf("consumer stopped!n"); return NULL;/*主函數(shù)*/int main(void) pthread_t th_a, th_b; void * retval; i
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 勞動(dòng)合伙合同范例
- 煤炭賣合同范例
- 親屬間贈(zèng)與合同范例
- 勞動(dòng)合同范例福州
- 價(jià)格合同范例書寫
- 借款合同范例律師版
- 進(jìn)口品牌代理采購合同范例
- 柜臺(tái)租賃簡易合同范例
- 煤泥買賣合同范例
- 設(shè)備融資轉(zhuǎn)讓合同范例
- 塑造安全文化品牌 構(gòu)建平安和諧礦區(qū)
- 智能基礎(chǔ)設(shè)施設(shè)計(jì)與優(yōu)化
- 《中國心力衰竭診斷和治療指南(2024)》解讀
- 中醫(yī)烤燈的應(yīng)用與護(hù)理
- 變頻控制柜知識(shí)講座
- 2024年3月河北定向選調(diào)生面試及參考答案全套
- 智能建造專業(yè)職業(yè)規(guī)劃
- 2024屆浦東新區(qū)初三英語期末練習(xí)卷及答案
- 地下室坡道施工方案樣本
- 保安報(bào)價(jià)方案
- 四年級(jí)下冊(cè)運(yùn)算率計(jì)算題100道
評(píng)論
0/150
提交評(píng)論