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

付费下载

下载本文档

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

文档简介

20道嵌入式经典面试题(附答案)一、单项选择题(每题4分,共40分)1.在嵌入式C语言中,volatile关键字的主要作用是?A.防止变量被意外修改B.提示编译器该变量可能被意外修改,禁止过度优化C.声明只读变量D.将变量存储在寄存器中2.下列哪个不是嵌入式系统中常见的硬件通信接口?A.UARTB.I2CC.SPID.HTTPS3.在32位系统中,sizeof(char*)的值是?A.1B.2C.4D.84.下列哪种内存分配方式是在栈上进行的?A.malloc(100)B.newint[100]C.在函数内定义局部数组charbuf[100];D.定义全局数组charbuf[100];5.关于中断服务函数,下列做法正确的是?A.在ISR中调用printf刷新界面B.在ISR中执行长延时等待C.在ISR中只做必要处理、设置标志位并尽快退出D.在ISR中调用可能阻塞的信号量获取操作6.以下哪种方式可以用于判断系统的大小端模式?A.使用sizeof(int)判断B.使用union结合字节访问C.查看栈的生长方向D.读取程序计数器值7.已有定义inta=10;intb=20;constint*p=&a;constint*q=&b;下列说法正确的是?A.p=q非法,*p=30合法B.p=q合法,*p=30非法C.两者都合法D.两者都非法8.下面哪个关键字用于定义具有内部链接的全局变量?A.externB.staticC.registerD.inline9.在RTOS中,优先级最高的就绪任务通常通过哪种方式获得CPU?A.先到先服务B.短作业优先C.基于优先级抢占式调度D.时间片轮转10.下列哪种操作最容易引起栈溢出?A.在函数内定义超大局部数组B.频繁调用freeC.使用static局部变量D.在堆上申请大内存二、判断题(每题3分,共15分)1.malloc分配的内存是在堆上,使用完成后必须调用free释放。2.在中断服务函数中可以安全调用printf输出调试信息。3.一个int类型变量在8位、16位、32位单片机上的长度一定相同。4.sizeof是C语言中的一个函数,用于在运行时计算变量大小。5.volatile变量保证了多线程环境下的原子性。三、简答题(每题9分,共45分)1.简述static关键字在C语言中的三种作用。2.什么是内存对齐?为什么嵌入式系统中需要关注结构体对齐?3.简述进程与线程的区别。4.分析下面代码,指出其中可能存在的问题。char*p=(char*)malloc(10);

if(p==NULL)return;

memset(p,0,10);

strcpy(p,"helloworld");

printf("%s\n",p);

free(p);答案:strcpy(p,"helloworld")写入的字符串长度为11个字符,加上结尾空字符'\0'共12字节,超过分配的空间10字节,造成堆缓冲区溢出。应分配足够空间,例如malloc(12),或使用strncpy并显式指定长度,同时确保以'\0'结尾。解析:字符串常量的长度计算不能漏掉最后的'\0'。堆溢出可能破坏堆管理结构,导致后续程序崩溃或产生安全漏洞。5.在嵌入式系统中,如何可靠地检测和避免栈溢出?参考答案与解析一、单项选择题1.答案:B解析:volatile提示编译器该变量可能被中断、硬件或其他线程修改,要求每次从内存读取,禁止缓存该变量的值。const才是声明只读变量,register建议存入寄存器。2.答案:D解析:UART、I2C、SPI是常见的板级硬件通信接口;HTTPS是应用层协议,基于TCP/IP协议栈,不属于硬件接口。3.答案:C解析:32位系统的地址总线宽度通常为32位,指针变量占用4字节;64位系统指针通常为8字节。4.答案:C解析:函数内的局部数组分配在栈上;malloc和new分配在堆上;全局数组存储在静态存储区。5.答案:C解析:中断服务函数应尽量短小,不能调用可能阻塞或不可重入的函数,如printf、延时函数或阻塞式信号量获取操作。6.答案:B解析:利用union的共享内存特性,对int赋值0x01020304,再读取低地址字节即可判断大小端。栈生长方向与大小端无直接关系。7.答案:B解析:constint*p表示指针指向的内容不可修改,但指针本身可以改变,因此p=q合法,*p=30非法。若写成int*constp,则指针本身不可修改。8.答案:B解析:static修饰全局变量时,将其作用域限制在本文件内,具有内部链接;extern用于声明外部链接变量,register建议存入寄存器,inline修饰内联函数。9.答案:C解析:RTOS常用基于优先级的抢占式调度,当高优先级任务就绪时,会立即抢占正在运行的低优先级任务。10.答案:A解析:局部数组分配在栈上,过大的局部数组会迅速耗尽栈空间导致栈溢出。堆上申请大内存可能导致内存不足,但不会直接引起栈溢出;static局部变量存储在静态区。二、判断题1.答案:正确解析:堆内存由程序员手动管理,不释放会导致内存泄漏。2.答案:错误解析:printf通常不可重入且可能阻塞,在ISR中调用容易引起系统异常或死锁。3.答案:错误解析:int的长度由编译器和平台决定,8位单片机的int可能是16位,32位平台通常为32位,并不一定相同。4.答案:错误解析:sizeof是操作符,绝大多数情况下在编译期即可确定结果,不是在运行时计算的函数。5.答案:错误解析:volatile仅保证变量的可见性,不保证原子性和顺序性,多线程并发访问仍需使用互斥锁或原子操作。三、简答题1.答案:(1)修饰局部变量,使其存储在静态存储区,生命周期延长到整个程序运行期,但作用域不变,且只初始化一次;(2)修饰全局变量,使其作用域限制在本文件内,具有内部链接;(3)修饰函数,使该函数仅在本文件内可见。解析:static修饰不同对象时作用不同,主要涉及存储期、作用域和链接属性。面试中常考对内部链接和静态存储期的理解。2.答案:内存对齐是指数据在内存中的地址必须是其对齐值的整数倍,例如4字节变量通常要求地址为4的整数倍。嵌入式系统中关注对齐的原因包括:提高CPU访问效率;避免某些平台因未对齐访问触发硬件异常;跨平台传输数据时结构体大小可能不同,需要正确计算结构体占用的内存;合理规划成员顺序可以减少填充字节,节省有限内存。解析:不同架构对齐规则不同,未对齐访问可能导致总线错误或额外开销。结构体成员顺序不同可能影响整体大小,这在通信协议解析和存储设计中很重要。3.答案:进程是资源分配的基本单位,拥有独立的地址空间和系统资源;线程是CPU调度的基本单位,同一进程内的线程共享进程的地址空间和资源。进程间切换开销较大,因为需要切换地址空间;线程间切换开销较小。进程间通信需要IPC机制,如管道、消息队列、共享内存等;线程间可直接通过共享内存通信,但需要同步机制防止竞争。解析:嵌入式RTOS中的任务更接近线程概念,理解进程与线程的区别有助于分析系统资源隔离和任务调度问题。5.答案:检测方法包括:在栈空间底部填充已知字节模式,定期检查这些字节是否被覆盖;使

温馨提示

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

评论

0/150

提交评论