作者:懒懒土拨鼠
    链接:https://zhuanlan.zhihu.com/p/260516266
    来源:知乎
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    第一阶段称为stm32+RTOS阶段。
    任务1:裸板驱动,比如在裸板上点亮LED灯,一般是以stm32为平台,通过汇编代码手动配置最底层的寄存器,完成时钟树、GPIO口的初始化,重点1:理解软件和硬件是如何联系在一起的(地址,宏定义和typedef封装)。重点2:理解汇编语言操作寄存器的过程。重点3:理解启动文件。有人会说,什么年代了还用汇编,直接c实现不更简单。关于c实现更简单我同意,但是我觉得真正想理解硬件就必须在汇编层面上去理解,越深入你越会发现汇编的重要,启动文件可是纯汇编的。推荐野火的《stm32完全开发手册》和《ucos-II移植》。正点原子那拼凑出来的辣鸡就不要看了,别问我咋知道的。
    任务2:移植一款RTOS并在stm32平台通过两个任务(点灯任务,灭灯任务)实现led的周期闪烁,我所移植的是ucos2.重点1:使用汇编语言手工编写ucos2与stm32硬件平台的接口部分,这一过程将会涉及到对m4内核模式切换、中断系统的运行机制的理解。重点2:理解多任务并发编程。理解ucos2中关于任务组织方式的源代码,理解上下文切换的本质(关于源代码的理解强烈推荐廖勇老师主编的《嵌入式操作系统》,一行一行带你读源码,这本书也已经被我翻的发黑了……吃透够你彻底理解RTOS)。
    任务3:在Linux平台上使用makefile的方式完成任务2的源代码的交叉编译。难点1:makefile语法。难点2:理解静态链接的全部原理和ELF可执行文件。预编译、编译、链接、装载的全过程,对编译过程是理解是所有c程序员的自我修养(强烈俞甲子大神的推荐《程序员的自我修养》,读懂静态链接就足够成为面试的亮点,懂动态链接更好但也更复杂),这种修养决定了嵌入式程序员把握大型程序能力的上限。难点3:理解链接文件。各个段的地址可不是随便安排就完事了。这个任务带领我们“惊鸿一瞥”了计算机技术中那些“以不变应万变”的能力中的一个。
    任务4:在你的系统中使用一种数学算法,培养知识迁移的能力。你要知道软件只是实现功能(陪跑的),一个嵌入式软件程序员想有所发展必定要和某个特殊领域的算法结合。我所做的是四轴飞行器项目,里面的算法是姿态解算算法和PID控制算法,都不算太难开源的也不少,重点在训练知识迁移的能力。不得不说我数学真的不好,姿态解算里面那个互补滤波我也就懂个大概流程,里面式子为什么那样算那样互补基本不懂,很数学(从此放弃做科研),但是PID必须弄通透。
    以上任务不打折扣地做下来怎么说也得一年,何况各位还有各种商业项目缠身,那就更容易分心。对于我一个读研之后才接触OS的菜鸟硕士,对自己要求也没那么高,在研二到这种程度就能找一份工作了。面试官们都说我基础很好嘿嘿嘿……其实面试官对于嵌入式应届生并没有太高的编程技术要求(寒武纪现场编程没做出来之后面试官亲口说的),甚至芯原的笔试根本就是全方位的基础知识集合。他们最看重的是你的潜力,首先是做项目是否认真地刨根问底,对技术的追求,这些直接体现在你的基础知识上,项目中的所有东西要能经得起面试官细致的地毯式轰炸。第二个就看你目光是否长远,行业认知,未来趋势,表达交流能力,他希望你有自己的见解,毕竟对于一个985硕士他培养的是未来的骨干而不是只会干活的码农。
    第二阶段称为多核+Linux阶段。
    老师不让我们碰Linux,在RTOS没吃透的时候。 以上过程走完之后就可以碰Linux了,这时候你肯定已经有自己的一些判断,你可以找一块更高端的板子,a系列甚至是多核的,再走一遍裸板驱动、移植Linux、交叉编译环境的调试,ai算法工程化等等高端玩法,这也是我今后的研究方向。
    第一阶段任何有志于嵌入式的同学都可以在硕士期间完成,我老师从本科就亲手培养起来的大佬本科阶段就完成了第一阶段,研究生完成第二阶段使用异构多核+Linux研究slam算法,人家去了嵌入式巅峰企业大疆。
    第三阶段要么是转管理带技术团队,或者就去研究架构做技术专家。要么OS内核架构要么底层软件系统架构,都是核心技术,这一块目前我一个只完成第一阶段的菜鸡看不透。
    最后荐书环节,其实书不在多,啃透就行,除上面提到的《野火stm32完全开发手册》、《M3权威指南》、《程序员的自我修养》、《嵌入式操作系统》还有经典的《深入理解计算机系统》:出版至今几十年了,基本内容没怎么变过依然为行业经典,充分说“以不变应万变”的重要性。里面各个方面的知识都有,我目前关注了程序优化和指令集部分,日后会继续拜读其他章节。以上书目建议把书翻黑为止。
    《高级计算机系统结构》,没错就是计算机学院和软件学院必开的那门高计课,虽然大部分讲的X86,但是各个模块俱全,我面试时那些cache知识、指令流水知识和各种处理器知识就是来自这里。

    《C语言程序设计现代方法》:扔掉那本红色的辣鸡,所有C语言的细节这本书都有,遇到基础语言的问题翻这个就对了。《C和指针》也要看起来。
    对于面试还需要《王道程序员面试宝典》《C陷阱与缺陷》,帮助你理解C语言的细节,各种细节,你从来没关注过的细节,助你选择填空拿满。嵌入式程序员不需要费劲去关注算法,遇到动态规划什么的直接不做就好了,《剑指offer》不用刷,去牛客刷点链表和字符串足够了。