嵌入式復(fù)習(xí)10095_第1頁
嵌入式復(fù)習(xí)10095_第2頁
嵌入式復(fù)習(xí)10095_第3頁
嵌入式復(fù)習(xí)10095_第4頁
嵌入式復(fù)習(xí)10095_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費閱讀

付費下載

下載本文檔

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

文檔簡介

1、第1部分 習(xí)題部分第1章1.什么是進(jìn)程?進(jìn)程是一個具有一定獨立功能的程序關(guān)于某個數(shù)據(jù)集合的一次運行活動。它是操作系統(tǒng)動態(tài)執(zhí)行的基本單元,在傳統(tǒng)的操作系統(tǒng)中,進(jìn)程既是基本的分配單元,也是基本的執(zhí)行單元。:第一,進(jìn)程是一個實體。每一個進(jìn)程都有它自己的地址空間,一般情況下,包括文本區(qū)域(text region)、數(shù)據(jù)區(qū)域(data region)和堆棧(stack region)。第二,進(jìn)程是一個“執(zhí)行中的程序”。2.什么是多道程序系統(tǒng)?多道程序系統(tǒng)是在計算機內(nèi)存中同時存放幾道相互獨立的程序,使它們在管理程序控制之下,相互穿插的運行。兩個或兩個以上程序在計算機系統(tǒng)中同處于開始和結(jié)束之間的狀態(tài)。多道程

