文章目录
这篇笔记,主要是为了了解嵌入式工程师 开发项目的过程、嵌入式工程师所需要做的工作。以及嵌入式工程师的 自我修养。
1. 一个嵌入式项目从0开始开发的大致流程.
从0开始做一个嵌入式开发项目的大致流程如下:
i. 了解需求
和客户对接了解需求,形成需求文档,双方签字,并注明后续是否可以增加需求或者方案调整。
ii. 召集人员汇聚资源
根据需求文档召集项目组,项目组一般需要硬件设计、画PCB板、驱动工程师、算法工程师、软件工程师,其中驱动工程师和算法工程师可能是同一个人。
好了,参与人员确定了,找一个负责人负责这个项目,一般选择驱动/算法工程师作为项目负责人,因为项目负责人需要较为丰富的经验和对整个系统了解比较深入。
人员到齐了,开始制定实施方案,芯片选型、架构设计、可能存在的风险点、给项目组中各个人员分配具体任务,确定任务节点,形成设计方案和技术手册。
iii. 开始执行
任务分配完成后
第一阶段:
1.硬件设计开始设计原理图,大约需要2周
2.驱动开发人员开始根据所选芯片准备调试驱动程序 ,在开发板上调试驱动,大约需要1~2周
3.算法工程师也开始根据项目需求进行算法设计和仿真,大约需要2周,如果有重大问题或者风险点,可能时间会加倍
第二阶段:
1.原理图设计完成,开始画PCB板,一般1周到10天时间,画完投板
2.驱动调试基本完毕,还需要上真实板子调试
3.算法仿真完成,只待板子制板完成
4.算法工程师和软件开始定内部接口协议
5.软件开发人员开始根据客户提的需求和与算法工程师之间定的接口协议开始设计开发软件。
第三阶段:
1.制板(大约2周时间)完成,回来测试,大约1~2天
2.搭建好环境,开始准备把驱动在板子上跑起来测试,测试时钟是否锁定,驱动是否正常、各个接口是否已经打通,这个事情如果没有太大问题,1天时间就可以完成,如果有较大问题,比如中断功能异常,可能就得画1周时间来查问题。
第四阶段:
驱动已经顺利完成测试了,开始将仿真程序移植到板子上,痛苦的调试过程从这一刻就正式开始了
驱动和算法都在板子上跑起来了,ok,开始调试,嵌入式代码是三分写,七分调。
调试的时候可能会遇到各种奇奇怪怪的问题,比如中断时间异常、某个接口的输出数据异常、算法的运行结果并不是和仿真的结果一致、硬件不稳定等等问题,在调试中都会一一出现,然后准备实验手段,定位各种问题出现的地方和原因,逐一排查,这和过程的耗时可能会很长。因为嵌入式系统的最终目的是要让程序在板子上高效稳定的运行,任何一个小的问题在交付后都有可能变成大的问题,因此,在排查故障和解决问题这方面,这个应该是嵌入式工程师的看家本领了。
……此处略去无数调试过程和踩过的坑,修改过的Bug
iv. 开发完毕,交付客户
开发完毕后需要客户来验收并提提出问题,开发人员一一解答。
客户表示满意,ok,交付
客户不满意,ok,修改调试。
2.大佬的经验
上面列举的三种方式,最系统也最有效的,当属看书了,我这里推荐几本书。
2.1 C语言基础
对于语言层面,当然最多用的是C语言,学校学的教材比如谭本《C程序设计》只介绍语法不说,还有很多误导,坚决不要看了。我推荐你读K&R版本的 《C程序设计语言》,Bryant,R.E.的 《深入理解计算机系统》,接着就是Andrew Koenig的 《C陷阱与缺陷》、KennethA.Reek的 《c和指针》、LinDen,P.V.D的 《C专家编程》,对于C语言基础,这些已经够了。
看完这些,你最起码了解了计算机程序到底是怎么一步步生成的,对语言、对系统又有了进一步更详细的认识。
与此同时,可以看些实用性强的书,W. Richard Stevens的 《UNIX环境高级编程》 、 《UNIX网络编程》,把语言上的所学的进行实践,了解编译器编译流程、Linux的基础命令,固件的交叉编译。注意,这2本书都很厚,不用强迫自己全看。
其他基础学习: Kenneth H·Rosen的《离散数学及其应用》,Brian W. Kernighan / Dennis M. Ritchie的《C程序设计语言》,马伟的《编写高质量代码:改善C程序代码的125个建议》,Richard Blum的《Linux命令行与shell脚本编程大全》,Sam Lightstone的《大师访谈录-成就非凡的软件人生》(特别适合初入职场的人阅读,它会指引你规划职业生涯)
下一步,开始看你的专业相关,笔者从事物联网安全行业,当然最关注的是嵌入式软硬件、网络、安全技术,那就要针对这3个方面找书了。
2.2 软硬件
硬件架构,笔者用arm比较多,推荐看Joseph Yiu的 《ARM Cortex-M3与Cortex-M4权威指南》,然后就是各个芯片的芯片手册了,我还记得第一次看芯片手册的感受,“天书!” 写的都是啥,全然看不懂——后来我发现所有的芯片手册竟然都是一个套路,只要看完一个手册,再看其他的就很快了。
我还推荐你学习些FPGA的知识,用Verilog尝试做些简单的硬件设计,会让你更深入的了解硬件的工作原理。
操作系统是一切软件的地基,对于嵌入式操作系统的学习,推荐左忠凯的 《FreeRTOS源码详解与应用开发》 和FreeRTOS、RT-Thread的源码。
2.3 网络
先扫一遍《TCP/IP详解卷1》,这些本科课程学过就扫一遍,没学过就仔细看看了。
接着可以看实现,笔者用lwip比较多,推荐看朱升林的 《嵌入式网络那些事》 ,配合lwip源码一起看。这本书看完,可以看看《TCP/IP详解卷2》和《TCP/IP详解卷3》,这2本也都是神级科学家W. Richard Stevens的著作,超级厚,还是那样不要强迫自己全读完,有选择的看。
2.4 进阶与安全技术
我这里只推荐一本密码学入门,结城浩的《图解密码技术》,写的通俗易懂,又不是特别深入,适合初学者,其他就要去找更加具体的资料了,读者们从事各个领域,自然知道要找什么书来看。
对于与这些书,我希望你能带着问题看,解决问题就合上,只看你感兴趣的部分,其他的章节偶尔翻翻混个眼熟就好;另外,很多书都是翻译过来的,有些表述并不准确,读起来不是那么容易,我也没有什么好办法,只能劝你静下心来慢慢看,反复看,多看几遍;最后,希望你能边看边实践,确认书中说的是对的,实践了才能内化成自己的。
为什么要“混个眼熟”?就是你要知道这本书还讲了什么,以后有类似的问题,就可以来有目的的翻阅了。
2.5 真正知道的三个阶段
笔者认为,真正学的学会一样东西,有以下3个阶段,这3个阶段可能不是线性的,尤其第三个,可能是你很久以后恍然大悟才能达到。
- 会用
比如那些网络接口函数,硬件驱动接口,你可以利用它们写出没有bug的代码,完成了项目任务,那就是会用了。 - 了解怎么实现
会用之后就是学习它背后是怎么实现的,这时你就要去查深入些的资料,看深入些的代码了,幸运的是,我们目前所能接触到的问题,大部分在互联网上都有答案,很容易就能找到,那些热爱求知的前辈们早已经为我们准备好了答案。
了解了实现,你就可以对之前写的代码进行优化了,你之前只能保证写出的代码没有bug,现在你知道它为什么没有bug了,遇到难搞的问题,你的思路会很开阔,马上找到问题点。 - 明白为什么这么实现
第三个阶段,就是你不单单要知道它怎么实现,你还要探求它为什么这么实现。
比如TCP/IP,为什么要分那么多层,还有没有其他的网络协议栈,几种协议栈不同之处在哪里,为什么其他协议栈就没这么普及呢?
比如各类嵌入式操作系统,为什么都宣称自己又快又小,他们的性能怎么评估,技术上实现的不同点在哪里,各个系统的作者为什么要那么实现?
当你能「评估」一类方案/技术的几种实现形式,说出各个形式的好坏差别,你就能做到融会贯通,在项目层面,你就知道如何取舍选择了。
以上是认知的第三个阶段,即不断的学习,真正的学会。这个阶段应当是贯穿整个职业生涯的始末,别人问一个问题,你第一时间的反应是”知道自己知道“,然后脑子里搜索答案。
3. 大佬的升级打怪
写了这么多,是不是学完这些就可以独步天下了?
当然不是!这只是万里长征的小小一步,这小小的一步在我看来,一般需要5-10年左右的时间,有些人只是有着一个念头但从没有抬起脚。
这一步什么时候迈都不晚,最难的是你有勇气抬起脚。
迈过来后什么什么样的世界呢?我引用吴军博士的五级工程师划分来说明你的职业规划。
如图,吴军博士在他的很多书里提到这个五级工程师的划分,我们刚刚说的,完成那些学习与解决问题后,基本可以说,你已经站在这个金字塔的最底层了。五级工程师,你好,你看这塔,一点也不高。
这个时候你该做的,不单单只是一心沉浸在技术的海洋知识的海洋里了,因为我们毕竟是工程师,而非科学家,要开始运用知识,解决实际问题,再解决更大的实际问题了。
解决更大的实际问题就要向着四级工程师迈进,这时你不单单要自己懂技术,还要想办法尽快把你的”鱼“和”渔“授给其他人。
你还要学习管理知识,掌握与上、下级沟通的技巧,如何推动自身和团队快速进步是你的挑战。
对于三级工程师,除了具备4级工程师的能力,还需要能够紧跟时代,预判市场,懂得营销,不单单做得出产品,还能卖得出产品。
二级工程师是指能做出先前没有的东西,世界会因为这多少有点不同,吴军博士举了这两人作为例子:北极光风投的创始人邓锋、Google云计算的发明人迪恩(Jeff Dean)。笔者见识有限,所知甚少,嵌入式领域我能想到的人包括大疆的汪滔,柔宇的刘自鸿,这里大胆激进的把他们放在第二级。
第一级是开创一个产业的人,包括爱迪生、福特、贝尔等人。
各位应该好奇笔者处于第几级呢,我给自己定在4.5级,目前笔者可以独立完成老板交代的任务,也在努力学习提高自己团队的整体效率,产出更具创造性的成果。
4. 大佬的建议
由于笔者实际经验有限,也在探索如何爬这个塔,不敢妄加定义,引人入歧途,下面只说一些个人看法,权当抛砖。
3.1 博览群书
计算机专业的同学不要只专研技术,也要看看经济、政治、生物、天文、地理、艺术、医学、历史等等,要知道,计算机这门学问,诞生不过几十年,放在人类历史长河中,比前面那些学科简直就是沧海一粟。
看杂书多的人理解力要比看的少的人强,看的多了,就会有一种「类比」的能力。
比如对于“面向对象”,如果在学习面向对象之前,你了解过亚里士多德的唯实论和他对「共相」的阐述,你就会理解的很快,跟本不用老师教思想,只用学学语法就行了,而且你免不了会在心里嘀咕,面向对象的设计者是否正是受亚里士多德「共相」启发而设计出了这样的软件开发方法?
3.2 慢慢的爬,聪明的爬
爬金字塔呢,就是攒的过程,很多人浮躁,学知识只学一半;有些人自以为聪明,总想找捷径;有些人勤奋刻苦,但不得其法。
文章一开始我说过,工程作业不比科学家,是不是名校,成绩好不好都不是大问题,想想你本科接受的教育也才4年,况且4年只是有那么一丁点基础知识,而工作是一场人生马拉松,可不单单要跑4年的。
只要一个人有学习能力,就可以解决大部分遇到的问题,区别无非学的快慢、攒的快与慢。
有些攒的快些,N年后,他们被称为「神」,这个比例是1%;
有些人攒的慢些,N年后,他们被称为「牛」,这个比例是9%;
有些人基本没攒什么,N年后,他们仍是「农」,这个比例有90%。
N ≥ 20
不好意思,上面这个比例是笔者杜撰的,我故意把「农」的比例增大,目的是警惕自身,也希望读者能警惕不要成为那90%。
进入那9%的「捷径」就是慢慢积累,我们普通人只要坚持学习积累,就一定能达到。
进入那1%可能就比较有挑战了,据我所知,好的工程师年薪会到百万美金以上(股票+奖金),注意这仅仅是工程师,这个层次能达到最好,达不到也不要强求。
3.3 多重构
总结是使人加速进步、聪明进步的很好的手段,对程序员来说,对代码最好的总结就是重构。
重构代码能带来至少两个好处,一个是对公司的,优化代码,易于维护,日后有其他人接手会更快上手;另一个就是对个人了,谁重构谁获益,这是学习的最佳手段,如果你写了10个项目,没有重构过一次,那你第11个项目用的数据结构、模块划分方式可能和第1个项目是还是一样的。
而如果你但凡重构过哪怕一次,当你写下一个项目时会更加得心应手高屋建瓴。
重构,不单单是为了优化过去,更大的好处是指引未来。
这就是爬金字塔的方法,不断的重复:学习–>实践–>总结,这个闭环。
好啦,本来是想写自我修养,写着写着写成了职业规划,既然规划那就是规划吧,希望你能从文中得到或多或少的启发。
不管每天发生什么,夜里都要静下心来看书思考做笔记。每隔一段时间就做一个读书计划,每天读书,当然还要看别人写的代码,最好能学会分析开源程序。