1、入门
C语言:嵌入式编程大多用C语言,少量汇编,C语言必须熟练掌握。
电路:基本的模拟电路、数字电路知识,能大概明白电路原理图;掌握从原理图到PCB板的技能或常识;会焊接、调试,使用常用仪表。
51单片机:虽然落后,但学习相对简单,IO、中断、定时器,AD、Flash、UART、IIC等基础;辅以简单的开发板练习,巩固基础、原理。
C51基础,会看datasheet,使用官方库或寄存器设置,能实现中等难度的裸机程序;达到这个能力,后续换其它型号也容易举一反三,快速掌握。
2、进阶
ARM单片机:8位单片机是基础,升级32位ARM是阶段目标,一般选STM32,资料丰富。基于原厂库函数实现复杂功能,对接外设,如蓝牙模块、GPS模块等,数据采集过滤、存储、传输等。理论方面比如编译、链接、OTA、socket等也需要明白。
实时操作系统:裸机开发是基础,要提高必须跑系统,如freerRTOS 、rt-thread等。学会移植,使用系统接口开发复杂功能,尽量研究下RTOS的源码,其数据结构、编码规范是学习的参考资料。注意软件分层与模块化思想。
应用层:掌握一定的C++或QT基础,开发一些辅助工具,也可快速验证纯软件逻辑,见识面向对象开发的思维。其它语言如perl、shell、python、批处理都可以学个基础,能一边百度一边写出就行。
正式项目一般基于原厂SDK开发,非通用芯片使用特有的开发环境、调试工具等,有了前面基础,新平台1-3周足以应付。做项目和学习的专注点不同,要求的是稳定、性价比,不追求技术的先进性。
学习中总结失败教训,梳理开发流程、技巧,整理成技术文档,加深理解,这些文档不仅对自己,对其他人也是财富。
3、规划
具备一定基础了,后续发展看个人爱好或市场需求,软件或硬件或全栈,相比来说嵌入式软件需求大。其下细分单片机开发支持RTOS实时系统或者Linux,前者容易,后者需求大,但入门难,即使精通一个组件或方向也能发展不错。Linux路线,先学会应用开发,再驱动,最后深入内核。
基本上规划大概率决定了职业方向,尽早规划,提前准备,有针对性的学习RTOS或者Linux或者硬件电路,后续往深度发展。如果不适合技术路线,有点基础再从事市场营销也大有裨益。
除技术之外,嵌入式开发对行业经验也有一定要求,不同行业应用的技术侧重点不同,可以参考相关公司的招聘要求,有针对性的去了解。
选择比努力重要,同样是软件开发,不同行业也存在较大区别。第一份工作尽量选个好方向、挑大公司,有这些起点背景,后续发展会更好;最开始的方向和平台没选对,后面再折腾会走很多弯路,也许一生的职业发展就在错误的路上,再努力也很难达到一定高度。
4、发展
“三人行,必有我师焉;择其善者而从之,其不善者而改之”,不论哪种职业,要善于总结、学习周围人的长处,比如软件开发,阅读优秀开源代码是快速提高软件开发水平的主要途径。
持续学习,从深度与广度发展,总结分享技术成果。如果感到没有参考目标了,说明已经成为一方权威或者该换地方了。
5、个人感想
以前有个困惑,有的老年人做饭一辈子,可是烧菜的水平还是有限;一些烹饪技校的学徒,几年时间后做出的饭菜明显高于一般家庭主妇。这个问题,也许答案是持续学习、不断进步。社会在进步,技术在更新,不断接触新的,不一定都要亲自动手实践,能评估可行性,知道大概如何实现即可,有需求时再深入细节。
嵌入式系统开发方向繁多,只要肯专研,精通一门,成为食物链顶端的人,人生轨迹都不会差。
嵌入式软件开发,C语言是基础;有需要请添加个人微信,微信号隐藏在C代码中:
- //个人微信号
- #define UNKNOWN ('-'-'-')
- #define C(c) #c[0]+23
- #define CC "%"
- #define CCC CC"c"CC"c"
- #define CCCC(c) ??=c"02"
- int main()
- {
- int a=100;
- char error = 0xFF;
- char work = "RTOS"['/'/'/']/2021;
- printf("c"CCC"n"CCC"%c%"CCCC(c)"%c"CCC"\012",
- work["mtk"]-5,work["embedded-system"],work["gps"],\
- UNKNOWN["java"],UNKNOWN+3["linux"],(-~UNKNOWN)["Android"],\
- C(c),UNKNOWN??("my_wechat"??),"number here"??(2??)+error);
- return 0;
- }