复习嵌入式.doc

上传人:飞****2 文档编号:78787933 上传时间:2023-03-19 格式:DOC 页数:14 大小:62KB
返回 下载 相关 举报
复习嵌入式.doc_第1页
第1页 / 共14页
复习嵌入式.doc_第2页
第2页 / 共14页
点击查看更多>>
资源描述

《复习嵌入式.doc》由会员分享,可在线阅读,更多相关《复习嵌入式.doc(14页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、选择题1、不属于守护进程的是()A、创建子进程,父进程退出;B、调用setsid()创建一个新的会话,并担任该会话组组长;C、改变当前目录为根目录chdir(“/”);D、重设文件权限掩码umask(1)。2、以下哪个GUI是由中国人主持的一个自由软件项目:( )AMinuGUIBOpenGUI C MicroWindows D Qt/Embedded3、下列进程状态的转换中,不正确的是( )。 A. 就绪一运行 B运行一就绪C就绪一阻塞 D阻塞一就绪4、多个进程的实体能存在于同一内存中,在一段时间内都得到运行。这种性质称作进程的( )。 A动态性 B并发性 C. 调度性 D异步性5、通常所讲

2、的交叉编译就是在X86架构的宿主机上生成适用于ARM架构的( )格式的可执行代码。A 、elf B、exe C、 pe D、 sh6、通常用户编写的程序中所使用的地址是( )。 A. 逻辑地址 B物理地址C. 绝对地址 D内存地址7、下列对设备驱动程序功能的叙述,顺序不正确的是()。A对设备进行初始化 B把数据从内核传送到硬件和从硬件读取数据C读取应用程序传送给设备文件的数据和会送应用程序请求的数据D不需对设备驱动释放8、设备的打开、关闭、读、写等操作是由( )完成的。 A. 用户程序 B编译程序 C. 设备分配程序 D设备驱动程序9、以下哪个不是Linux进程的状态:( )A. TASK_Z

3、OMBIE B. TASK_INTERRUPTIBLE C. TASK_RUNNING D. TASK_SUSPENDED10、每个设备文件都对应有两个设备号,而标识该设备的种类,也标识了该设备所使用的驱动程序的识别号是指( )A、 主设备号 B、次设备号 C、块设备号 D、字符设备号判断改错题。注意:1、用户程序应与实际使用的物理设备无关,这种特性就称作设备独立性。正确。2、普通进程可以通过管道机制同守护进程进行通信。错误。可以用命名管道FIFO,不能用无名管道,因为无名管道通讯方式必须要在有亲缘关系的进程中实现。3、自旋锁在任何时刻可以有超过一个的保持者。错误。只有一个拥有者。4、进程的几

4、个状态之间可以相互转化。错误,(1分)只有就绪态和执行态可以。其他两个都是单向的。(1分)5、在Linux系统中,当一个进程fork()一个新的子进程时,这个子进程将父进程的进程控制块,进程内存控制信息,文件访问信息,上下文等资源全部继承,即做了一个完整的副本。错误。父进程产生子进程时,只分配一个指向父进程的指针向量,当子进程执行时才从父进程那复制一份为自己所用。6、应用层考虑网络编程模型时,TCP与UDP可以任意选用,只要在本机上(localloop)调试能通过调试就行。错误。还应考虑底层网络通信质量是否可靠。7、命名管道在完成进程间通信的任务后,系统就将资源回收,不能再被任何进程读或写了。

5、错误。当共享管道的进程执行完所有的I / O操作以后,命名管道将继续保存在文件系统中以便以后使用。8、为了提高CPU执行效率,在驱动程序编写的时候应尽可能地对I/O设备访问采用阻塞方式;在应用层程序编写的时候则对用户进程采取非阻塞的方式。错误 。刚好相反。在用户空间应该尽量采用阻塞方式,这样在用户进程得不到执行所需要的资源的时候能从运行态转到阻塞或就绪态,让出CPU从而别的进程去执行,提高了效率。而对于驱动程序而言,由于是在内核态执行,应该尽可能地不要打断对外设的访问,快速的完成,避免CPU忙地等待。 9、如果fork()系统函数调用成功,返回值只有一种,要么是0(在子进程中)要么是子进程的I

6、D号。错误。创建成功,它是唯一有两个返回值的系统调用,需要同时在父进程和子进程中给出返回值10、进程ID为1通常是init进程,在自举过程结束时由内核调用。init进程绝不会终止,它是一个系统进程,并且以超级用户特权运行。错误,它是一个普通的用户进程(与交换进程不同,它不是内核中的系统进程)。填空题(每空0.5分,共20分)2、进程的运行有两种方式,即(独立,)和(使用父进程)。4、Linux系统是一个多进程的系统,进程之间具有(并行性)、(互不干扰)的特点。linux中进程包含3个段,分别为(代码段)、(堆栈段)和(数据段)。(信号)是软件中断,它是Unix系统中最为古老的进程之间的通信机制

7、,它被经常用于在一个或多个进程之间传递(异步)信号。5信号处理的主要方法有两种,一种是(使用简单的signal函数),另一种是(使用信号集函数组)6信号操作的一般流程是(定义信号集)、(设置信号屏蔽位)、(定义信号处理函数)、(测试信号)。7消息队列的实现包括(创建和打开队列)、(添加消息)、(读取消息)和(控制消息队列)这四种操作。8通过(虚拟内存)地址空间的页与物理地址空间中的页之间的映射,(分页机制)可实现虚拟内存地址到物理内存地址之间的转换。10、linux的任务状态中,主要用于设备驱动程序开发的是 _TASK_UNINTERRUPTIBLE。12、字符型设备的读写以(字节)为单位,存

8、取时没有缓存。对字符型设备发出读写请求时,实际的硬件I/O紧接着就发生了。13、普通进程与daemon进程的最主要区别是daemon常驻内存。14、嵌入式系统程序员经常需要编写一些直接访问控制外设的代码。对于不同的嵌入式处理器体系机构,外设可能采用(内存映射方式)方式(如Motorola的大部分嵌入式处理器),也可能采用(端口映射方式)方式(如Intel的大部分嵌入式处理器)。15、进程的实体包括哪三个部分程序,、数据,进程控制块、 。简答题(每小题2分,共20分)1、简述设备驱动的开发流程。查看原理图,理解设备的工作原理;定义主设备号;在驱动程序中实现驱动的初始化,如果驱动程序采用模块的方式

9、,则实现模块的初始化;设计所要实现的文件的操作,定义file_operation结构;实现中断服务(中断并不是每个设备驱动所必须的);编译该驱动程序到内核中,或者用insmod命令加载;测试该设备。4、简述自旋锁与信号量的异同点?答案:自旋锁与信号量的相同点:它们功能上的相似性,无论是信号量,还是自旋锁,在任何时刻,最多只能有一个保持者,即在任何时刻最多只能有一个执行单元获得锁;不同点:它们在本质和实现机理上完全不一样,不属于一类。自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环查看是否该自旋锁的保持者已经释放了锁,自旋就是在原地打转。而信号量则引起调用者睡眠,它把

10、进程从运行队列上拖出去,除非获得锁。自旋锁适合于保持时间非常短的情况,它可以在任何上下文使用;信号量适合于保持时间较长的情况,会只能在进程上下文使用。5、什么是守护进程?守护进程的特征有哪些?守护进程( daemon)是生存期长的一种进程。它们常常在系统引导装入时起动,在系统关闭时终止。因为它们没有控制终端,所以说它们是在后台运行的。守护进程特征:(1)所有守护进程都以超级用户(用户I D为0)的优先权运行。(2)没有一个守护进程具有控制终端终端名称设置为问号(?)、终端前台进程组I D设置为1。缺少控制终端可能是精灵进程调用了s e t s i d的结果。(3)除u p d a t e以外的

11、所有精灵进程都是进程组的首进程,对话期的首进程,而且是这些进程组和对话期中的唯一进程。u p d a t e是它所在进程组和对话期(中的唯一进程,但是该进程组的首进程(可能也是该对话期的首进程)已经终止。(4)所有这些守护进程的父进程都是i n i t进程6、字符设备驱动和块设备驱动的区别在对字符驱动发出读写请求时,实际的硬件I/O一般紧接着发;块设备则不然,它利用一块系统内存作为缓冲区,若用户进程对设备的请求能满足用户需求,就返回请求的数据,否则,就调用函数来进行实际的操作。7、驱动程序对外设物理地址的访问方式?统一编址:I/O内存映射,I/O端口映射。 独立编址:直接I/O端口访问。 8、

12、内核空间和用户空间通过什么进行交互?外部设备与内核空间通过什么进行交互?系统调用用来对内核空间与用户空间交互,而外设与内核空间的交互则通过驱动程序交互。9、如何使用内核定时器?基本流程为:1、 创建timer,编写function.2、 为time的expires,data,function赋值3、 调用add_time 将timer加入列表4、 定时器到期后,function被执行5、 在涉及到timer的时候适当地调用del_timer。删除timer或修改timer的expires:Struct timer_list mytimer;init_timer(&mytimner);mytim

13、er.function=mytimer_ok;mytime.expires=jiffies+HZ/100;add_timer(&mytimer);del_timer(&mytimer);各个系统调用可以根据情况放置于不同的内核模块函数中。10、什么情况下用共享内存、信号、消息队列?(1)从资源使用情况; (2)任务规模大小;(3)进程的同步或异步性质。 操作题。写出完成以下功能的命令:每小题2分,满分12分。1、新建文件夹/helloworld, 并创建名为helloworld.c的文件。mkdir helloworld2、终止进程号为3857的进程。kill 38573、查看加载的U盘的名称

14、fdisk -l5、卸载已安装的rpm文件rpm -e6、更改用户root的密码(在提示符下)。password root一、选择题 1、以下哪个不是Linux进程的状态:( )A. TASK_ZOMBIE B. TASK_INTERRUPTIBLEC. TASK_RUNNING D. TASK_SUSPENDED2、多个进程的实体能存在于同一内存中,在一段时间内都得到运行。这种性质称作进程的( )。 A动态性 B并发性 C. 调度性 D异步性3、下列进程状态的转换中,不正确的是( )。 A. 就绪一运行 B运行一就绪C就绪一阻塞 D阻塞一就绪4、每个设备文件都对应有两个设备号,而标识该设备的

15、种类,也标识了该设备所使用的驱动程序的识别号是指( )A主设备号 B、次设备号 C、块设备号 D、字符设备号5、在下面的叙述中,( )不是嵌入式图形用户接口(GUI)的主要特点。A. 运行时占用的系统资源少 B. 模块化结构,便于移植和定制C. 可靠性高 D. 美观华丽,图形算法复杂6、操作系统内核与用户程序、应用程序之间的接口是( )。 Ashell命令 B图形界面C. 系统调用 D. C语言函数7、系统软件是_的软件。A、向应用软件提供系统调用等服务 B、与具体硬件逻辑功能无关C、在应用软件基础上开发 D、并不具体提供人机界面8、设备的打开、关闭、读、写等操作是由( )完成的。 A. 用户

16、程序 B编译程序 C. 设备分配程序 D设备驱动程序9、通常,用户编写的程序中所使用的地址是( )。 A. 逻辑地址 B物理地址 C. 绝对地址 D内存地址10、设备按照信息的传递特性可分为_和块设备。A、共享设备 B、输入输出设备 C、系统设备 D、字符设备二、判断改错题。1、POSIX中两种线程同步机制,分别是互斥锁和信号量。其中,信号量用在多线程多任务同步的场合,而互斥锁是用在多线程多任务互斥的场合。正确2、编程往一个文件中写入数据,实现打开文件的语句是:fp=fopen(data.txt,r+);正确3、 exit的作用:直接使进程停止运行,清除其使用的内存空间,并清除其在内核中的数据

17、结构; 正确。4、 自旋锁在任何时刻可以有超过一个的保持者。正确。5、 自旋锁不会引起调用者的睡眠,信号量会。正确。6、 标准I/O提供了两种缓冲:全缓冲,行缓冲。正确7、 Linux应用层中可以用阻塞和非阻塞的方式打开文件。正确8、 fork创建进程若是成功,将返回子进程的ID.正确9、 守护进程比超级用户的优先权要低。正确10、 ARM9能直接访问物理地址。正确三、填空题1、驱动程序的常用接口函数有_ open、_ close、 、read 、_、write、_、ioctl。2、驱动程序对外设物理地址的访问方式。统一编址:_ (I/O内存映射),(I/O端口映射)。独立编址:_ (直接I/

18、O端口访问) 。3、普通进程与daemon进程的最主要区别是_ daemon进程常驻内存 。4、linux内核模块的编译方法有哪几种_静态内核编译 、_动态模块加载 。.5、进程的实体包括哪三个部分_程序、_数据集合、_进程控制快 。6、进程间通信的方式有_信号,信号量,消息队列,共享内存。7、fork返回值有 _返回0子进程 、_子进程ID 、_返回-1出错 等三种情况。8、Linux内核有2种加载驱动程序的方法,分别是_静态加载 、_动态加载 。9、I/O内存的访问步骤要用到的俩个重要函数是_ void * ioremap() 、_ void * iounmap() 。10、中断过程的5个

19、阶段为_请求中断 、_保护现场 、_中断服务 、_返回现场 、_中断返回 。 11、ARM9的驱动编程模型中,是通过_ I/O映射 方法访问物理内存的。 12、多线程的设计在单处理器上仍具有十分有效的作用,具体表现在_响应时间 和_吞吐量 。13、标准I/O提供了三种类型的缓冲:全缓冲、行缓冲和不带缓冲。则标准出错流stderr属于_ 不带缓冲 类型。14、在文件I/O函数中_ lseed 函数能显示的为一个打开的文件设置其偏移量。15、Linux内核一般通过_ jiffies值 来获取当前时间。四、简答题1、LINUX使用的进程间通信方式有哪些?管道和命名管道、信号、消息队列、共享内存、信号

20、量、套接字2、 命名管道与一般管道的区别a.命名管道是在文件系统中作为一个特殊的设备文件而存在的b.不同祖先的进程之间可以通过管道共享数据c.当共享管道的进程执行完所有的I/O操作后,命名管道将继续保存在文件系统中以便以后使用3、 设备节点无法打开的原因有哪些?答:a.设备节点没有被创建b.驱动程序中注册的设备文件名与创建的节点不一致4、 设备驱动的初始化函数需要完成的功能有哪些?答:a.对驱动程序管理的硬件进行必要的初始化b.初始化设备驱动相关的参数c.在内核注册设备d.注册中断,如果设备需要IRQ支持,则要注册中断e.其他初始化工作:比如给设备分配I/O5、 字符设备驱动和块设备驱动的区别

21、答:在对字符驱动发出读写请求时,实际的硬件I/O一般紧接着发;块设备则不然,它利用一块系统内存作为缓冲区,若用户进程对设备的请求能满足用户需求,就返回请求的数据,否则,就调用函数来进行实际的操作。五、操作题。写出完成以下功能的命令:每小题1分,满分6分。1、在/root文件夹下查找后缀为.c的文件。find /root name *.c 3、查看本机的网址。ifconfig eth04、查看已安装的rpm软件包。rpm qia5、给文件a.txt做一个备份b.txt。cp a.txt b.txt6、查看关于mkdir的帮助文档。man mkdir六、程序填空题(每小题2分,共14分)7、Led

22、灯驱动功能模块(中断模式):#define MAJOR_NUM 251static void* out_base;static int _init led_init(void)int ret;ret = register_chrdev(MAJOR_NUM, led, &led_fops);if(ret)printk(led register failuren);elseprintk(led register successn);_ requset_mem_region(0x,0x0100,led);_;_ out_base=ioremap(0x,0x0100);_;_set_external_

23、irq(IRQ_EINT2,EXT_FALLING_EDGE,GPIO_PULLUP_DIS);_;_ request_irq(IRQ_EINT2,led_interfunc,0,led,0);_;return ret;static void _exit led_exit(void)int ret;_ free_irq(IRQ_EINT2,0);_;_ iounmap(out_base);_ release_mem_region(0x,0x0100);_;ret = unregister_chrdev(MAJOR_NUM, led);if (ret)printk(led unregister

24、failuren);elseprintk(led unregister successn);程序填空题(每小题3分,共12分)9、下面是创维特实验箱上的蜂鸣器模块驱动程序的部分代码,请在空白处填写完整的代码,完成程序。说明:JXARM-2410教学实验系统的蜂鸣器脉冲输入端口连接到S3C2410X的TOUT0端口,即定时器0的脉冲输出端口。通过修改TCNTB0和TCMPB0来设置输出的频率freq和占空比rate。TCNTB0用于设置输出频率,TCNTB0寄存器div的计算公式如下:div=PCLK/预分频值+1/时频驱动器取值/freq,其中:预分频值=0255由TCFG0设定;时频驱动器取

25、值=2、4、8、16,由TCFG1设定,通过设置TCMPB0寄存器调整占空比(rate),该寄存器取值value的计算公式为:value=div*占空比,其中,占空比小于1。#include #include#include #define pwm_device_MAJOR 252 #define interrupt_n IRQ_TIMER0 #define DEVICE_NAME pwm_device #define PWM_CTL_BASE io_p2v(0x)/* get the virtual address map to GPF */#define S3C2410_TCFG0 (PW

26、M_CTL_BASE + 0x0)#define S3C2410_TCFG1 (PWM_CTL_BASE + 0x4)#define S3C2410_TCON (PWM_CTL_BASE + 0x8)#define S3C2410_TCNTB0(PWM_CTL_BASE + 0xC)#define S3C2410_TCMPB0(PWM_CTL_BASE + 0x10)#define GPB_CTL_BASE io_p2v(0x)#define S3C2410_GPBCON (GPB_CTL_BASE + 0x0)#define S3C2410_GPBDAT (GPB_CTL_BASE + 0x

27、4)static ssize_t pwm_device_write(struct file*flie,const char * buffer, size_t count, loff_t *ppos); static void pwm_device_irq(int irq,void *dev_id,struct pt_regs *regs);static void _exit pwm_device_cleanup(void); static int _init pwm_device_init(void); static devfs_handle_t devfs_pwm_device;struct