2、序技術(shù)運行是我特征:多道,宏觀上并行,微觀上串行3.進(jìn)程具有那三種基本狀態(tài)?進(jìn)程的三種基本狀態(tài):就緒(Ready)狀態(tài) 、運行狀態(tài) 、阻塞狀態(tài)4. Linux內(nèi)核有那些主要功能?處理機調(diào)度,內(nèi)存管理,進(jìn)程管理,設(shè)備管理,文件管理等5.簡述內(nèi)核鏡像的構(gòu)建步驟。(1)構(gòu)建內(nèi)核映像vmlinux根據(jù)內(nèi)核源碼樹目錄(/)下.config文件中的配置,將系統(tǒng)核心組件(只任何時候都要編譯進(jìn)內(nèi)核的組件,如進(jìn)程調(diào)度模塊、內(nèi)存管理模塊等)和配置選項為built-in的系統(tǒng)組件進(jìn)行編譯,根據(jù)/arch/i386/kernel/(2) vmlinux瘦身及壓縮使用objcopy程序(GNU實用工具程序,作用是拷貝一

3、個目標(biāo)文件中內(nèi)容到另一個目標(biāo)文件中)刪除vmLinux中包含的多余信息,去掉.note和.comment段,并加vmLinux轉(zhuǎn)化成raw (3)構(gòu)建包含解壓縮代碼的vmlinux映像 binary(原始二進(jìn)制)格式。使用ld將包含壓縮的內(nèi)核核心的文件piggy.o與同一目錄下(/arch/(4) vmlinux再次瘦身通過objcopy程序刪除上一步生成的vmLinux映像中多余信息,去掉.note這一步中使用內(nèi)核源代碼中提供的內(nèi)核映像構(gòu)建工具build將bootsect、setup、vmlinux.bin三個文件一次存放到新建的bzImage文件中。和.comment段,轉(zhuǎn)化成為raw b

4、inary格式。(5)構(gòu)建內(nèi)核映像bzImage這一步中使用內(nèi)核源代碼中提供的內(nèi)核映像構(gòu)建工具build將bootsect、setup、vmlinux.bin三個文件一次存放到新建的bzImage文件中。6.什么是原子操作?所謂原子操作,就是該操作絕不會在執(zhí)行完畢前被任何其他任務(wù)或事件打斷,也就說,它是最小的執(zhí)行單位,不可能有比它更小的執(zhí)行單位,因此這里的原子實際是使用r物理學(xué)里的物質(zhì)微粒的概念,主要實現(xiàn)資源計數(shù)。第2章1、 XScale的超流水線由具體那幾種流水線組成?XScale的超流水線由整數(shù)處理(integer),乘加(MAC)和存儲(memory) 3條流水線組成2、 Arm Lin

5、ux嵌人式操作系統(tǒng)根據(jù)運行的層次,可以劃分為哪三大部分?可以劃分為啟動引導(dǎo)(Boot Loader)(BootLoader是一個嵌人式系統(tǒng)最初運行的一小段程序,它在系統(tǒng)復(fù)位時被調(diào)用運行), 操作系統(tǒng)內(nèi)核(Linux Kernel),文件系統(tǒng)(File System)3、對Linux操作系統(tǒng),BootLoader主要完成的任務(wù)有那幾項?BootLoader主要完成的任務(wù)有初始化處理器及外設(shè)的硬件資源配置、建立內(nèi)存空間的映射圖、裝載操作系統(tǒng)映像到內(nèi)存、對Flash編程、運行操作系統(tǒng)、傳遞系統(tǒng)啟動參數(shù)、命令行解析和輸入輸出控制4、 Boot Loader的第一階段(stage1)主要完成那些任務(wù)?硬

6、件設(shè)備初始化、為加載Boot Loader的stage2準(zhǔn)備內(nèi)存(主要是SDRAM)空間、復(fù)制Boot Loader的stage2到內(nèi)存空間、設(shè)置好堆棧,跳轉(zhuǎn)到stage2的入口點。5、PXA270RP上電復(fù)位執(zhí)行哪個程序?/src/blob/start.s6、start.s程序中的第1條指令是什么指令?reset/復(fù)位中斷跳轉(zhuǎn)到/src/blob/start.s執(zhí)行7.稱為匯編代碼與C代碼的結(jié)合點的程序是哪個程序?它與C代碼的結(jié)合點體現(xiàn)在那條指令上?/src/blob/xlli/mainstone/下面的trampoline.S體現(xiàn)在 bl main /跳轉(zhuǎn)到main.c中的main函數(shù)/8

7、.請說明下面代碼完成的功能。并加上注釋?normal_boot:movr7, #0x1000 /檢查開始的1M空間,每塊4Kmovr6, r7, lsl #8/4KBfile3 把file1,file2連接再重定向到file3。3、顯示用戶當(dāng)前工作路徑使用什么命令? pwd4、復(fù)制文件使用什么命令?cp , cp r 源文件 目的文件5、進(jìn)出目錄使用什么命令? cd 6、寫出以超級用戶身份執(zhí)行g(shù)db的命令行。sudo gdb (sudo:以超級用戶身份執(zhí)行)7、 vi有那3種模式?進(jìn)入vi時處于什么模式?vi有3種狀態(tài),即可視命令模式、冒號命令模式及文本編輯模式。進(jìn)入vi 時,首先進(jìn)入可視命令

8、方式8、存檔并退出vi用什么命令?在vi內(nèi),使用存檔或退出的指令,先按冒號(:),進(jìn)入冒號命令模式,用戶就可以看見在屏幕左下方,出現(xiàn)冒號“:”,這表示vi經(jīng)進(jìn)入冒號命令模式,在此可以完成存檔或退出工作。如輸入“:q”代表退出,“:w”表示存盤。:wq表示存檔并退出9、 寫出將main.c subr1.c subr2.c subr3.c編譯鏈接生成可執(zhí)行文件名為prog的gcc命令行。gcc -o prog main.c subr1.c subr2.c subr3.c10、寫出將main.c subr1.c subr2.c subr3.c編譯鏈接生成可執(zhí)行文件名為prog的名字為mymake的m

9、akefile文件。Prog:main.o subr1.o subr2.o subr3.o gcc o prog main.o subr1.o subr2.o subr3.o main.o: main.c main.h gcc c I o main.o main.c subr1.o:subr1.c gcc c o subr1.o subr1.c subr2.o:subr2.c gcc c o subr2.o subr2.c subr3.o:subr3.c gcc c o subr3.o subr3.c clean: rm f *.o 11、請分別寫出退出GDB以及在GDB中運行被調(diào)試程序的命令

10、。退出GDB命令:quit運行程序命令:run 12、每個設(shè)備驅(qū)動程序都具有那三種特性?每個設(shè)備驅(qū)動程序都具有特性:具有一整套的和硬件設(shè)備通信的例程,并且提供給操作系統(tǒng)一套標(biāo)準(zhǔn)的軟件接口、具有一個可以被操作系統(tǒng)動態(tài)地調(diào)用和移除的自包含組件、可以控制和管理用戶程序和物理設(shè)備之間的數(shù)據(jù)流。這里所說的設(shè)備驅(qū)動,主要是針對存儲器和外設(shè)(包括處理器內(nèi)部集成的存儲器和外設(shè)),而不是針對CPU核的。13、 Linux將存儲器和外設(shè)分為那3大類設(shè)備?Linux將存儲器和外設(shè)分為:字符設(shè)備:字符設(shè)備必須以串行順序依次進(jìn)行訪問的設(shè)備,是順序的數(shù)據(jù)流設(shè)備,這些字符連續(xù)地形成一個數(shù)據(jù)流,如觸摸屏、鼠標(biāo)、終端等。塊設(shè)備

11、: 塊設(shè)備可以用任意順序進(jìn)行訪問,以塊為單位進(jìn)行操作,這種設(shè)備使用緩沖區(qū)來存放暫時的數(shù)據(jù),等待條件成熟以后,從緩存一次性寫入設(shè)備或從設(shè)備中一次性讀出放入到緩沖區(qū),如硬盤、軟驅(qū)等。網(wǎng)絡(luò)設(shè)備: 網(wǎng)絡(luò)設(shè)備通過BSD socket接口訪問的設(shè)備,在系統(tǒng)和驅(qū)動程序之間定義有專門的數(shù)據(jù)結(jié)構(gòu)(skbuff)進(jìn)行數(shù)據(jù)的傳遞。系統(tǒng)里支持對發(fā)送數(shù)據(jù)和接收數(shù)據(jù)的緩存,提供流量控制機制,提供對多協(xié)議的支持.14、解釋hello_devp =kmalloc (sizeof(struct hello_dev),GFP_KERNEL);語句的功能。為devp設(shè)備開辟了一塊大小為sizeof(struct hello_dev

12、)大小的內(nèi)存單元15、 hello_devp和hello_setup_cdev函數(shù)中形參指針dev有什么關(guān)系?hello_setup_cdev中cdev指向hello_devp模擬變量,hello_devp是實參,后者是指針第5章1、 Linux字符設(shè)備驅(qū)動的關(guān)鍵數(shù)據(jù)結(jié)構(gòu)及作用是什么?cdev及file_operations結(jié)構(gòu)體。在Linux2. 6 下用 cdcv結(jié)構(gòu)體描述字符設(shè)備,其中, cdev的成員dev_t 用于定義設(shè)備號. file_operation用于定義字符設(shè)備驅(qū)動提供給虛擬文件系統(tǒng)的接口函數(shù). 2、加載與卸載模塊的作用是什么?模塊的加載函數(shù)首先會調(diào)用按鍵初始化函數(shù)來對設(shè)備

13、進(jìn)行初始化,包括設(shè)備號申請和設(shè)備的注冊等,之后會調(diào)用中斷處理函數(shù)申請中斷,模塊卸載函數(shù)的工作則恰好相反,會釋放中斷并注銷設(shè)備3、 Linux字符設(shè)備驅(qū)動有那些具體的接口函數(shù)?open入口點,CLOSE.,READ.,SELECT,WRITE.,IOCTL.4、已知PAX270GPIO相關(guān)各寄存器和地址如下:GPIO引腳替代功能寄存器:GAFR0_L:0X40E0 0054,GAFR0_U:OX40E0 0058GPIO方向寄存器GPDR0:0x40E0 000CGPIO引腳輸出設(shè)置寄存器GPSR0:0x40E0 0018GPIO引腳輸出狀態(tài)清除寄存器GPSR0:0x40E0 0018GPIO引

14、腳電平狀態(tài)寄存器:GPLR0:0x40E0 0000 請編寫C程序完成:(1)將GPIO引腳設(shè)置為GPIO功能;將GPIO引腳設(shè)置為替代功能3; #define gafr0_l(*(volatile unsigned*)0x40e00054)(2)將GPIO引腳設(shè)置為GPIO輸出,然后通過GPIO引腳輸出高電平;再執(zhí)行1+2+100;然后通過GPIO引腳輸出低電平。int i,sum=0;GAFR0_L &= (0X3(15*2);/把15位設(shè)置為普通GPIO GPDR0 |= 115;/將GPIO設(shè)置成 output GPSR0 | = 115;/將bit15置1 for(i=0;i=100

15、;i+)sum+=i;GPCR0 |=115;/將 bit15置 0第6章1、什么是內(nèi)存映射?給應(yīng)用程序提供一個方法,讓它能夠連續(xù)地查看到設(shè)備中的內(nèi)存,這個概念就叫做內(nèi)存映射。2、什么是I/O內(nèi)存?通常情況下,設(shè)備會提供一組寄存器來用于控制設(shè)備、讀寫設(shè)備和獲取設(shè)備狀態(tài),即控制寄存器、數(shù)據(jù)寄存器和狀態(tài)寄存器。這些寄存器有可能位于I/O空間,也可能位于內(nèi)存空間。位于內(nèi)存空間時,對應(yīng)的內(nèi)存空間被稱為I/O內(nèi)存。 I/O內(nèi)存是簡單的一個像RAM的區(qū)域,它被處理器用來跨過總線存取設(shè)備3、那些處理器中存在著I/O空間的概念,那些處理器中不存在著I/O空間的概念?X86處理器中存在著I/O空間的概念, I/

