嵌入式面经 驱动篇

1.1 Linux驱动程序的功能是什么?

(1)对设备初始化和释放。

(2)进行内核与硬件的数据交互。

(3)检测和处理设备出现的错误。

1.2内核程序中申请内存使用什么函数?

答案:kmalloc()、kzalloc()、vmalloc()。

解读:

(1)void *kmalloc(size_t size, gfp_t flags);

①申请连续的物理内存,这对于要进行DMA的设备十分重要,但大小不能超过128KB,其中有16B是被页描述符占用了。

②较常用的flag有GFP_ATOMIC(分配内存的过程是一个原子过程)、GFP_KERNEL(正常分配内存)、GFP_DMA(给DMA控制器分配内存)。

③对应的内存释放函数为void kfree(const void *objp)。

(2)void *kzalloc(size_t size, gfp_t flags);

①kzalloc()相对kmalloc()只是额外增加了__GFP_ZERO标志,除了申请内存外,还会对申请到的内存内容清零。

②对应的释放函数也是kfree()。

(3)void *vmalloc(unsigned long size);

①申请虚拟地址连续的内存空间,但其对应的物理内存不一定连续,因此对申请的内存大小没有限制。

②对应的内存释放函数为void free(const void *addr)。

③注意:vmalloc()和vfree()可以睡眠,因此不能在中断上下文调用。

1.3内核程序中申请内存和应用程序时申请内存有什么区别?

答案:内核中申请内存空间用的是函数kmalloc、kzalloc、vmalloc,应用程序申请内存用的函数是malloc。

解读:

(1)kmalloc/kzalloc直接分配连续的物理地址(虚拟地址也是连续的)。

(2)vmalloc分配连续的虚拟地址,但物理地址不一定连续。分配时实际分配了物理内存,不过这个物理内存页面是在公共的页表进行了映射,并没有在本进程的页表进行映射,当访问这段内存时,触发do_page_fault异常(缺页中断)才完成页表的同步工作。

(4)malloc是用户空间申请内存的方法,分配连续的虚拟地址,物理地址一般不会连续。在分配时并没有做实际物理页的分配动作,实际分配物理页的动作是在do_page_fault异常(缺页中断)处理中完成的。

1.4自旋锁和信号量在互斥使用时需要注意什么?在中断服务程序里面的互斥是使用自旋锁还是信号量?

(1)使用自旋锁的进程不会睡眠, 而使用信号量的进程会睡眠。

(2)中断服务程序使用的是自旋锁,原因是中断服务程序处于中断上下文,中断上下文是不参与调度的,也就没有保护现场与恢复现场,一旦睡眠就回不来了。

 

以上内容摘自专刊《嵌入式岗位笔试面试真题讲解》,该专刊不仅有真题讲解,还有经验分享,不清楚嵌入式该学什么的同学,想找嵌入式实习/正式工作的同学,都可以来看看:              https://blog.nowcoder.net/zhuanlan/v0ELPM嵌入式公司推荐:华为、小米、OPPO、VIVO、荣耀、一加、CVTE、大疆、insta360影石、美的 、TCL、海信、创维、烽火、比亚迪、吉利、长安、大众、经纬恒润 、小鹏、图森未来、百度、滴滴、蔚来、理想、 联发科、 紫光展锐 、全志、寒武纪 、晶晨半导体 、汇顶、华为、中兴、浪潮 、TP-LINK、讯飞、商汤、海康威视 、浙江大华、360、小马智行、元戎启行、深信服、移动、联通、电信、旷视、四维图新、中芯国际、复旦微电子、极氪。

#秋招面经##驱动开发##嵌入式软件##嵌入式面经##嵌入式#
全部评论

相关推荐

今天更新如何写嵌入式软件开发简历中的专业技能部分,笔者建议分点写。首先,专业技能的核心是清晰分类与精准描述。 别把所有技术名词堆在一起。建议按技术栈的自然逻辑分块,比如:处理器架构/平台、编程语言与标准、操作系统/实时内核、外设接口与协议、开发调试工具、软硬件协同、开发方法与流程。这样面试官扫一眼就能定位到关注点。每类里,把你真正掌握的核心技术放前面,不熟的放后面或者干脆不写。投递不同方向的岗位,要调整顺序突出重点,比如投汽车电子,CAN、 AutoSAR这些就得靠前。其次,避免笼统,追求细节深度。这是最容易出问题的地方。不要只写“熟悉STM32"、“了解FreeRTOS"。面试官想知道你具体会什么、用到什么程度。好的写法是拆解技术点并体现应用能力。例如,“熟练掌握STM32F4系列MCU开发(HAL/LL库),具备GPIO、ADC、TIM (PWM/输入捕获)、USART、SPI、12C、 DMA等外设驱动开发与调试经验"。再比如RTOS,写成“精通FreeRTOS任务调度、优先级管理、任务间通信(队列、信号量、事件组)、 内存管理及Tickless低功耗模式应用”。量化成果更好,如“优化中断处理程序,降低关键任务延迟20%”。第三,关注软技能与底层能力。嵌入式开发不仅是写代码。体现你解决复杂问题的底层能力很重要。比如:“深入理解C语言内存管理(堆栈、 静态区)、指针操作及常见陷阱规避”、“具备扎实的硬件基础,能阅读原理图、数据手册,使用示波器、逻辑分析仪进行硬件协同调试”、“熟练使用GCC交叉编译工具链,掌握Makefile/CMake项目构建”、“具备Bootloader 开发、固件升级(IAP)经验”。这些点能显著拉开差距,证明你能独立搞定问题。最后,诚实是底线,用词需谨慎。“精通”慎用, 除非你真是领域专家,能应对最刁钻的问题。“熟练掌握”、“具备.经验”、“熟悉…原理与应用”更稳妥。每一条写上去的技能点,都要做好被深挖细节的准备。别为了堆砌关键词写自己没碰过的工具或协议,面试官几个问题就能问出来。硬件相关的技能,如基本的电路调试、焊接、看时序图,如果是纯软件岗可简略带过或不写,但如果是偏底层的驱动或系统开发,这就是重要加分项。记住,简历上的专业技能不是广告词,而是你技术能力的精准快照。写实、写深、写透,让面试官看到你解决问题的实际能力,远胜过华丽的辞藻和空洞的罗列。面试的本质是验证简历的真实性,确保你写下的每一条,都是你真正走过的路和焊过的板子调过的时序。最后,如果有需要《STM32➕RTOS项目》、《嵌入式八股文合集》及《Freertos开发手册》等资料,也可以私信笔者获取。
简历中的项目经历要怎么写
点赞 评论 收藏
分享
别挂我了求你了:是那个在线测评还是笔试啊,我之前做了一次全是行测的测评,现在又给我发了个笔试链接
投递大疆等公司8个岗位
点赞 评论 收藏
分享
评论
1
5
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务