28、 unit u32 *T_CFG0;u32 *T_CFG1;u32 *T_CON;u32 *T_CNTB0;u32 *T_CMPB0;u32 *GPB_CON;u32 *GPB_DAT;static struct unit pwm_unit = .T_CFG0= (u32 *)S3C2410_TCFG0,.T_CFG1= (u32 *)S3C2410_TCFG1,.T_CON=(u32 *)S3C2410_TCON,.T_CNTB0=(u32 *)S3C2410_TCNTB0,.T_CMPB0=(u32 *)S3C2410_TCMPB0,.GPB_CON=(u32 *)S3C2410_GPBC

29、ON,.GPB_DAT=(u32 *)S3C2410_GPBDAT,;static struct file_operations pwm_device_fops= owner:THIS_MODULE, llseek:NULL, read: pwm_device_read, write: pwm_device_write, ioctl: pwm_device_ioctl, open: pwm_device_open, release: pwm_device_close, ; static void pwm_device_irq(int irq,void *dev_id,struct pt_reg

30、s *regs) SRCPND = INT_TIMER0; /Clear pending bit INTPND = INT_TIMER0;/INT_TIMER0 static void pwm_device_port_init(struct unit *unit) *unit-GPB_CON &=1;*unit-GPB_CON |=2;*unit-T_CFG0&=0xff;*unit-T_CFG0|=39;*unit-T_CFG1&=0xf;*unit-T_CFG1|=3;*unit-T_CNTB0=792;*unit-T_CMPB0=396; static int _init pwm_dev

