2024年嵌入式面试试题(附答案)_第1页
2024年嵌入式面试试题(附答案)_第2页
2024年嵌入式面试试题(附答案)_第3页
2024年嵌入式面试试题(附答案)_第4页
2024年嵌入式面试试题(附答案)_第5页
已阅读5页,还剩11页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2024年嵌入式面试试题(附答案)1.请说明C语言中volatile关键字的作用,以及常见使用场景,它能否保证变量操作的原子性?答:volatile关键字的核心作用是告知编译器不对该变量进行读写优化,每次对该变量的读写操作都必须从其对应的内存地址中存取,不能将变量的值缓存在通用寄存器中做优化处理。常见使用场景包括三类:①硬件外设的状态寄存器/控制寄存器:这类寄存器的值会随硬件状态动态变化,每次读写都必须从实际内存地址获取,不能缓存;②中断服务程序中修改、主程序中会访问的全局变量:如果不加volatile,编译器会认为该变量不会被修改,优化后主程序只会读取一次寄存器缓存的值,无法感知中断中修改的变化;③多任务实时系统中,多个任务共享访问的全局变量:避免编译器优化导致任务无法感知其他任务对变量的修改。需要注意的是,C语言中的volatile无法保证变量操作的原子性,也不能阻止编译器的指令重排,仅能禁止读写缓存优化,若要保证原子性需要额外加互斥锁或利用CPU的原子操作指令实现。2.宏define与const修饰的常量有什么区别?答:二者核心区别如下:①处理阶段不同:define是预处理阶段完成文本替换,不对内容做编译处理;const是编译阶段处理,会参与编译检查;②类型检查不同:define没有类型信息,仅做纯文本替换,不会做类型检查,容易引发隐式类型错误;const有明确的类型,编译期会做类型检查,安全性更高;③存储方式不同:define本身不占用内存,仅在替换后将常量表达式嵌入代码段,不单独分配内存;const修饰的变量会分配内存,全局const常量存储在只读数据段,局部const存储在栈区;④作用域不同:define不受作用域限制,只要在预处理之后的代码都可以使用;const遵循普通变量的作用域规则,超出作用域后无法访问。3.什么是大端存储和小端存储?请写一段C语言代码判断当前系统的存储模式。答:大端存储模式指数据的高字节存放在内存的低地址,低字节存放在内存的高地址,符合人类的读写习惯,常用于网络协议、部分DSP处理器;小端存储模式指数据的低字节存放在内存的低地址,高字节存放在内存的高地址,x86、ARM默认都采用小端存储。常见判断代码可通过联合体实现,利用联合体成员共享起始地址的特性:```cintis_little_endian(){union{intnum;charbyte;}u;u.num=1;//若第一个字节(低地址)值为1,说明低字节存放在低地址,是小端returnu.byte==1;}```也可通过指针转换实现:```cintis_little_endian(){intnum=1;char*p=(char*)#return*p==1;}```返回值为1表示小端,0表示大端。4.请说明ARMv7架构处理器的7种运行模式,特权模式和异常模式分别指什么?答:ARMv7架构定义了7种运行模式,分别为:①用户模式(USR):正常运行应用程序的非特权模式,权限最低,无法直接访问硬件,不能主动切换模式,仅能通过异常进入其他模式;②快中断模式(FIQ):用于处理高速中断,如DMA数据传输,拥有独立的私有寄存器,上下文切换开销更低,优先级高于普通中断;③普通中断模式(IRQ):用于处理通用外部中断,是绝大多数外设中断的处理模式;④管理模式(SVC):系统复位后默认进入的特权模式,操作系统内核运行在该模式;⑤数据中止模式(ABT):处理非法内存访问异常,如缺页中断、地址越界访问;⑥未定义指令模式(UND):处理未定义指令异常,常用于软件模拟协处理器指令;⑦系统模式(SYS):运行操作系统特权任务,与用户模式共享同一块寄存器映射,权限为特权级,可访问所有系统资源。除用户模式外,其余6种均为特权模式,拥有更高的访问权限;除系统模式外,其余5种特权模式属于异常模式,对应不同异常触发后进入,用于处理异常事件。ARMv8AArch64架构替换为EL0~EL3四级异常等级,EL0为用户态、EL1为内核态、EL2为虚拟化、EL3为安全监控,本质是划分了更清晰的特权级,适配现代操作系统需求。5.什么是MMU?MMU的核心作用是什么?嵌入式Linux为什么需要MMU?答:MMU全称是内存管理单元,是CPU集成的硬件模块,负责完成虚拟地址到物理地址的映射转换。核心作用包括三点:①实现虚拟地址空间到物理地址空间的映射,支持内存虚拟化,允许程序使用远大于实际物理内存的地址空间,也可以将零散的物理内存映射为连续的虚拟地址,方便程序使用;②内存权限隔离与保护:每个进程拥有独立的虚拟地址空间,不同进程的地址空间互相隔离,一个进程的越界访问不会破坏内核或其他进程的数据,同时可以配置不同地址区域的访问权限,如标记栈区域不可执行,防止缓冲区溢出攻击;③配置内存区域的缓存属性,控制不同区域的缓存策略,适配不同硬件的需求。嵌入式Linux本身的内存管理机制是基于虚拟地址设计的,没有MMU无法实现进程地址空间隔离、动态内存管理、交换分区等功能,一个进程的非法访问很容易导致整个系统崩溃,因此主流嵌入式Linux都要求MMU支持,仅在资源极其受限的MCU场景使用无MMU的uClinux。6.实时操作系统(RTOS)和分时操作系统的核心区别是什么?答:二者设计目标不同,核心区别体现在对任务响应确定性的要求:①调度机制不同:RTOS普遍采用基于优先级的抢占式调度,只要有高优先级任务就绪,就可以立即抢占低优先级任务的CPU资源,保证高优先级任务的响应时间;分时操作系统普遍采用时间片轮转调度,任务轮流占用CPU时间片,优先级仅调整时间片分配占比,无法实现高优先级任务的立即抢占;②响应确定性不同:RTOS的任务最大响应时间是可预测、有明确上限的,满足硬实时系统的截止时间要求;分时系统的响应时间依赖于系统负载、任务数量,没有明确的响应上限,设计目标是提高系统整体吞吐量,而非单个任务的响应确定性;③应用场景不同:RTOS用于对确定性要求高的嵌入式场景,如汽车动力控制、工业伺服驱动、航空航天航电系统、物联网传感器节点等;分时操作系统用于通用计算场景,如桌面Windows、Linux桌面、服务器系统等。7.什么是优先级翻转?RTOS中常用的解决方法是什么?答:优先级翻转是指高优先级任务等待低优先级任务占用的互斥资源时,中等优先级任务抢占了低优先级任务的CPU,导致高优先级任务被中等优先级任务长期阻塞,优先级调度规则被打破,任务响应时间变得不可预测的问题。典型场景:任务A优先级最高,任务B优先级中等,任务C优先级最低,C先获取互斥锁,之后A就绪申请锁,因锁被C占用进入阻塞,随后B就绪,B优先级高于C,抢占CPU运行,导致A需要等待B运行完成后C才能继续运行释放锁,最终最高优先级A被中等优先级B阻塞,优先级发生翻转。常用的解决方法有两种:①优先级继承:当高优先级任务等待低优先级任务持有的互斥锁时,临时将低优先级任务的优先级提升到等待该锁的所有任务中的最高优先级,让持有锁的低优先级任务尽快运行释放锁,释放完成后再恢复原优先级,该方法不会过度提升优先级,性能更好,是当前主流RTOS的默认方案;②优先级天花板:为每个互斥锁预先设置优先级天花板,即所有可能申请该锁的任务中的最高优先级,任何任务持有该锁后,都将优先级提升到天花板优先级,保证持有锁期间不会被其他任务抢占,该方法实现简单,但会存在不必要的优先级提升,开销比优先级继承大。当前FreeRTOS、RT-Thread、UCOS-II/III都支持优先级继承解决优先级翻转问题。8.Linux中字符设备、块设备、网络设备驱动的核心区别是什么?答:Linux按照设备访问方式将驱动分为三类,核心区别如下:①字符设备:按字节流顺序访问的设备,不需要IO块缓存,驱动实现open、close、read、write等标准文件操作接口,应用层可通过/dev下的设备文件像访问普通文件一样访问字符设备,绝大多数流式设备都是字符设备,如串口、GPIO、按键、ADC、I2C传感器等;②块设备:按固定大小块(通常512B/4KB)随机访问的存储设备,支持块地址寻址,内核会为块设备维护IO请求队列,对请求进行排序合并优化,提高访问效率,块设备可以挂载文件系统,常见如EMMC、SD卡、NANDFlash、U盘等;③网络设备:按数据包收发的网络设备,Linux对网络设备做了单独抽象,没有对应的/dev设备文件,应用层通过socket套接字接口访问,驱动仅负责将上层协议栈的数据包发送出去,将接收到的数据包交给协议栈处理,不需要实现read/write操作,常见如以太网控制器、WiFi模块等。9.请说明Linux中断处理中顶半部和底半部的划分逻辑,为什么要划分,常见的底半部实现方式有哪些?答:中断处理要求尽可能快的完成,长时间关中断会导致丢失其他中断,降低系统实时性,因此Linux将中断处理分为两部分:顶半部(上半部)是必须立即执行、耗时极短的部分,在关中断状态下执行,核心工作是清除中断标志、读取中断状态、登记底半部处理任务,不做复杂的耗时处理;底半部是可以延后处理、相对耗时的部分,在开中断状态下执行,完成具体的业务处理。划分顶半部和底半部的核心目的是解决中断响应速度和处理时间的矛盾,保证系统能尽快响应新的中断,提高系统的并发能力和实时性。当前常见的底半部实现方式有三种:①软中断:预先静态注册的软中断处理,在中断返回后或ksoftirqd内核线程中执行,属于软中断上下文,不能睡眠,性能最高,适合对吞吐量要求极高的场景,如网络驱动的数据包收发处理;②tasklet:基于软中断实现的底半部机制,同一个tasklet保证只会在一个CPU上串行执行,不会并发,使用简单,驱动开发常用,同样属于软中断上下文,不能睡眠;③工作队列:将处理任务交给内核线程执行,属于进程上下文,可以睡眠、阻塞,适合耗时较长、需要阻塞操作的场景,如按键消抖后上报输入事件、大容量数据的后处理等。10.I2C总线和SPI总线的核心区别是什么,各自的应用场景是什么?答:二者都是常用的嵌入式串行同步通信总线,核心区别:①线数与寻址:I2C仅需要SDA(串行数据)、SCL(串行时钟)两根线,总线上挂载多个从设备依靠设备地址寻址,不需要额外片选线;SPI一般需要SCLK(时钟)、MOSI(主出从入)、MISO(主入从出)、CS(片选)四根线,主设备通过拉低对应从设备的CS片选选中通信设备,至少需要一根片选线;②传输速度:SPI的时钟速度更高,通常可以达到几十MHz,远高于I2C,I2C标准模式仅100kHz,快速模式400kHz,高速模式也仅3.4MHz,超高速模式应用极少;③拓扑与功能:I2C支持多主多从架构,自带应答机制和总线仲裁,多主设备冲突时可以正确仲裁不破坏数据;SPI一般为单主多从架构,没有自带应答和仲裁机制,需要上层协议自行处理;④应用场景:I2C适合低速、多设备、短距离的场景,如连接EEPROM、传感器、RTC时钟等,优势是布线少,节省IO;SPI适合高速、高带宽的短距离场景,如连接SPIFlash、OLED显示屏、高速ADC等,优势是速度快,实现简单。11.NORFlash和NANDFlash的核心区别是什么,各自应用场景是什么?答:二者是主流的非易失性Flash存储器,核心区别:①寻址方式:NORFlash支持随机字节访问,每个字节有独立的地址线,代码可以直接在NORFlash上运行,不需要加载到RAM;NANDFlash按页、按块寻址,不支持随机字节访问,代码必须加载到RAM中才能运行;②容量与成本:NORFlash容量普遍较小,通常从几KB到几十MB,单位容量成本远高于NAND;NANDFlash容量大,从几百MB到上百GB都有,单位容量成本低,适合大容量存储;③读写性能:NORFlash读速度远快于NAND,写速度和擦除速度远慢于NAND;NAND的擦除块更小,擦除和写速度比NOR快很多;④可靠性:NORFlash位反转概率低,坏块少,一般不需要ECC纠错,可靠性更高;NANDFlash容易出现位反转和坏块,需要ECC纠错和坏块管理。应用场景:NORFlash通常用于存储bootloader、启动代码,MCU的内置Flash大多是NOR型;NANDFlash用于存储大容量固件、文件系统、用户数据,现在的EMMC、SD卡、U盘都基于NANDFlash制作。12.请说明C语言中数组和指针的核心区别?答:数组和指针是完全不同的概念,核心区别:①本质:数组是一块连续的内存空间,存储多个同类型元素,数组名是这块内存的首地址,是地址常量,不能修改;指针是一个变量,存储的是另一个内存地址,本身占用独立的内存空间,值可以修改,可以指向任意地址;②sizeof结果:sizeof(数组名)得到的是整个数组占用的总字节数;sizeof(指针)得到的是指针变量本身的大小,32位系统为4字节,64位系统为8字节,和指针指向的内容无关;③赋值操作:数组名是常量,不能作为左值赋值,例如`inta[5],b[5];a=b;`是非法操作;指针是变量,可以自由赋值,`int*a,*b;a=b;`是合法操作;④退化规则:当数组作为函数参数传递时,会退化为指向数组首元素的指针,丢失数组长度信息,因此函数参数中的数组sizeof结果和指针一致。13.嵌入式C中栈和堆的核心区别是什么,开发中需要注意什么?答:栈和堆是程序内存中两个不同的区域,核心区别:①分配释放:栈由编译器自动分配释放,存放函数参数、局部变量、返回地址、任务上下文等,函数调用时自动分配,函数返回

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论