虽然秋招还没结束,但是意向公司要么在泡池子,要么早早感谢信了,因此做个总结吧。作为一个三无菜逼,无实习无竞赛无论文,秋招准备得还晚,没有时间做合适得项目,只能靠着课题的项目,可以说是被秋招大军冲得稀碎。
写在开头,无论是找什么样的工作,项目经历 都是最重要的,能有实习或者竞赛或者其他落地的项目是最好的,其次是在网上自学的项目。没有项目可能连简历关都过不去,而且面试时基本都是围绕项目来提问,追问项目或者项目相关的场景题或八股。因此一个完整、复杂、有难度的项目很重要。
1 工作方向与可投公司
嵌入式软件开发,主要分为两个方向:应用开发和驱动开发。应用开发偏向上层,多是进行进程、线程管理,实现各种软件功能。驱动开发偏向底层,配置各种外设等等,BSP开发也可以算是驱动开发,只是BSP更底层一点。此外工作内容分操作系统上的开发和裸机开发(单片机开发),大部分公司的岗位都是在操作系统上进行的,只有少数小公司直接裸机开发。
各个公司对于岗位的名称都会有所不同,大部分会写“嵌入式软件开发”,有的是“C/C++软件开发”,有的更加具体“驱动开发工程师”、“系统应用工程师”、“数字固件开发”等,主要还是看岗位要求与业务内容。
可投递的公司有很多,只要是软硬件相关的都有相关岗位:新能源、芯片、新型制造业、传统制造业。新能源有宁德时代、阳光电源等做电源相关的,也有蔚来小鹏理想比亚迪等做新能源汽车,还有做充电、储能相关模块的公司英飞源、汇川、博世等。芯片公司有很多,国外大厂因特尔、AMD、高通、英伟达、TI等等,国内海思、寒武纪、地平线、平头哥、燧原等等,还有很多做车载芯片、电源芯片、数模转换芯片等,半导体公司国内有很多小厂。新型制造业包括美团、阿里、大疆、影石等做无人机、运动相机设备或AIOT相关的,也有各个手机厂:小米荣耀OV传音,还有高仙等做移动、扫地机器人相关的。传统制造业有海尔美的格力等做智能家电的,也有视源、海康、京东方等行业大厂,还有三环、大族等等。
不同公司的不同岗位考察的能力和八股是不同的,有的要求C++,有的要求C语言;有的偏向底层,外设开发,有的偏向不同功能,比如做通信相关的岗位就对计网要求比较高,做系统相关的就对操作系统要求比较高。但不论什么岗位,项目都是重中之重,最好有实习或者竞赛的项目,其次才是网上练手的项目,项目的内容最好是在操作系统上,有进行多线程、内存管理、中断等内容的。
2 嵌入式学习路线
2.1 主要学习内容
嵌入式软件开发要学习的内容和通用软件开发基本一致,四大件:数据结构与算法、操作系统、计算机网络、计算机组成。但是岗位内容偏向于操作系统。编程语言主要是C++,大部分公司的岗位在应用层面使用的都是C++,底层使用C语言,因此C++最好精通。
首先数据结构与算法,除了看书,刷题就完事了,《代码随想录》挺好的,跟着练就行,然后多刷力扣。嵌入式软开的笔试,有的是和通用软开一套题,全是算法题;有的是选择填空+算法,选填的内容主要是四大件里的内容+C/C++。
编程语言的学习除了看书,主要也是在刷题与看笔经面经中积累起来的。
操作系统的学习是重点,可以在完成项目的过程中学习,最好能阅读内核源码,了解系统调用的过程、信号传递的过程、各种管理方法在内核中具体是怎么实现的等。主要学习内容在于进程通信、线程同步以及内存管理。
计算机网络主要在于四层模型和七层模型,主要学习TCP和UDP相关内容,一般项目不涉及网络太多的话,不会直接问http和底层相关内容。
计算机组成主要是做了解,嵌入式系统构成,单片机构成,ARM架构,多级cache和组织方式等等。
此外有空还可以了解编译原理,若项目涉及的话还可以学习Makefile语法、设备树语法、汇编语言等等,Linux各种命令及根目录下各个文件存放的东西(如果使用Linux系统的话应该熟悉)。
最好使用git进行代码版本管理。
2.2 学习途径
除了四大件的书籍,视频的话可以通过韦东山或者野火的教材进行学习,韦东山的视频稍好一些,野火的文档稍好一些。还有如小林coding、代码随想录星球等,有许多大佬整理知识点。
整体学习内容基本如下(图源网络):
2.3 常问的八股
可以多看看牛客上的面经,看看其他人都被问了啥;下面是我遇到的一些情况。
C语言:
- 一级指针、二级指针、函数指针的作用及应用场景;
- 数组指针和指针数组,常量指针和指针常量;
- static、volatile、const修饰符的作用;
- 结构体和联合体的区别;
- 结构体内存对齐和位域;
- 文件操作;
- 程序编译的过程;
- 大小端及验证方法;
- 链表与数组的区别;
单片机:
- 最小系统板组成;
- 时钟和倍频;
- 定时器种类及其区别,具体使用参数,预加载寄存器和影子寄存器;
- ADC最高频率、采样精度、采样时间;
- 中断及嵌套调用,中断函数的传参;
- UART、IIC、SPI的协议与区别;手绘SPI时序图;
- Flash分区、bin文件;
- 句柄的使用;
- STM32启动过程;
- 内存分布;
操作系统:
- 进程线程区别;
- 进程通信方法、线程同步方法;
- 中断信号传递过程、上半部和下半部;中断里的睡眠;
- 内存管理:物理内存结构(NUMA)、虚拟内存、内存碎片、内存申请、内存回收(OOM中bash的系数);
计网:
- TCP和UDP协议与区别;
- TCP沾包、心跳机制;
Linux:
- 内核启动过程;
- Linux移植、uboot移植;
- 三种字符设备及区别; 五个子系统;
- 驱动框架;
- TCP抓包;
- 内联汇编;
- 编译过程的动态库与静态库;
3 笔试面试注意事项
- 首先简历上写下的东西一定要熟悉,能张口就来。其次刚开始多笔试面试,积累笔经面经。
- 写好自我介绍、自我评价(优缺点)、优势、意向城市、公司及岗位选择;
- 项目细节把握清楚,以及项目难点、遇到最大的困难及解决方法、最大的收获。
- 面试前可以了解一下公司及岗位。
- 牛客上有很多笔经面经及内推码,脉脉上可以看看公司现状(也有很多瞎扯的),offershow上有薪资爆料,校招薪水上有各个企业招聘信息。
4 谈薪
- 薪资构成:基本薪资多少、绩效多少?年终几个月?绩效考核的等级和比例是多少?
- 五险一金的基数和比例多少、医保等级(很多城市不分等级,深圳有一二三,有的企业给三级医保);
- 试用期薪资、试用期考核(卡转正?)、末位淘汰? 服务年限?
5 整理的一些文档
包括C语言、裸机开发和驱动开发的部分八股,不是很全,也不一定保真,基本都是从网上总结或者实践中体会得到的。
链接:https://pan.baidu.com/s/1ilbyDfzYpfuAs7LtOdIucA
提取码:luck