嵌入式秋招总结第六弹之八股提升

拖更太久了,主要是从4月份开始工作到陆陆续续开始上手工作,全身心投入工作中了,最近闲下来又可以写一写文章,并且以我工作和学习的经历希望让大家增强对Linux驱动的理解。特别是我后台经常会有同学私聊我,问我一些Linux线路呀或者学完xv6应该学什么呀,我要走Linux驱动方向需不需要看Linux网络编程呀等等问题,我们今天一一解答。

1. 学完xv6之后,我想走嵌入式Linux方向还需要怎么提升呢?
针对这个问题,我想说嵌入式Linux需要哪些技术点。首先针对驱动,驱动其实分为很多方向,简单的有iic驱动,spi驱动,复杂的有camera驱动,显示屏驱动,音频驱动,nvme驱动还有最近流行的npu驱动,GPU驱动等等。这些驱动的共性都是要掌握设备树,sysfs文件系统,虚拟内存管理,设备总线驱动框架等等。
不同的驱动还要细化,比如你想走camera,可能你要对v4l2,mipi协议这些要进一步了解,如果你想走ai芯片驱动,那最好对smmu,dma-buf,异步队列排序,多线程优化,drm框架,ping-pong存储,高性能计算有一定了解。如果是非驱动岗位,偏向CPU启动安全等方向,可能还需要掌握ARM的架构,包括最新的v8,v9架构等等。所以针对你掌握的不同驱动,你需要加强不同方向的知识。

2. Linux驱动学完后期应该学什么,我看完韦东山驱动大全还需要看Linux系统编程,Linux网络编程吗。
首先,驱动跟应用是不分家的,在真实操作驱动的过程中,会时刻跟应用打交道,但此刻的应用还是停留在Linux内核层面的应用。实际工作中的应用方向则会偏向安卓,比如一些中间件的实现,安卓api的调用等等,常见于手机厂系统开发岗位。
而Linux系统编程更多强调于我们上层怎么用malloc,mmap分配内存,如何多进程多线程跑多个服务,怎么多线程和访问同一个变量,如何写出免锁队列。因为只要复杂的一些驱动,你可能就不单是负责最基础的driver那一层了,跟寄存器打交道的是bsp方向,驱动方向考虑更多的还是底层代码的高效性,稳定性等等。比如nvme驱动,如何对具有优先级的bio进行快速响应,并分配给SSD,可能就需要哈希存储或者平衡二叉树来做优化。包括我们说的npu驱动,如何提升cpu与npu的通信,CPU的算子如何快速部署到npu上,并最短时间把结果反馈给CPU,大量算子不同优先级如何分配线程运行,还要兼顾低功耗来进行休眠等等,其实都离不开我们Linux系统编程的很多知识。而针对Linux网络编程,这个要不要掌握真就因人而异了,这个最初是走c++的一帮人,因为要搞个webserver项目走互联网,所以在那之前会先学Linux网络编程,对于嵌入式Linux方向,大部分方向是不用去深入掌握的,除非你去路由器公司做网络驱动,那就另当别论了。

3. 方向这么多,我应该选择什么方向作为我的主攻方向呢。
不管你做了xv6,还是看了驱动大全,你可能都会疑惑自己会什么,只能脑子有点驱动概念有点操作系统概念,但是没有深入理解某个方向,有点浅尝辄止。所以我的建议是至少得熟悉某个子方向,你可以是熟悉camera驱动,调一调摄像头,改一改底层代码提升帧率。也可以走ai嵌入式方向,部署一下YOLOv5,然后拉通CPU到npu的函数跳转。不管走什么方向,不能只停留在上层调api,要深入到底层代码逻辑,这才能在秋招中脱颖而出。
而且真正工作上,驱动与驱动,驱动与应用是不分家的。最简单的一个例子,我们想要获得高帧率的图像显示,中间经历的驱动包括了camera获取图像,npu或GPU对每帧图像实现图像锐化等ai算法,显示屏驱动稳定显示。但凡某个驱动出了叉子,在显示屏驱动那一块就会出现显示卡顿的情况或者丢帧。所以常常就是你不能只对你的方向有所理解,其他方向也要有所建树。
最后同样的,如果想继续看后续请点击关注,最后你的鲜花和点赞将是我更新的极大动力。
#通信/硬件秋招总结# #牛客创作赏金赛# #牛客AI配图神器#
全部评论
向学长看齐
点赞 回复 分享
发布于 08-04 20:01 四川
感谢佬的指导
点赞 回复 分享
发布于 08-03 14:52 四川