16、O空間是相對于內(nèi)存空間而言的。而大多數(shù)的嵌入式微控制器如ARM, PowcrPC等中并不提供I/O空間,而僅存在內(nèi)存空間4、Linux中完成I/O內(nèi)存映射的是哪個函數(shù)?試寫出該函數(shù)原型并解釋之。IoremapVoid*_ioremap(unsigned long offset,unsigned longsize); Ioremap的作用是吧一個屋里內(nèi)存位置映射為一個內(nèi)核指針,其長度由size參數(shù)指定,Ioremap()需要建立一個新的頁表,但是它并不進(jìn)行內(nèi)存的分配行為,它返回一個特殊的虛擬地址,可以用來存取特定的物理地址范圍5、參考撥碼驅(qū)動程序,解釋下面代碼中各語句的作用。 addr_stat

17、us=ioremap(0x08000018,0x0f);/*選擇CPLD2*/ outb(0x20,addr_status);/*寫I/O端口8字節(jié)寬*/ ioremap_addr=ioremap(0x0c014000,0x0f);/*將撥碼開關(guān)的物理地址映射為內(nèi)核指針*/6、寫出Linux中對I/O端口進(jìn)行8比特,16比特寬的數(shù)據(jù)讀取的函數(shù)的函數(shù)原型。unsigned inb(unsigned port);unsigned inw(unsigned port);7、參考LED點陣驅(qū)動程序,解釋下面代碼中各語句的作用。 addr_status=ioremap(0x08000018,0x0f);

