我是专接本学生,家在唐山小县城,想在北京招一份嵌入式开发工作,做linux驱动开发相关的工作,找了一个月,发觉找不到工作,自己知道学历这一块有很大问题,今年大四,和我水平差不多的人(专接本考试分数相近)已经考上了研究生(双非一本),所以,我是去那种很小的公司先工作,还是去考研啊?亦或者是先找一份单片机的工作后期再去找linux驱动的工作呢?另外这个行业还有发展吗?

介绍一下我的情况
我对电子这些比较感兴趣,用过51、stm32、stc8h、stm8做过很多东西,也打样过10多款pcb了,在学校学过vhdl,专科参加比赛拿了很多奖,比赛时学习了opencv、yolo、java、Android,寒暑假也在做东西或者学习,去年用正点原子的开发板学了uboot、linux内核移植、根文件系统构建、驱动开发(这一块学的很一般),做过ros机器人,毕设也是ros机器人,还用qt做了上位机。

考研的话,去年准备了一半,因为多种原因后续没有继续考,算是低谷期吧。考的话,关系不错的老师说能帮忙介绍导师(给了几所学校,有能够的着的)。

目前一直在投linux驱动开发的职位,没有投单片机的岗位,boss上很多都是已读不回的,即便投了简历也石沉大海。

寻求各位前辈的建议,万分感谢!

原回答链接:linux驱动开发找不到工作寻求前辈建议? - 硬核王同学的回答 - 知乎
https://www.zhihu.com/question/586897404/answer/48763533602

谢邀,我也是专升本,还他妈是培训出来的嵌入式工程师。和题主这么丰富的经历一比我就不值一提了。

比较幸运的一点是,我找到了Linux驱动的岗位,但我也是那个大佬口中,随便改改驱动的那个人。目前就职于某汽车电子公司,担任嵌入式Linux驱动开发工程师。

现在市面上的Linux驱动主要分两种。

一种是方案公司:买别人的芯片,做方案,也就是做产品。基本上都是写小公司,但也不乏一步一步成长为独角兽甚至上市的公司。大部分搞驱动就是移植一下,对驱动修修改改适配公司产品的特殊要求。

另一种是芯片原厂:顾名思义,芯片是自家的,自己设计芯片,然后把芯片卖给别人。在芯片原厂才是正经开发驱动,很多都是从新建一个.c文件开始。

换句话说,在方案公司写一个外设的从设备驱动,终归还只是调用Linux的通用接口。而原厂是要操作寄存器,看懂芯片手册后,开始定义各个寄存器偏移,各个比特位,然后实现对上层的接口。

如果你想了解下小公司驱动是怎么搞的,可以先简单看我之前写的两篇文章。

 

硬核王同学:摄像头驱动开发调试总结5 赞同 · 0 评论文章 硬核王同学:WiFi模块驱动移植+调试2 赞同 · 0 评论文章

这两篇文章,完全是我工作中实际做的事情,而且是花费了几个星期才搞定的。从工作量的角度看,其实并没有多少,但背后还有着其他的含义。不单单是按照移植文档,随便改下代码就能解决的!

就拿WiFi驱动来说,移植一下,按照文档操作当然简单。但是,当出现bug,比如WiFi打开AP模式,上传数据过程中,CPU占用率过高,你该怎么办?

芯片CPU肯定是换不了的,业务流程也不能改的,那就要深入到驱动层,了解这个WiFi芯片的代码结构,找到对应的代码段,想办法优化数据传输过程中的CPU消耗。

比如发现有一个忙等待,那你就要把忙等待改成休眠延时等等。

其次,不光光要搞驱动,万一硬件上出现啥BUG,你一样要调试!比如WiFi传输很容易丢包,达不到给定的标准,那从软件上分析不出来,从硬件上分析抓包,发现是硬件上发数据偶然出现错误!那就要找为什么是硬件的问题。

还有,硬件、驱动都没问题,应用层又给你找事了!说这个接口需要优化,要不然调用这个接口很不方便,或者还是性能上的问题,都要跑到驱动层修修改改!

其实搞驱动真的很苦逼!尤其是那些刚刚上手的工程师,如果业务繁忙,你就要加班加点,一定要把驱动框架搞清楚,才能综合分析定位问题,想当初我熟悉SDIO和WiFi驱动时,就花了好几天时间!

