要想弄明白从单片机到嵌入式需要学习哪些知识,就必须先了解单片机工程师需要具备的技能和嵌入式工程师需要具备的技能。下面我先就单片机和嵌入式两个方向的岗位需求出发,来分析一下,单片机工程师到嵌入式工程师之间的路有多长。
从我们对于单片机的岗位分析来看,大概分为两个方向,即硬件方向和软件方向。硬件方向的要求我简单罗列为以下几点:
1.熟悉模拟电路和数字电路的设计和运用
2.熟练使用硬件开发工具:AD10,等硬件程序开发以及PCB设计软件
3.有过项目原理图PCB设计
4.掌握VHDL、Verilog硬件描述语言,能够编写控制逻辑
5.有硬件调试经验
软件层面则有以下要求:
1.熟练AVR,STM32等MCU
2.会各种裸机驱动的编写
3.熟悉SPI、IIC、UART、CAN
4.熟悉各类传感器
5.精通C/C++语言,具备良好的代码书写规范
6.熟练使用至少一种单片机,如STM32系列,MSP430系列等
7.熟悉KEIL、IAR等集成开发环境的使用,调试,仿真,流程;
8.至少熟悉一种ARM架构,例如:Cortex-M3
9.了解实时操作系统原理,如UCOS/FreeRTOS/RT-thread
通过我们对于单片机工程师的岗位技能分析,总结如下:
想要成为一名合格的单片机工程师,需要如下一些技能:
1.熟悉模拟电路和数字电路(要求可以看懂原理图且可以自主设计)
2.熟练使用一些硬件开发工具
3.能绘制PCB图且能自主设计
4.掌握一门硬件描述语言,能够编写控制逻辑
5.有硬件调试经验
6.熟练使用51、STM32、DSP等MCU
7.有一定的C语言开发功底
8.会编写各种裸机驱动
9.熟悉各种总线,会编写各种总线的驱动代码
10.熟悉常见的各类传感器
11.熟练使用一些裸机程序的集成开发环境例如:KEIL、IAR等
12.熟悉ARM架构的一些单板
13.了解一些实时操作系统
接着我们来分析一下嵌入式工程师的岗位需求和技能方向。进而了解一下如何成为一名合格的嵌入式工程师。我们先罗列一下嵌入式工程师的岗位分类,其分别为:嵌入式软件开发工程师、嵌入式系统工程师、驱动工程师。
嵌入式软件开发工程师的一些要求:
Linux平台下的C开发(在一些做嵌入式产品的大型公司)
<1>C语言精通
<2>数据结构要熟悉(表,栈和队列,树(平衡二叉树,霍夫曼树,二叉排序树,二叉查找树,树的应用),图的存储方式,图的遍历,图的相关算法)求最短路径
<3>对于常用查找,排序算法的了解和使用(静态查找:(1)顺序查找(线性查找)(2)折半查找(二分或对分查找)(3)分块查找(索引顺序查找)动态查找:(1)二叉排序树(2)平衡二叉树,哈希查找(哈希表))
<4>Linux环境的熟悉,shell脚本的编写。对Linux操作系统的组成以及各个层次的实现,Makefile要能看懂
<5>IO
<6>多进程,多线程编程,要熟悉
<7>网络编程要熟悉。(并发服务器的搭法)
<8>通信相关的知识要了解
<9>要至少掌握一种数据库的使用
<10>良好的编程习惯
<11>具备一定问题分析与定位能力,并解决
嵌入式操作系统研发工程师:
<1> 精通C语言,了解汇编语言,熟悉数据结构和常用算法;
<2>熟练掌握一种CPU体系架构,熟悉常见CPU体系架构,对MMU、CACHE、内存、DMA等有深刻理解。
<3>精通一种嵌入式操作系统,熟悉多种常见的嵌入式操作系统,熟悉文件系统、协议栈。
<4>精通Linux操作系统移植、裁剪,驱动编程和调试;
<5>具有LCD,Touch,CAMERA,USB,BT/WIFI/GPS,Sensor等驱动3种以上的开发经验。
<6>良好的英文能力和团队精神。
Linux驱动开发的岗位需求:
<1>数模电
<2>能看懂原理图
<3>熟悉各种硬件协议(SPI\IIC\UART\CAN等)
<4>相关的基础理论
<5>熟悉Linux操作系统(驱动模块)
<6>熟悉驱动框架
<7>shell脚本的编写,makefile
<8>英文文档的阅读能力
<9>熟练掌握device tree、电源管理、内存管理、文件系统管理
从上面我们的分析可以看出我们单片机方向的入职要求和嵌入式方向的入职要求是不同的,单片机方向对于操作系统几乎没有什么要求,但是嵌入式对于操作系统的依赖性则是非常强。虽然C语言单片机的工程师也在用,但是使用的语法和复杂程度都比较低层次。所以要想从单片机方向转入嵌入式方向在原有的知识体系上需要加入的有:
1.C/C++的高级语法
2.I/O操作
3.数据结构+算法
4.嵌入式操作系统
5.并发编程
6.网络编程
7.系统移植
8.驱动开发
所以,单片机到嵌入式方向的转换,最切合的自身特长的方向是驱动开发,因为单片机的工程师一般有着比较熟悉的硬件知识,只需要学一些结构和算法,深入学习一下Linux/其他嵌入式操作系统的源代码和架构,学习一下Linux平台下驱动开发的核心技术。就可以实现一个从单片机工程师到嵌入式驱动开发工程师的转换。