18、/選擇CPLD2,將LED矩陣的物理地址映射到虛擬地址上 outb(0x20,addr_status);/將addr_status的第6位置1選中CPLD,寫IO端口 ioremap_addr=ioremap(0x0c00c000,0x0f);/將LED驅(qū)動物理地址映射到0x0c00c000上 outw(0x00ff,ioremap_addr);/打開LED矩陣設(shè)備,點亮所有的LED燈第7章1、IIC總線中,當(dāng)SCI為高電平時SDA由高電平向低電平跳變表示什么信號?表示開始信號/啟動信號表示開始信號/啟動信號2、接收數(shù)據(jù)的設(shè)備在接收到8位數(shù)據(jù)后,向發(fā)送數(shù)據(jù)的設(shè)備發(fā)出的低電平脈沖,表示已收到數(shù)據(jù)

19、。它表示什么信號?表示應(yīng)答信號ACK。3、IIC總線中,當(dāng)SCI為高電平時SDA由低電平向高電平跳變表示什么信號?表示停止信號4、IIC總線仲裁是分那兩步進(jìn)行?首先要進(jìn)行地址位的比較,如果主器件地址相同的從器件,則仲裁進(jìn)人數(shù)據(jù)位的比較。5、PXA27x處理器中,IDBR、ICR、ISR分別是什么寄存器?IDBR、ICR、ISR分別是8位IIC數(shù)據(jù)緩沖器寄存器、IIC控制寄存器、IIC狀態(tài)寄存器。6、Linux的IIC體系結(jié)構(gòu)由那幾部分組成?由IIC核心、IIC總線驅(qū)動、IIC設(shè)備驅(qū)動三部分組成7、I2c_core.c文件實現(xiàn)了那些功能?實現(xiàn)了IIC core框架,它負(fù)責(zé)管理總線設(shè)備驅(qū)動接口,實