31、ice_init(void) int result; int res;1、 result= request_irq(interrupt_n,pwm_device_irq,SA_INTERRUPT,DEVICE_NAME,pwm_device_irq) ;devfs_pwm_device= devfs_register(NULL,DEVICE_NAME, DEVFS_FL_DEFAULT,pwm_device_MAJOR, 0, S_IFCHR | S_IRUSR | S_IWUSR,&pwm_device_fops, NULL); res = devfs_register_chrdev( pw

32、m_device_MAJOR, DEVICE_NAME, &pwm_device_fops ;);if (rest); printk(OKn);pwm_device_port_init(&pwm_unit);return 0; /writevvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv static ssize_t pwm_device_write(struct file*flie,const char * buffer, size_t count,

33、 loff_t *ppos) printk(pwm_device WRITE!n); return 0; /repwm_devicevvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv static ssize_t pwm_device_read(struct file * file,char * buffer, size_t count, loff_t *ppos) return 0; /= static int pwm_device_ioctl(

34、struct inode *inode ,struct file* file,unsigned int cmd,unsigned long arg) struct unit *unit = (struct unit *)file-private_data;if(cmd=0)*unit-GPB_CON &= 0x2;/PBCON1=0 *unit-GPB_CON |= 0x1;/PBCON0=1 *unit-GPB_DAT|=0x1;else*unit-GPB_CON &=1;*unit-GPB_CON |=2;switch(cmd)case 1:*unit-T_CNTB0=792;*unit-