相关推荐

最近刚结束暑期实习,现在回忆起来,之前找实习的经历还是蛮痛苦的...现在分享一下之前的实习面经吧,赞一波人品,大家秋招加油!## 高通实习 4.101.STM32智能手表项目你觉得做的最出彩的地方是什么2.STM32智能手表项目遇到了什么困难3.多个任务间如何进行数据交互4.任务优先级怎么安排5.C语言如何实现“封装“?让结构体外部看不到某些成员的具体类型(不透明指针)6.按键是不是用了中断?它如何更新显示的页面的7.LVGL是什么东西8.低功耗是怎么设计的9.用堆栈来切换页面/低功耗策略的设计是自己想的还是看博客10.FreeRTOS里的线程和进程有什么区别11.如何对全局变量这种存储进行优化12.如果要显示历史数据,该用什么方法传数据13.U-Boot启动流程14.启动介质用过哪些?如何直接从SRAM启动15.概述一下项目里那几个字符设备驱动的开发流程16.了不了解块设备、网络设备17.了解MMU吗?MMU的工作原理18.MMU除了内存映射,还有什么功能- 当时回答的是PTE的权限检查,面试官好像想让我答和cache相关的东西...19.了解Cache吗?知道它的大概作用还是在使用的时候遇到过什么问题看看博客把,cache应该和os无关,属于体系结构的知识了[计算机体系架构——一文读懂Cache(一) - 知乎](https://zhuanlan.zhihu.com/p/386919471)[Cache与MMU的爱恨纠缠_有cache一定要有mmu吗-CSDN博客](https://blog.csdn.net/setul/article/details/128243607)20.DMA与Cache一致性的问题是怎么发生的,怎么解决21.从high level的角度,不是从code角度。你觉得cache的不一致最直观该怎么解决(比如DMA造成的缓存一致性问题),Linux内核是怎么解决- 提供一些API,对于invalid cache情况做操作22.知道C语言里Cache有什么操作吗?比如刷cache,知道含义吗- 完全不了解23.用ARM板的时候有去了解ARM体系结构吗,知不知道CPU的特权等级、相关寄存器- 不太了解,后面强行借RISC-V回答了一波...24.CPU什么时候会切换特权等级,切换时的具体流程25.OS内核态下CPU是什么特权等级26.page fault的处理流程,什么时候会分配物理页27.从CPU的角度,函数调用时是如何传参的总结:1.感觉STM32手表项目虽然是本科做的,而且我投的是Linux驱动开发,但是面试还是可能会被问到,当时做的时候很多细节都忘了,而且代码设计的也不好,比如用全局变量来在多个任务间共享数据,还被面试官说了。2.简历上的项目一定得完全掌握透彻,就算都是自己写的代码,时间长了也可能忘,还是得再好好复习下3.感觉体系结构这块还是有很多需要学的,比如cache相关的,当时有点被问懵了4.感觉自己的简历可能和底软还是不是很match,简历上4个项目,2个都是Linux应用开发的,这次面试都没被问,后面还是需要再做个什么项目5.面试官问“你懂xxx吗”的时候,不要只回答个“懂一点”就结束了,可以直接开始解释,不需要等他继续问## 海康BSP实习 4.291.是保研吗?学校的保研是看成绩还是比赛,排第几名2.老家在哪,未来期望工作地点3.本科做的都是MCU吗?这些竞赛挑一个介绍一下4.刚才提到你是离线规划的路径,运行中如果小车超出了离线规划的路径,该如何返回5.在做电机开发的时候可能会关注电机的哪些参数6.在开发电机的时候,会不会实现让电机旋转来让小车精确前进1m这样的功能7.比赛是几个人参加的?本科其他的比赛都是MCU开发吗?8.讲一下研究生阶段Linux主要做了哪些开发9.讲一下uboot、内核的移植也裁剪是怎么做的- 忘完了,这部分完全自己给自己**埋坑**啊woc10.字符设备驱动开发的关键函数11.实习能实习多久12.研究生课题做的怎么样13.未来想做算法还是上层应用还是驱动还是硬件,为什么反问:1.如果能来实习,会做哪些业务?- 安卓的BSP,和Linux驱动差不多- 业务方面,主要是类似希沃教育屏之类的产品,相机是小部分2.面试结果多久通知3.实习生会有培养方案吗?- 会有导师带,根据实际情况决定干什么
点赞 评论 收藏
分享
评论
11
9
分享

创作者周榜

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