20、現(xiàn)IIC設(shè)備的注冊、刪除、通信等功能。8、i2c_dev.c實現(xiàn)了IIC適配器設(shè)備文件的那些功能?包括的IIC總線字符設(shè)備的打開、關(guān)閉、讀寫、ioctl和lseek等。9i2c驅(qū)動中重要的數(shù)據(jù)結(jié)構(gòu)是那四種?struct i2c_driver, struct i2c_client,; struct i2c_adapter, struct i2c_algorithm 10、i2c_algorithm真正驅(qū)動硬件流程的函數(shù)是哪個函數(shù)?master_xfer()第2部分 補充部分概念部分:1、寫出下面各寄存器分別是GPIO的什么寄存器。GPDR0/1/2/3是GPIO的什么寄存器?GPIO管腳方向寄存

21、器GPSR0/1/2/3是GPIO的什么寄存器?GPIO引腳輸出寄存器GPCR0/1/2/3是GPIO的什么寄存器?GPIO輸出清除寄存器GPLR0/1/2/3是GPIO的什么寄存器?GPIO狀態(tài)寄存器GRER0/1/2/3是GPIO的什么寄存器?GPIO上升沿檢測使能寄存器 GFER0/1/2/3是GPIO的什么寄存器?GPIO下降沿檢測使能寄存器GEDR0/1/2/3是GPIO的什么寄存器?GPIO邊緣狀態(tài)檢測啟動寄存器2、驅(qū)動程序通常用哪個函數(shù)完成在內(nèi)核里申請內(nèi)存空間?寫出該函數(shù)的函數(shù)原型。驅(qū)動程序通常用kmalloc()函數(shù)完成在內(nèi)核里申請內(nèi)存空間,函數(shù)原型: void *kmallo

22、c(size_t size,int flags);3、Linux2. 6內(nèi)核提供了cdcv_init()、cdcv_alloc()、cdcv_add()、cdcv_del()函數(shù)用于操作cdcv結(jié)構(gòu)變量,請分別寫出這些函數(shù)的功能。cdcv_init()函數(shù)用于初始化cdev的成員,并建立cdev和file_operations的連接;cdcv_alloc()函數(shù)用于動態(tài)申請一個cdcv內(nèi)存;cdcv_add()函數(shù)和cdcv_del()函數(shù)分別向系統(tǒng)添加和刪除一個cdev,完成字符設(shè)備的注冊和注銷。前者一般在加載時使用,后者一般在卸載時使用。編程部分:1、 設(shè)有:struct hello_de