35、T_CMPB0=396;break;case 2:*unit-T_CNTB0=792;*unit-T_CMPB0=264;break;case 3:*unit-T_CNTB0=396;*unit-T_CMPB0=132;break;case 4:*unit-T_CNTB0=396;*unit-T_CMPB0=260;break;*unit-T_CON |= (12)|(1T_CON &= (1T_CON |= (13)|(1T_CON &=1; return 0; /= static int pwm_device_open(struct inode *inode,struct file *fi

36、le) /printk(KERN_CRITDEMO:pwm_device Device Open n);file-private_data = &pwm_unit;MOD_INC_USE_COUNT; return 0; /= static int pwm_device_close(struct inode *inode,struct file *file) /printk(KERN_CRITDEMO:pwm_device device closen); MOD_DEC_USE_COUNT; return 0; /= static void _exit pwm_device_cleanup(v

37、oid) 2、 devfs_unregister_chrdev(pwm_device_MAJOR, DEVICE_NAME ;);3、 free_irq( interrupt_n,pwm_device_irq ;); printk(DEMO:pwm_device device is cleanupn); module_init(pwm_device_init); module_exit(pwm_device_cleanup);MODULE_AUTHOR(GROUP_ONE); MODULE_DESCRIPTION(pwm_driver char driver); MODULE_LICENSE(GPL);AAA

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com