黑科技,网站优化及推广,网站开发包含网页设计吗,网站开发技术更多干货推荐可以去牛客网看看#xff0c;他们现在的IT题库内容很丰富#xff0c;属于国内做的很好的了#xff0c;而且是课程刷题面经求职讨论区分享#xff0c;一站式求职学习网站#xff0c;最最最重要的里面的资源全部免费#xff01;#xff01;#xff01;点击进… 更多干货推荐可以去牛客网看看他们现在的IT题库内容很丰富属于国内做的很好的了而且是课程刷题面经求职讨论区分享一站式求职学习网站最最最重要的里面的资源全部免费点击进入--------------》跳转接口 更多干货推荐可以去牛客网看看他们现在的IT题库内容很丰富属于国内做的很好的了而且是课程刷题面经求职讨论区分享一站式求职学习网站最最最重要的里面的资源全部免费点击进入--------------》跳转接口 参考嵌入式常见面试题总结1 作者天泉证道 发布时间 2018-11-08 09:33:43 网址https://guoyanzhang.blog.csdn.net/article/details/83855895 目录1字符型驱动设备是怎么创建设备文件的就是/dev/下面的设备文件供上层应用程序打开使用的文件2写一个中断服务需要注意哪些如果中断产生之后要做比较多的事情你是怎么做的3自旋锁和信号量在互斥使用时需要注意哪些在中断服务程序里面的互斥是使用自旋锁还是信号量还是两者都能用为什么4原子操作你怎么理解5nsmod 一个驱动模块会执行模块中的哪个函数rmmod呢这两个函数在设计上要注意哪些遇到过卸载驱动出现异常没是什么问题引起的6在驱动调试过程中遇到过oops没你是怎么处理的7ioctl和unlock_ioctl有什么区别8驱动中操作物理绝对地址为什么要先ioremap?9设备驱动模型三个重要成员是platfoem总线的匹配规则是在具体应用上要不要先注册驱动再注册设备有先后顺序没10linux中内核空间及用户空间的区别用户空间与内核通信方式有哪些?11linux中内存划分及如何使用虚拟地址及物理地址的概念及彼此之间的转化高端内存概念高端内存和物理地址、逻辑地址、线性地址的关系12linux中中断的实现机制tasklet与workqueue的区别及底层实现区别为什么要区分上半部和下半部13linux中断的响应执行流程中断的申请及何时执行(何时执行中断处理函数)14linux中的同步机制spinlock自旋锁与信号量的区别15、linux中RCU原理16linux中软中断的实现原理17linux系统实现原子操作有哪些方法18MIPS Cpu中空间地址是怎么划分的如在uboot中如何操作设备的特定的寄存器19,linux中系统调用过程如:应用程序中read()在linux中执行过程即从用户空间到内核空间20,linux内核的启动过程(源代码级)21,linux调度原理22,linux网络子系统的认识23,linux内核里面内存申请有哪几个函数各自的区别24,IRQ和FIQ有什么区别在CPU里面是是怎么做的25,中断的上半部分和下半部分的问题讲下分成上半部分和下半部分的原因为何要分讲下如何实现26,内核函数mmap的实现原理机制27,驱动里面为什么要有并发、互斥的控制如何实现讲个例子28,spinlock自旋锁是如何实现的29,任务调度的机制30,嵌入式linux和wince操作系统的特点和特性31,嵌入式linux中tty设备驱动的体系结构32,嵌入式设备为加快启动速度可以做哪些方面的优化33,USB设备的枚举过程34,PSRAM、SDRAM、DDR、DDR2的时序特性35什么是GPIO36触摸屏的硬件原理37在Linux C中ls这个命令是怎么被执行的?38在一个只有128M内存并且没有交换分区的机器上说说下面两个程序的运行结果?39请定义一个宏比较两个数a、b的大小不能使用大于、小于、if语句40LINUX下的Socket套接字和Windows下的WinSock有什么共同点请从C/C语言开发的角度描述至少说出两点共同点41请编写一个标准Shell脚本testd实现如下功能42.你平常是怎么用C写嵌入式系统的死循环的?43写一条命令实现在dir以及其子目录下找出所有包含“hello world”字符串的文件44下面的两段程序中循环能否执行为什么45一个计划跑LINUX系统的ARM系统把bootloader烧录进去后上电后串口上没有任何输出硬件和软件各应该去检查什么46列举最少3种你所知道的嵌入式的体系结构并请说明什么是ARM体系结构。47请简述下面这段代码的功能48嵌入式中常用的文件系统有哪些说出它们的主要特点和应用场合?49某外设寄存器rGpioBase的地址是0x56000000,寄存器的0~15位有效请写出给外设寄存器高八位(8~15位)设置成0xc3的代码50如何编写一个LINUX驱动1字符型驱动设备是怎么创建设备文件的就是/dev/下面的设备文件供上层应用程序打开使用的文件
答方式一手动mknod命令结合设备的主设备号和次设备号可创建一个设备文件
方式二自动UDEV/MDEV自动创建设备文件的方式UDEV/MDEV是运行在用户态的程序可以动态管理设备文件包括创建和删除设备文件运行在用户态意味着系统要运行之后
方式三自动在系统启动期间还有devfs创建了设备文件。
2写一个中断服务需要注意哪些如果中断产生之后要做比较多的事情你是怎么做的
答(1)中断处理例程应该尽量短注意快进快出在中断服务程序里面尽量快速采集信息包括硬件信息然后推出中断要做其它事情可以使用工作队列或者tasklet方式。也就是中断上半部和下半部
(2)中断服务程序中不能有阻塞操作
(3)中断服务程序注意返回值要用操作系统定义的宏做为返回值而不是自己定义的FAILOK之类的。
中断服务程序ISRInterrupt Service Routines处理器处理急件可理解为是一种服务是通过执行事先编好的某个特定的程序来完成的。
3自旋锁和信号量在互斥使用时需要注意哪些在中断服务程序里面的互斥是使用自旋锁还是信号量还是两者都能用为什么
答使用自旋锁的进程不能睡眠使用信号量的进程可以睡眠。中断服务例程中的互斥使用的是自旋锁原因是在中断处理例程中硬中断是关闭的这样会丢失可能到来的中断。
自旋锁它是为实现保护共享资源而提出一种锁机制。其实自旋锁与互斥锁比较类似它们都是为了解决对某项资源的互斥使用。无论是互斥锁还是自旋锁在任何时刻最多只能有一个保持者也就说在任何时刻最多只能有一个执行单元获得锁。但是两者在调度机制上略有不同。对于互斥锁如果资源已经被占用资源申请者只能进入睡眠状态。但是自旋锁不会引起调用者睡眠如果自旋锁已经被别的执行单元保持调用者就一直循环在那里看是否该自旋锁的保持者已经释放了锁自旋一词就是因此而得名。
信号量有时被称为信号灯是在多线程环境下使用的一种设施是可以用来保证两个或多个关键代码段不被并发调用。在进入一个关键代码段之前线程必须获取一个信号量;一旦该关键代码段完成了那么该线程必须释放信号量。其它想进入该关键代码段的线程必须等待直到第一个线程释放信号量。为了完成这个过程需要创建一个信号量VI然后将Acquire Semaphore VI以及Release Semaphore VI分别放置在每个关键代码段的首末端。确认这些信号量VI引用的是初始创建的信号量。
互斥锁在多线程开发中我们采用synchronized来创建一个互斥锁保证在同一时刻只有一个线程对其进行操作。
4原子操作你怎么理解
答原子操作即不可分割开的操作该操作一定是在同一个cpu时间片中完成这样即使线程被切换多个线程也不会看到同一块内存中不完整的数据。如果这个操作所处的层(layer)的更高层不能发现其内部实现与结构那么这个操作是一个原子(atomic)操作。原子操作可以是一个步骤也可以是多个操作步骤但是其顺序不可以被打乱也不可以被切割而只执行其中的一部分。将整个操作视作一个整体是原子性的核心特征。
5nsmod 一个驱动模块会执行模块中的哪个函数rmmod呢这两个函数在设计上要注意哪些遇到过卸载驱动出现异常没是什么问题引起的
答insmod调用init函数rmmod调用exit函数。
卸载模块时曾出现卸载失败的情形原因是存在进程正在使用模块检查代码后发现产生了死锁的问题。
要注意在init函数中申请的资源在exit函数中要释放包括存储ioremap定时器工作队列等等。也就是一个模块注册进内核退出内核时要清理所带来的影响带走一切不留下一点痕迹。
6在驱动调试过程中遇到过oops没你是怎么处理的
答什么是Oops从语言学的角度说Oops应该是一个拟声词。当出了点小事故或者做了比较尴尬的事之后你可以说Oops翻译成中国话就叫做“哎呦”。“哎呦对不起对不起我真不是故意打碎您的杯子的”。看Oops就是这个意思。
在Linux内核开发中的Oops是什么呢其实它和上面的解释也没什么本质的差别只不过说话的主角变成了Linux。当某些比较致命的问题出现时我们的Linux内核也会抱歉的对我们说“哎呦Oops对不起我把事情搞砸了”。Linux内核在发生kernel panic时会打印出Oops信息把目前的寄存器状态、堆栈内容、以及完整的Call trace都show给我们看这样就可以帮助我们定位错误。
7ioctl和unlock_ioctl有什么区别
答ioctl是设备驱动程序中对设备的I/O通道进行管理的函数。所谓对I/O通道进行管理就是对设备的一些特性进行控制例如串口的传输波特率、马达的转速等等。它的调用个数如下 int ioctl(int fd, ind cmd, …)
其中fd是用户程序打开设备时使用open函数返回的文件标示符cmd是用户程序对设备的控制命令至于后面的省略号那是一些补充参数一般最多一个这个参数的有无和cmd的意义相关。ioctl函数是文件结构中的一个属性分量就是说如果你的驱动程序提供了对ioctl的支持用户就可以在用户程序中使用ioctl函数来控制设备的I/O通道。
在驱动程序中这个指针函数变了之后最大的影响是参数中少了inode 所以应用程序ioctl是兼容的但驱动程序中我们的ioctl函数必须变化,否则就会发生cmd参数的变化。
8驱动中操作物理绝对地址为什么要先ioremap?
答因为内核没有办法直接访问物理内存地址必须先通过ioremap获得对应的虚拟地址。
ioremap将一个IO地址空间映射到内核的虚拟地址空间上去便于访问。
9设备驱动模型三个重要成员是platfoem总线的匹配规则是在具体应用上要不要先注册驱动再注册设备有先后顺序没
答三个重要成员设备device驱动deriver总线bus。
匹配的原理就是去遍历总线下的相应的链表来找到挂接在他下面的设备或者设备驱动。platform总线下设备与设备驱动的匹配原理就是通过名字进行匹配的先去匹配platform_driver中的id_table表中的各个名字与platform_device-name名字是否相同如果相同表示匹配成功直接返回否则直接匹配platform_driver-name与platform_driver-name是否相同相同则匹配成功否则失败。
相对于USB、PCI、I2C、SPI等物理总线来说platform总线是一种虚拟、抽象出来的总线实际中并不存在这样的总线。那为什么需要platform总线呢其实是Linux设备驱动模型为了保持设备驱动的统一性而虚拟出来的总线。因为对于usb设备、i2c设备、pci设备、spi设备等等他们与cpu的通信都是直接挂在相应的总线下面与我们的cpu进行数据交互的但是在我们的嵌入式系统当中并不是所有的设备都能够归属于这些常见的总线在嵌入式系统里面SoC系统中集成的独立的外设控制器、挂接在SoC内存空间的外设却不依附与此类总线。所以Linux驱动模型为了保持完整性将这些设备挂在一条虚拟的总线上platform总线而不至于使得有些设备挂在总线上另一些设备没有挂在总线上。
10linux中内核空间及用户空间的区别用户空间与内核通信方式有哪些?
答Linux 操作系统和驱动程序运行在内核空间应用程序运行在用户空间两者不能简单地使用指针传递数据因为Linux使用的虚拟内存机制用户空间的数据可能被换出当内核空间使用用户空间指针时对应的数据可能不在内存中。
通常32位Linux内核地址空间划分0~3G为用户空间3~4G为内核空间。注意这里是32位内核地址空间划分64位内核地址空间划分是不同的。
参考http://blog.chinaunix.net/uid-15007890-id-3415331.html
用户空间和内核通信方式
参考https://www.cnblogs.com/dchipnau/p/5043591.html
使用API
使用proc文件系统
使用sysfs文件系统kobject;
Netlink:netlink socket提供了一组类似于BSD风格的API用于用户态和内核态的IPC
文件当处于内核空间的时候直接操作文件将要传递的信息写入文件然后用户空间可以直接读取这个文件便可以得到想要的数据了
使用mmap系统调用可以将内核额空间的地址映射到用户空间
信号从内核空间向进程发送信号。
为什么不能直接进行互相访问
Linux 操作系统和驱动程序运行在内核空间应用程序运行在用户空间两者不能简单地使用指针传递数据因为Linux使用的虚拟内存机制用户空间的数据可能被换出当内核空间使用用户空间指针时对应的数据可能不在内存中。用户空间的内存映射采用段页式而内核空间有自己的规则 。
11linux中内存划分及如何使用虚拟地址及物理地址的概念及彼此之间的转化高端内存概念高端内存和物理地址、逻辑地址、线性地址的关系
答高端内存只和逻辑地址有关系和逻辑地址、物理地址没有直接关系。
虚拟地址CPU启动保护模式后程序运行在虚拟地址空间中。注意并不是所有的程序都是运行在虚拟地址中。CPU在启动的时候是运行在实模式的Bootloader以及内核在初始化页表之前并不使用虚拟地址而是直接使用物理地址的。
物理地址放在寻址总线上的地址。放在寻址总线上如果是读电路根据这个地址每位的值就将相应地址的物理内存中的数据放到数据总线中传输。如果是写电路根据这个地址每位的值就在相应地址的物理内存中放入数据总线上的内容。物理内存是以字节(8位)为单位编址的。
参考1https://baike.so.com/doc/889976-940779.html
参考2https://mp.weixin.qq.com/s?__bizMzI0ODU0NDI1Mg%3D%3Dchksm699e68fd5ee9e1eb43e94d5b17450e2441034429fafa26eccef28501311850a368914f6ff3f1idx1mid100001390sn289b7a64156043bc82b615aa382dd1e0
12linux中中断的实现机制tasklet与workqueue的区别及底层实现区别为什么要区分上半部和下半部
答底半部机制主要有tasklet、工作队列和软中断。
softirq和tasklet都属于软中断tasklet是softirq的特殊实现
workqueue是普通的工作队列。
什么情况下使用工作队列什么情况下使用tasklet。如果推后执行的任务需要睡眠那么就选择工作队列。如果推后执行的任务不需要睡眠那么就选择tasklet。另外如果需要用一个可以重新调度的实体来执行你的下半部处理也应该使用工作队列。它是唯一能在进程上下文运行的下半部实现的机制也只有它才可以睡眠。这意味着在需要获得大量的内存时、在需要获取信号量时在需要执行阻塞式的I/O操作时它都会非常有用。如果不需要用一个内核线程来推后执行工作那么就考虑使用tasklet。
tasklet基于softirq实现所以两者很相近。work queue与它们完全不同它靠内核线程实现。
与一般的软中断不同某一段tasklet代码在某个时刻只能在一个CPU上运行但不同的tasklet代码在同一时刻可以在多个CPU上并发地执行。
参考https://blog.csdn.net/cupidove/article/details/49927259
Linux将中断分为:顶半部(top half)和底半部(bottom half) 顶板部:完成尽可能少的比较紧急的功能它往往只是简单的读取寄存器中的中断状态并清除中断标志后就进行 “登记中断”(也就是将底半部处理程序挂在到设备的底半部执行队列中)的工作 特点响应速度快
底半部:中断处理的大部分工作都在底半部它几乎做了中断处理程序的所有事情。
特点处理相对来说不是非常紧急的事件
13linux中断的响应执行流程中断的申请及何时执行(何时执行中断处理函数)
答参考https://blog.csdn.net/pandy_gao/article/details/79309725
1中断初始化流程
2中断注册流程
3中断的处理流程。
参考https://blog.csdn.net/yimu13/article/details/6803957
14linux中的同步机制spinlock自旋锁与信号量的区别
答同步机制主要有自旋锁和信号量。详细答案在问题3.
15、linux中RCU原理
答RCU(Read-Copy Update)顾名思义就是读-拷贝修改它是基于其原理命名的。对于被RCU保护的共享数据结构读者不需要获得任何锁就可以访问它但写者在访问它时首先拷贝一个副本然后对副本进行修改最后使用一个回调callback机制在适当的时机把指向原来数据的指针重新指向新的被修改的数据。这个时机就是所有引用该数据的CPU都退出对共享数据的操作。
参考http://www.360doc.com/content/12/1125/10/11169997_250078652.shtml
16linux中软中断的实现原理
答中断服务程序往往都是在CPU关中断的条件下执行的以避免中断嵌套而使控制复杂化。但是CPU关中断的时间不能太长否则容易丢失中断信号。为此 Linux将中断服务程序一分为二各称作“Top Half”和“Bottom Half”。前者通常对时间要求较为严格必须在中断请求发生后立即或至少在一定的时间限制内完成。因此为了保证这种处理能原子地完成Top Half通常是在CPU关中断的条件下执行的。具体地说Top Half的范围包括从在IDT中登记的中断入口函数一直到驱动程序注册在中断服务队列中的ISR。而Bottom Half则是Top Half根据需要来调度执行的这些操作允许延迟到稍后执行它的时间要求并不严格因此它通常是在CPU开中断的条件下执行的。 但是 Linux的这种Bottom Half以下简称BH机制有两个缺点也即1在任意一时刻系统只能有一个CPU可以执行Bottom Half代码以防止两个或多个CPU同时来执行Bottom Half函数而相互干扰。因此BH代码的执行是严格“串行化”的。2BH函数不允许嵌套。 这两个缺点在单CPU系统中是无关紧要的但在SMP系统中却是非常致命的。因为BH机制的严格串行化执行显然没有充分利用SMP系统的多CPU特点。为此Linux2.4内核在BH机制的基础上进行了扩展这就是所谓的“软中断请求”softirq机制。
Linux 的softirq机制是与SMP紧密不可分的。为此整个softirq机制的设计与实现中自始自终都贯彻了一个思想“谁触发谁执行”Who marksWho runs也即触发软中断的那个CPU负责执行它所触发的软中断而且每个CPU都由它自己的软中断触发与控制机制。这个设计思想也使得softirq 机制充分利用了SMP系统的性能和特点。
参考https://blog.csdn.net/liangjingbo/article/details/2817939
17linux系统实现原子操作有哪些方法
答有3种吧
从理论上来说最简单的方法就是加锁在任何时间点上只有一个处理器被允许执行一个原子操作。这个处理器在做原子操作之前必须先获得锁并且在操作完成后释放它。这就是x86的LOCK前缀的作用大致如此这里我略去了细节。这里获得锁的操作意味着向总线发送一条消息说“好吧我要占用总线一会儿大家都退后”根据我们的目的这就意味着“请不要再做内存操作了”。然后发出请求的处理器要先等其他处理器完成它们正在进行的内存操作之后才会得到确认。只有等到其他所有处理器都确认了以后请求锁的处理器才能开始处理内存操作。最后一旦锁被释放它还需要发送一条信息给总线上的其他处理器“我的工作完成你们可以继续向总线发送请求了”。
18MIPS Cpu中空间地址是怎么划分的如在uboot中如何操作设备的特定的寄存器
答首先需要明确的是CPU物理地址空间不仅仅包括RAM物理内存的空间还包括CPU内部的一些总线、寄存器的编址。
一个MIPS CPU可以运行在两种优先级别上 用户态和核心态。MIPS CPU从核心态到用户态的变化并不是CPU工作不一样而是对于有些操作认为是非法的。在用户态任何一个程序地址的首位是1的话这个地址是非法的对 其存取将会导致异常处理。另外在用户态下一些特殊的指令将会导致CPU进入异常状态。
参考1http://blog.chinaunix.net/uid-20564848-id-74684.html
参考2http://www.360doc.com/content/12/0816/10/7775902_230452499.shtml
19,linux中系统调用过程如:应用程序中read()在linux中执行过程即从用户空间到内核空间
linux的系统调用过程 层次例如以下 用户程序------C库即APIINT 0x80 -----system_call-------系统调用服务例程--------内核程序 先说明一下我们常说的用户API事实上就是系统提供的C库。 系统调用是通过软中断指令 INT 0x80 实现的而这条INT 0x80指令就被封装在C库的函数中。
软中断和我们常说的硬中断不同之处在于软中断是由指令触发的而不是由硬件外设引起的。 INT 0x80 这条指令的运行会让系统跳转到一个预设的内核空间地址它指向系统调用处理程序。即system_call函数。
参考https://www.cnblogs.com/yfceshi/p/6885322.html
20,linux内核的启动过程(源代码级)
答1,head_armv.S启动;
2,start_kernel()函数
2.1,lock_kernel()进入内核态
2.2,setup_arch()初始化函数
2.2.1,setup_architecture,结构
2.2.2,内存设置代码
2.2.3,内核内存空间管理
2,2,4,内存结构初始化
2,2,5,paging_init创建内核页表。
参考https://www.linuxidc.com/Linux/2014-10/108034.htm
21,linux调度原理
答进程提供了两种优先级一种是普通的进程优先级第二个是实时优先级。前者适用SCHED_NORMAL调度策略后者可选SCHED_FIFO或SCHED_RR调度策略。任何时候实时进程的优先级都高于普通进程实时进程只会被更高级的实时进程抢占同级实时进程之间是按照FIFO一次机会做完或者RR多次轮转规则调度的。
参考https://yq.aliyun.com/articles/363020
22,linux网络子系统的认识
答参考https://blog.csdn.net/ylyuanlu/article/details/7707877
23,linux内核里面内存申请有哪几个函数各自的区别 Kmalloc() __get_free_page() mempool_create()
24,IRQ和FIQ有什么区别在CPU里面是是怎么做的
答快速中断请求(Fast Interrupt RequestFIQ)
中断控制器去中断ARM核心可以选择fiq和irq两种方式
irq发生时ARM处于irq模式。在irq模式期间不可以再次被irq中断打断也就是不能嵌套但是可以被fiq打断
fiq发生时ARM处于fiq模式在fiq模式期间不可以再次被fiq中断打断更不可能被irq模式打断。
在ARM11及以前版本中一个中断控制器中只有一个中断能被设为fiq ;
综上所述两个区别
fiq的优先更高一些跟irq相比)
fiq 的r8 r9 r10 r11 r12寄存器物理上是独立进入fiq保护现场时少保护这几个寄存器我拷这能节约多少时间
另外linux直接没有用到ARM的fiq.
25,中断的上半部分和下半部分的问题讲下分成上半部分和下半部分的原因为何要分讲下如何实现
答上半部分执行与硬件相关的处理要求快, 而有些驱动在中断处理程序中又需要完成大量工作,这构成矛盾,所以Linux有所谓的bottom half机制中断处理程序中所有不要求立即完成的,在开中断的环境下,由底半程序随后完成. Linux的底半处理实际上是建立在内核的软中断机制上的. Linux 的底半 机制主要有Tasklet 和 work queue 以及 softirq ( 2.4内核则有BH , Task queue , softirq , tasklet 没有work queue)其实底半可以理解成一种工作的延迟。所以实际使用时跟timer机制基本上一个意思。
26,内核函数mmap的实现原理机制
答mmap函数实现把一个文件映射到一个内存区域从而我们可以像读写内存一样读写文件他比单纯调用read/write也要快上许多。在某些时候我们可以把内存的内容拷贝到一个文件中实现内存备份当然也可以把文件的内容映射到内存来恢复某些服务。另外mmap实现共享内存也是其主要应用之一mmap系统调用使得进程之间通过映射同一个普通文件实现共享内存。
27,驱动里面为什么要有并发、互斥的控制如何实现讲个例子
答并发concurrency指的是多个执行单元同时、并行被执行而并发的执行单元对 共 享资源硬件资源和软件上的全局变量、静态变量等的访问则很容易导致竞态race conditions 。 解决竞态问题的途径是保证对共享资源的互斥访问 所谓互斥访问就是指一个执行单 元 在访问共享资源的时候其他的执行单元都被禁止访问。 访问共享资源的代码区域被称为临界区 临界区需要以某种互斥机 制加以保护 中断屏蔽 原子操作自旋锁和信号量都是 linux 设备驱动中可采用的互斥途径。
28,spinlock自旋锁是如何实现的
答自旋锁在同一时刻只能被最多一个内核任务持有所以一个时刻只有一个线程允许存在于临界区中。这点可以应用在多处理机器、或运行在单处理器上的抢占式内核中需要的锁定服务。 这里也介绍下信号量的概念因为它的用法和自旋锁有相似的地方。linux中的信号量是一种睡眠锁。如果有一个任务试图获得一个已被持有的信号量时信号量会将其推入等待队列然后让其睡眠。这时处理器获得自由去执行其它代码。当持有信号量的进程将信号量释放后在等待队列中的一个任务将被唤醒从而便可以获得这个信号量。
29,任务调度的机制
答linux进程的调度时机大致分为两种情况
一种是进程自愿调度
另一种是发生强制性调度。
首先自愿的调度随时都可以进行。在内核空间中进程可以通过schedule()启动一次调度在用户空间中可以通过系统调用pause()达到同样的目的。如果要为自愿的暂停行为加上时间限制在内核中使用schedule_time(),而在用户空间则使用nanosleep()系统调用。
参考http://www.360doc.com/content/14/1216/10/14855936_433298555.shtml
30,嵌入式linux和wince操作系统的特点和特性
答支持多种硬件平台wince差一点
占有较少的硬件资源wince对资源的要求更高
高可定制性wince做不到
具有实时处理能力
具备强大的网络功能wince没有
高安全性和高可靠性
具有完善的嵌入式GUI和嵌入式浏览器
实现嵌入式日志文件系统具备断电保护能力
能够提供完善的开发工具集
能够快速启动。
参考http://www.elecfans.com/emb/xitong/20111114244549.html
31,嵌入式linux中tty设备驱动的体系结构
答tty这个名称源于电传打字节的简称。在linux表示各种终端。终端通常都跟硬件相对应。比如对应于输入设备键盘鼠标。输出设备显示器的控制 终端和串口终端.也有对应于不存在设备的pty驱动。在如此众多的终端模型之中linux是怎么将它们统一建模的呢?这就是我们今天要讨论的问题。
Linux内核中tty的层次结构包含tty核心、tty线路规程和tty驱动
tty设备发送数据的流程为tty核心从一个用户获取将要发送给一个tty设备的数据tty核心将数据传递给tty线路规程驱动接着数据被传递到tty驱动tty驱动将数据转换为可以发送给硬件的格式。
接收数据的流程为 从tty硬件接收到的数据向上交给tty驱动进入tty线路规程驱动再进入 tty 核心在这里它被一个用户获取。尽管大多数时候tty核心和tty之间的数据传输会经历tty线路规程的转换但是tty驱动与tty核心之间也可以直接传输数据。
参考http://www.uml.org.cn/embeded/201209071.asp
32,嵌入式设备为加快启动速度可以做哪些方面的优化
答linux默认的安装内核相当庞大为了保证系统的兼容性和灵活性支持热插拔操作内核启动时要进行大量的硬件检测和初始化工作而嵌入式的硬件都是固定的只需要选择需要的硬件驱动就可以不需要全部的硬件驱动都检测因此可以进行适当的裁剪内核达到缩小启动linux系统的目的同时可以统计驱动模块的耗时时间对耗时较长的模块驱动加以分析优化。
33,USB设备的枚举过程 答(1) Get Device Descriptor。主机的第一个命令要求得到设备描述符此SETUP 包为8 个字节数据8006000100004000发向地址0端口0。“40”表示返回数据长度最大为40H 个字节。实际上只返回一个包即数组DEV_DESC[ ]中的前8 个字节用于说明设备的描述符的真实长度和设备的类型。 (2) Set Address。接着是设置设备地址处理事件主机发送一个含有指定地址的数据包0005020000000000在主机只有一个USB 设备的时候这个地址一般会是2最大地址127USB 协议中可以连接127 个设备。设置地址事件处理结束后设备进入地址状态主机以后会在新的指定地址处访问设备。 (3) Get Device Descriptor。主机再次发送请求得到设备描述符的数据包8006000100001200与上次不同的是要求的数据的长度是实际的数据长度同时是发送到Set Address命令所设置的地址。 (4) 读取全部Configuration Descriptor。接着主机要求得到设备全部的配置描述符、接口描述符和节点描述符8006000200004000由于主机不知道设备描述符的真实长度因此它要求得到64个字节。 (5) Set Interface主机发送数据包010B000000000000设置接口值为0。 (6) Set Conifguration确定USB设备工作在哪一个配置下。对于U盘设备来说一般只有1个配置值其值为01。主机发送数据包0009010000000000。 (7) 如果以上步骤都正确主机将找到新设备并且配置成功该设备可以正常使用可以进行后续的U盘枚举过程了。 (8) 用busHound观察计算机对于U盘的枚举过程发现上述步骤后还有一个GetMaxLun的操作但是实际上对于U盘来说忽略该步骤也没有问题。
34,PSRAM、SDRAM、DDR、DDR2的时序特性
答PSRAM全称Pseudo static random access memory。指的是伪静态随机存储器。
SDRAM:Synchronous Dynamic Random Access Memory同步动态随机存储器同步是指 Memory工作需要同步时钟内部的命令的发送与数据的传输都以它为基准;动态是指存储阵列需要不断的刷新来保证数据不丢失;随机是指数据不是线性依次存储而是自由指定地址进行数据读写。
DDRDouble Data Rate双倍速率同步动态随机存储器。DDR SDRAM是Double Data Rate SDRAM的缩写是双倍速率同步动态随机存储器的意思。
在同等核心频率下DDR2的实际工作频率是DDR的两倍。这得益于DDR2内存拥有两倍于标准DDR内存的4BIT预读取能力。换句话说虽然DDR2和DDR一样都采用DDR2内存的频率了在时钟的上升延和下降延同时进行数据传输的基本方式但DDR2拥有两倍于DDR的预读取系统命令数据的能力。也就是说在同样100MHz的工作频率下DDR的实际频率为200MHz而DDR2则可以达到400MHz。
35什么是GPIO
答general purpose input/output GPIO是相对于芯片本身而言的如某个管脚是芯片的GPIO脚则该脚可作为输入或输出高或低电平使用当然某个脚具有复用的功能即可做GPIO也可做其他用途。 也就是说你可以把这些引脚拿来用作任何一般用途的输入输出例如用一根引脚连到led的一极来控制它的亮灭也可以用一根一些引脚连到一个传感器上以获得该传感器的状态这给cpu提供了一个方便的控制周边设备的途经。如果没有足够多的gpio管脚在控制一些外围设备时就会力有不逮这时可采取的方案是使用CPLD来帮助管理。
36触摸屏的硬件原理 答触摸屏的主要三大种类是电阻技术触摸屏、 表面声波技术触摸屏、 电容技术触摸屏。 电阻触摸屏的主要部分是一块与显示器表面非常配合的电阻薄膜屏 这是一种多层的复合薄膜它以一层玻璃或硬塑料平板作为基层表面图有一层透明氧化金属 ITO氧化铟透明的导电电阻 导电层上面在盖有一层外表面硬化处理、光滑防擦的塑料层 、它的内表面也涂有一层ITO涂层 、在他们之间有许多细小的小于1/1000英寸的透明隔离点把两层导电层隔开绝缘 。当手指触摸屏幕时两层导电层在触摸点位置就有了接触控制器侦测到这一接触并计算出XY 的位置再根据模拟鼠标的方式运作。这就是电阻技术触摸屏的最基本的原理。
表面声波技术是利用声波在物体的表面进行传输当有物体触摸到表面时阻碍声波的传输换能器侦测到这个变化反映给计算机进而进行鼠标的模拟。
电容技术触摸屏利用人体的电流感应进行工作 。用户触摸屏幕时 由于人体电场用户和触摸屏表面形成以一个耦合电容 对于高频电流来说电容是直接导体于是手指从接触点吸走一个很小的电流。
37在Linux C中ls这个命令是怎么被执行的?
答使用fork创建一个进程或exec函数族覆盖原进程。
38在一个只有128M内存并且没有交换分区的机器上说说下面两个程序的运行结果?
答1#define MEMSIZE 1024*1024 int count 0; void *p NULL; 2while(1) { p (void *)malloc(MEMSIZE); if (!p) break; printf(Current allocation %d MB\n, count); } while(1) { p (void *)malloc(MEMSIZE); if (!p) break; memset(p, 1, MEMSIZE); printf(Current allocation %d MB\n, count); } 第一道程序分配内存但没有填充编译器可能会把内存分配优化掉程序死循环第二道程序分配内存并进行填充系统会一直分配内存直到内存不足退出循环。
39请定义一个宏比较两个数a、b的大小不能使用大于、小于、if语句
答搞的比较复杂。主要思想就是a-b的值的最高位是否为0但是又得考虑整数溢出的问题所以很复杂。不知道哪位大侠有更好的办法指点指点。 #includestdio.h #define ZHENG(i)((i 31) 0) #define FU(i)((i 31)! 0) #define COMPARE(a,b)((ZHENG(a) FU(b))||(((ZHENG(a) ZHENG(b))||(FU(a)FU(b)))((((a)-(b)) 31) 0))) void main() { int a 0x80000001; int b 0x6FFFFFFF; if(COMPARE(a,b)) { printf(“a b\n”); } else { printf(“a b\n”); } }
40LINUX下的Socket套接字和Windows下的WinSock有什么共同点请从C/C语言开发的角度描述至少说出两点共同点
答a)都基于TCP/IP协议都提供了面向连接的TCP SOCK和无连接的UDP SOCK。 b)都是一个sock结构体。 c)都是使用sock文件句柄进行访问。 d)都具有缓冲机制。
41请编写一个标准Shell脚本testd实现如下功能
A、在Linux操作系统启动的时候自动加载/mnt/test/test程序。 B、当test异常退出之后自动重新启动。 C、当test程序重启次数超过100次自动复位操作系统。 答假设你所拥有的资源 A、目标机器是一台具有标准shell的嵌入式计算机CPU为ARM7 56MB内存16MB软件环境基于Linux2.6.11和BusyBox1.2构建。 B、当前已有11个用户进程在运行占用了大部分的CPU时间和内存你可使用的内存只有2MB左右CPU时间由系统分派。 本题是考查LINUX和嵌入式编程功底的写出程序来的不少但是95%以上的人竟无视我假设的资源不知道在重启test程序的时候需要加上一个适当的掩饰时间以便资源紧张的操作系统有时间回收资源。85%的人不知道写完testd之后要在init里边加载这个脚本才能实现启动时自动加载的功能。 参考答案 ######################################## #testd is a daemon script to start an watch the program test ######################################## #!/bin/sh #load *.so that may need if [ -r /sbin/ldconfig ]; then ldconfig fi #add the libs PATH that may need export LD_LIBRARY_PATH“/lib” #count is the counter of test started times count0 #main loop while [ 1 ] ;do #add execute property for /mnt/test/test chmod x /mnt/test/test #start test /mnt/test/test #the running times counter let countcount1 echo “test running times is KaTeX parse error: Expected EOF, got # at position 12: countbr #̲Is test running…count” -gt 100 ]; then echo “Will reboot because of test running too many times” reboot fi #wait for test stoping…
sleep 3 done #########################################
42.你平常是怎么用C写嵌入式系统的死循环的?
答While(1);for(;;)
43写一条命令实现在dir以及其子目录下找出所有包含“hello world”字符串的文件 答grep -r hello world ./dir或者grep -rHn hello
44下面的两段程序中循环能否执行为什么 A: unsigned short i; unsigned short index 0; for(i 0; i index-1; i){ printf(“a\n”); } B: unsigned short i; unsigned long index 0; for(i 0; i index-1; i){ printf(“b\n”); }
45一个计划跑LINUX系统的ARM系统把bootloader烧录进去后上电后串口上没有任何输出硬件和软件各应该去检查什么 提示 1.跑LINUX的系统一般都需要外扩DRAM,一般的系统也经常有NOR或NAND FLASH
46列举最少3种你所知道的嵌入式的体系结构并请说明什么是ARM体系结构。
答ARM7/ARM9/ARM11
参考https://www.cnblogs.com/PengfeiSong/p/6295151.html
47请简述下面这段代码的功能
mov r12, #0x0
ldr r13, 0x30100000
mov r14, #4096
loop:
ldmia r12!, {r0-r11}
stmia r13!, {r0-r11}
cmp r12, r14
bl loop
答案借助r0~r11,将内存地址0x0开始的4KB数据拷贝到0x30100000
48嵌入式中常用的文件系统有哪些说出它们的主要特点和应用场合?
答只读文件系统 cramfs: 压缩的只读文件系统 特点: 启动快,文件最大支持256MB,单个文件最大16MB squashfs: 只读文件系统 特点: 压缩比最大,启动比cramfs慢 案例:路由器,ubuntu的发行光盘 可结合LZMA压缩算法 可读写的文件系统: JFFS2: 支持NOR 和NAND FLASH (对NAND的支持天生不足)
参考https://www.cnblogs.com/feige1314/p/7402144.html
49某外设寄存器rGpioBase的地址是0x56000000,寄存器的015位有效请写出给外设寄存器高八位(815位)设置成0xc3的代码
答#define rGpioBase (*((volatile unsigned int *)0x56000000)) rGpioBase ~0xff00; rGpioBase | 0xc300;
50如何编写一个LINUX驱动
答一.在系统的资源文件代码中定义platform_device,里面填写对应设备的外设IO起始地址地址长度中断DMA资源等信息资源信息并把资源信息添加到系统启动初始化流程里面
二. 通过module_init(xxx_init)和moule_exit(xxx_init)定义驱动入口和出口函数; 三.写出模块加载xxx_init()和退出的实际处理函数xxx_exit()这里以xxx_init()为例 在里面调用platform_driver_resigter()注册一个platform_driver结构体实现其中的probe()和remove()函数以及driver成员结构体中name和owner成员。
参考https://www.cnblogs.com/feige1314/p/7402144.html