23、v struct cdev cdev; unsigned char value;struct hello_dev *hello_devp;請寫出使指針hello_devp;指向內(nèi)核區(qū)域中動態(tài)創(chuàng)建的hello_devp結(jié)構(gòu)體(結(jié)構(gòu)變量),并且將其初始化為0的代碼片段。hello_devp =kmalloc (sizeof(struct hello_dev),GFP_KERNEL);if (!hello_devp)result= - ENOMEM; goto fail_malloc; memset(hello_devp,0,sizeof(struct hello_dev);2、 設(shè)為某個驅(qū)動程序已

24、經(jīng)編寫了MY_open,MY_read,MY_write,MY_ioctl,MY_release函數(shù),請寫出聲明一個struct file_operations類型結(jié)構(gòu)體(結(jié)構(gòu)變量)my_fops,并且對其進(jìn)行初始化的聲明語句。struct file_operations hello_fops =.open=MY_open,.read=MY_read,.write=MY_write,.ioctl=MY_ioctl,.release=MY_release,;3、 定義一個宏MKDEV(major,index),形成major占高10位主設(shè)備號,index占低20位主次設(shè)備號。#define MK

25、DEV(major,index) (major)cdev,&gpio_fops); dev-cdev.owner=THIS_MODULE; dev-cdev.ops=&gpio_fops; err=cdev_add(&dev-cdev,devno,1); /注冊LED設(shè)備 if(err) printk(KERN_NOTICE Error %d adding gpio%d,err,index);5、設(shè)有清除例程(cleanup),讓它釋放它所分配的核心資源的函數(shù)原型聲明如下:void gpio_cleanup(void);請設(shè)計gpio_cleanup函數(shù)。void gpio_cleanup(v

26、oid)cdev_del(&gpio_devp-cdev);/注銷LED設(shè)備 kfree(gpio_devp);unregister_chrdev_region(MKDEV(gpio_major,0),1); /釋放LED設(shè)備號 printk(gpio_cleanupn);6、 寫出定義等待隊列頭my_wq,并初始化隊列的宏調(diào)用。DECLARE_WAIT_QUEUE_HEAD (my_wq);7、已知GPCR3的bit0,bit1為1時將點亮LED1和LED2,GPSR3的bit0,bit1為1時將熄滅LED1和LED2;并且形參cmd為0時要求點亮LED1和LED2,形參cmd為1時要求熄滅

27、LED1和LED2。請根據(jù)上述要求在下劃線處完善下面GPIO設(shè)備驅(qū)動的I/O控制函數(shù)ssize_t SIMPLE_GPIO_ioctl (struct inode * inode ,struct file * file, unsigned int cmd, unsigned long data) #ifdef OURS_GPIO_DEBUG printk (SIMPLE_GPIO_ioctl -kernel-n); #endif switch(cmd) case 0: case1: default: printk(led control:no cmd runn); return (-ENOTT

28、Y); return 0;8、設(shè)有聲明unsigned char ch;已知某CPLD的物理地址為0x08000100,向它寫0x20表示選中該CPLD;CPLD上與撥碼開關(guān)對應(yīng)寄存器的物理地址為0x08000180,請寫出將物理地址0x08000100映射到虛擬地址addr_status,將物理地址0x08000180映射到虛擬地址ioremap_addr上,然后選中CPLD并且將與撥碼開關(guān)對應(yīng)寄存器中內(nèi)容讀到ch中的代碼片段。addr_status=ioremap(0x08000100,0x0f);outb(0x20,addr_status); ioremap_addr=ioremap(0

29、x08000180,0x0f); ch = inb(ioremap_addr);9、已知buf是指向用戶空間某字符變量的指針,ioremap_addr是某設(shè)備端口物理地址映射后的虛擬地址。下面是從端口一讀入數(shù)據(jù)到tmp0,然后將tmp0拷貝到用戶空間buf指針指向變量的部分程序,請在下劃線處完善該程序,使其完成指定的任務(wù)。ssize_t dip_sw_read (struct file * file ,char * buf, size_t count, loff_t * f_ops) char tmp1;#ifdef OURS_GPIO_DEBUGprintk (dip_sw_read -kernel-n);#endif tmp0=inb(ioremap_addr);/

溫馨提示

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

評論

0/150

提交評論