而在芯片原厂,你可能做这样的工作。假如现在有一个全新的芯片,我从官网上拉一个uboot和kernel的源码,现在uboot和kernel中没有任何关于这颗芯片的代码,我要从新建一个文件夹开始,一步一步直到能够在芯片上跑起来, 这就是真正的系统移植,把Linux在一颗全新的芯片上跑起来。

而这过程有哪些驱动需要完成呢?首先就是要让串口有打印,有打印才能调其它的模块。但只调串口也不行,因为需要时钟,你就得先完成clock驱动,有时钟了还不行,因为需要复用引脚,你就得先完成pinctrl驱动。Linux的正常运行,还需要有一个timer作为系统timer,你就得先完成timer驱动,timer需要产生中断,你就得写一下中断控制器的驱动。。。

最终Linux正常跑起来,系统相关的驱动clock/reset、pinctrl/gpio、timer、watchdog、pwm、rtc、uart等都是已经写好的,然后在此基础上继续开发其他驱动,例如完成I2C控制器驱动、SPI控制器驱动、网口驱动等等。

另外,也不是所有在原厂的人都能有这样的机会做这种从零开始的系统移植,一般是芯片架构做了大调整,或者更换了Linux版本才需要。 具体工作内容可以看这篇文章:https://mp.weixin.qq.com/s/h43skYmkAzJX5U1b_F58aw

 

像题主专升本的学历,想找到一份小公司的Linux驱动岗位还是有机会的。还是要多投、多找,等待时机和运气,现在普通本科能找到嵌入式相关的工作都已经很难了,如果实在找不到,可以先做Linux应用开发再考虑忘底层转。 但如果实在想去芯片原厂,以目前这个就业情况来看,还是比较困难的。建议去考一个211或985的学校刷新下学历。

但其实看题主学了这么多东西,看起来实在是太杂了,搞驱动怎么着也得自己做几个带驱动的项目,可以先专精学下面的技术点:

Bootloader的工作流程、UBOOT的编译、裁剪与移植、Linux内核的编译、裁剪与移植,根文件系统+的构建、BootLoader、内核和根文件系统的烧写。 重点驱动框架如:字符设备+驱动、块设备驱动、LCD设备驱动、触摸屏设备驱动,总线设备驱动模型,输入子系统模型等。 再推荐一些学习资源 书籍:《Linux设备驱动开发详解》《Linux设备驱动程序》 视频:强烈推荐韦东山老师!!

再分享下学习建议

对照视频一点一点学习的过程中,刚开始第一遍看的话会有很多地方不明白,不要紧。如果在查阅了一些资料后还是不明白,可以先往后放放,不用深究。内核的许多东西一旦深究起来,越陷越深。 作为初学者,学习驱动开发主要学习驱动的框架(比如,输入子系统模型常用的一个函数input attach handler()这个函数,刚开始我们只需要知道他是用来匹配dev设备和驱动软件就可以,暂时可以不用知道这个函数内部是如何实现的)。有一定基础之后,可以再去深究其中的某个点,思考他们为什么这么写。

虽然看起来比较多,但是只要花上2~4个月的时间,肯定能熟悉完大部分内容。

了解这么多内容后,可以尝试着做一个小项目,把自己学到的Linux驱动知识都用起来,再找一些方案公司尝试投递简历,或者能找到实习也可以提前实习。

推荐项目 ROS机器人

 

【开源】如何手工打造一台理想中的机器人?_哔哩哔哩_bilibili

大神:各类复杂驱动

自学能到这个阶段就已经相当不错了。复杂驱动部分一般是在工作中学习的。像Android驱动,音视频驱动,usb驱动+,wifi,蓝牙协议,内核开发等都是比较深入一点的东西了,随便拿出一块内容,深入钻研下都可以成为这个领域的专家。 基本上都是进入到公司后,你单独负责某一块驱动,熟悉3~5年后,你就可以成为这个领域的专家。

如果你对某个方向非常感兴趣,就可以提前学习这部分内容,然后找一些可能涉及这方向的芯片公司,尝试投递简历、实习,拿到offer的几率也会大大提高的!

如果觉得有用请点个免费的赞,您的支持就是我最大的动力,这对我很重要!!!

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