嵌入式C学习路线汇总--进阶之路

嵌入式是工科,工科讲究实践。说的再多、懂得再多,不能做出实际的东西,是没有意义的。学习嵌入式的核心原则之一就是多动手写代码。另外还有一个原则就是:从浅到深学习。接下来的内容将贯彻这两个原则。最后强调一点,各个方面的技术是齐头并进的学习,而不是某一个方面学的非常好才去学习下一个方面。实际开发中,用到的技术会很多,我们只需要做好其中一部分就行了。

1 C语言

C语言是嵌入式开发必备的基本技能之一,对它的学习没有尽头,需要大家认真学习C语言。熟练使用C语言开发,这是嵌入式工程师的基本要求。

1.1 开发环境

学习C语言本身,可以使用各种工具链,这里博主比较推荐微软的VS开发工具,在win下学习C语言。作为小白而言,简单、好用的工具更重要,VS提供了开发C语言需要用到的各种工具。对于个人学习而言,社区版本完全够用,可以在微软官网下载到VS软件。我使用的是VS 2019版本,也可以用其他的版本。

1.2 C语言入门

C语言的视频B站很多,大体上没有太大的差距吧(指内容),我自己也只是看过一些郝斌的C语言视频,这个可以看看,我学习的时候更喜欢看书,主要是看书信息接受效率高。这里推荐一本C语言入门级别书籍:《C程序设计语言》,作者是布莱恩·克尼汉,丹尼斯·里奇。C语言创始人写的一本书,非常经典,在世界上都享有盛名。大名鼎鼎的Hello world程序就是这本书提出来的。

这本书的经典程度网上一搜就有,这里就不在多赘述了,用它作为C语言入门书籍完全没问题。书里面的代码风格也是值得借鉴学习的,非常建议读一读该书。

1.3 C语言提高

对C语言基本的语法使用有一定理解之后,就需要对C语言进行提高了。提高阶段,我推荐如下三本书:《C与指针》、《C专家编程》、《C陷阱与缺陷》。

这三本书应该读哪个?

这三本书,我都研究过。三本书的内容有不少重复的地方,看完一本之后,另外两本看的也挺快的。如果有时间的话,建议三本都看看,时间不够的话,就只看《C与指针》这一本也行,这本书内容详实,有入门有提高,从浅到深,也可以拿来入门C语言。至于其他的书籍,因为没有过多研究,就不推荐了。

以上C语言的资料学习完成之后,基本上对于C语言有了较深入的理解了,应付平常开发应该没有太大的问题。

2 stm32

stm32是目前市面上资料较多的ARM芯片(指Cortex-M系列芯片,这里不在赘述)了,用的人非常多,资料很全,遇到的各种问题在网上都可以找到解决办法。有些问题真找不到的话,那就涉及到比较深入的领域了,也不是初学者该遇到的和能解决的。因此,建议以stm32为切入点,学习ARM 32位处理器的使用。stm32芯片有非常多的系列,每个系列又有很多芯片,这里推荐stm32f407的芯片(大部分人也是用这个芯片学习的),兼顾成本、性能、学到的知识,性价比高。下面谈谈该如何学习这款芯片(其他的芯片类似)。

2.1 stm32基础

stm32芯片里面的内容其实非常多,但作为初学者,并不需要关心特别高深的内容。我们只需要掌握stm32常用的开发以及基本的知识点。根据自身的开发经验和经历,总结了如下常用的外设:GPIO、UART(串口)、中断、TIMER(定时器)、AD、DA、SPI、I2C、PWM、DMA。这些外设都是非常常见的,基本上所有的ARM芯片都会有。上述外设的学习可以不分先后,但还是推荐按照上面的顺序进行。

除此之外,还要学会使用一款开发工具链(推荐Keil,毕竟是ARM公司的)。能够掌握基本的Keil使用方法就行了。比如多文件编译、调试仿真、常见配置等。

学习完基本的外设之后,就可以动手写一些简单的项目,巩固所学知识。后面我也会出一些文章,讲解项目的思路,供大家学习。

2.2 stm32进阶

以目前的招聘需求而言,学完基本的stm32内容已经无法满足了(太卷了)。因此,需要开始往较深入的内容学习。这里我将进阶路线分为如下两条主线:软件主线、硬件主线。

2.2.1 软件主线

1. C语言:继续往精通方向学习C语言,比如,C语言的高级用法,C语言是如何实现面向对象思想的,C语言代码是如何控制硬件的,C语言代码是如何使用内存的、代码是如何在内存中布局的,C语言代码是如何在芯片中执行的,这些问题都是需要深入研究的。除此之外,也应该学习下常见的数据结构,如链表、树等。至于图这种数据结构,太复杂的,别为难自己。

2. RTOS:除此之外,还要学习RTOS(推荐FreeRTOS,背靠亚马逊,用的人多,资料也多,市场广阔),并且应该往深入的地方学习RTOS,而不应该仅仅浮于表面。知道使用FreeRTOS怎么创建任务、信号量、互斥量、队列等,这些只是表面,内部实现的原理和机制才是面试要考察的(毕竟所有的RTOS都类似,掌握了原理才能很快上手其他的RTOS)。而且这些原理性的知识是通用的,也是一个嵌入式工程师的内功,面试考察的就是内功。我们还可以借鉴一下FreeRTOS源码中优秀的设计思想,用到我们的代码中,一举多得。

3. 中间件:有精力的话,可以学习一些常见中间件的使用,如emwin(写GUI界面用到,或者LVGL也可)、Fatfs(文件系统,管理数据用的到)、Lwip(网络协议栈,以太网通信用的到),这些中间件以会用为学习目的和标准,不需要深入研究,除非以后做这方面的工作。

2.2.2 硬件主线

stm32芯片的基本外设学完之后,我们还需要学习复杂的外设和芯片内部的一些内容。下面的图,建议大家背下来,这是在学习的过程中画的stm32芯片内部功能逻辑图,具有普遍意义(针对Cortex-M系列芯片)

我们学习的常见外设,只是挂载到总线(AHB、APB总线)上的一个个独立的功能单元,CPU(图中Cortex-M3就是芯片内部的CPU)如何与外设进行交互、芯片的调试系统、中断系统、总线系统等等,还有非常多的内容需要我们学习。

在学习stm32的时候,我们会遇到一些比较复杂的外设,这里面时钟系统(RCC)还是要学习的,RCC就相当于芯片的动力系统,连接着芯片内部的各个功能部件。除此之外,RTC(实时时钟)、CRC(循环冗余校验)、CRYP(加密处理器)、RNG(随机数发生器)、HASH(散列处理器)等外设看心情学习。但比较复杂的,如USB、以太网、FSMC(灵活的静态存储控制器)、SDIO(安全数字输入/输出接口)、DCMI(数字摄像头接口)这些复杂的外设,就不太建议学习了,可以了解下,不需要进行深入研究(学习成本高,真正用到了,学的那点也不够,导致性价比太低)。如果以后想专精某一个方面,可以去学习。CAN总线用于汽车领域,如果不打算从事汽车领域工作的话,可以不用学习。stm32f407芯片的外设就这么多,都在上面讲述了,各位同学根据自己的需求进行学习。

除了外设之外,M4内核还支持DSP指令集,这个用于对数学运算、控制运算、信号处理、数据处理等方面,也可以学习下如何使用。对DSP指令集的学习,只需要学习该如何使用DSP库即可,库里面的算法都是使用DSP指令集进行加速过的,我们只需要会用就行。

学习完上面的内容之后,也可以研究下CPU部分,如常见的堆、栈、流水线、寄存器、CPU现场等相关内容,这些在学习FreeRTOS时用得到,也是面试中常问的内容。

在软件主线、硬件主线之间,还有一个就是工具链,主要是编译器在链接期间的部分知识。这部分内容,也是我们经常用到的一些技能,如进行IAP开发、OTA开发等,还有一些特殊用途,也需要对链接阶段进行改动,以满足应用需求。

这里推荐几本书:《Cortex-M3权威指南》、《STM32F4xx参考手册》配合起来一起学习。

2.3 学习顺序(重要,小白跟着做即可)

1. 入门:首先要有C语言的基础(能用基本的语法编写程序即可),接着开始学习stm32的基本外设(常见的外设,上文中有提到)。这个时候可以做一些简单的项目,巩固下学习效果,学习stm32的核心原则之一就是多动手写代码。这里推荐江科大的视频(B站有),市面上少有的精品、免费视频了。收费的基础课,我觉得都很难与其进行比较,看得出来,江科大的视频是用心做的,强烈安利~。

2. 提高:这个时候需要提高C语言(推荐的书都去看看,研读一遍),先把C语言水平提上来,否则后续学习会因为缺少C语言基础而非常痛苦。之后,再去学习FreeRTOS,或者也可以先去学习stm内核部分,这两个先后顺序其实无所谓的(反正对新手来说都是新知识,都不简单^^),二者有些东西也是相辅相成的。

3. 这个时候应该做一些有难度的项目,将自己学习的内容、技术体现在项目中,用于找工作。

学习到这里的话,基本上找工作已经没啥太大问题了。

全网最受欢迎的嵌入式面经

面经一共32篇文章,12w+字数,包含全部最新的面试必问考点,4.7w+同学学习,2800+订阅,非常适合在找工作面经薄弱的同学,3000+订阅还会涨价,提前订阅提前享受,持续更新中。

原帖链接:https://www.nowcoder.com/creation/manager/columnDetail/MJNwoMc

全部评论

相关推荐

经常看见粉丝朋友问在哪里才能找到不烂大街的项目,今天笔者来分享一下如何寻找。以下为个人看法,仅供参考。一、b站b站大学里边有许多项目,可以按照关键词搜索。如搜mcu   rtos项目;不过个人觉得能写在简历上的项目很少,很多智能家居和小车,因此不太建议去该平台寻找。二、Github作为全球最大的开源社区,github里边的开源项目丰富且质量较高。大家可以在里边搜寻开源项目进行复现,但大多数人不知道怎么进行检索,可以按照如下方式:输入"in: description stm32 language: stars:>100 pushed:>2020-12-01”。按照上述方式,可以检索出描述里有stm32,编程语言为c语言,收藏数>100并且更新日期在2020 年12月份之后的项目,这样就能大大提高检索效率。但github上边项目缺点是复现难度大,难度在于开发文档不详细、代码难度高等;同时,大多数好的项目需要实现一个真正的产品,因此通常需要机械结构知识,进行实体制造,外壳封装等,这会导致复现周期加长且需要学习机械或者3D打印知识。因此,可以综合考虑以上因素,在github上选择适合你自己的项目。三、由企业举办的公开赛事官网或课题组项目这些官网里边通常会出现企业命题,会告诉你要做出一个什么东西,会有一个比较宽泛的需求给到你。这些需求说不定就会给你创造出做项目的灵感。课题组项目是可遇不可求的,如果感觉课题组项目和你以后想去的行业方向比较接近,那你就可以将你的课题组项目与你想去的行业多结合起来形成一个新项目,并实现出来,拿去写简历,这也是很不错的。四、复现身边的“老古董”和跨界融合逛逛电子垃圾市场或拆解旧设备(比如说复现且升级改造一个微波炉),逆向工程其硬件和部分功能,尝试用现代微控制器复现或升级改造,这本身就是个极具挑战且独一无二的项目。也可以把嵌入式技术和非传统领域结合,比如用嵌入式系统做艺术装置交互控制、结合生物传感器做健康监测小设备、或者给传统乐器加装智能反馈系统。五、咸鱼及小红书必要的时候,也可以选择知识付费。不过在筛选项目的时候需要考虑以下几点:这个项目是否烂大街、技术栈涉及哪些、有哪些亮点、能否复现成功、开发文档是否详细、是否提供教程和工程源码、电路原理图、接线图等等。总之一句话:需要确定是否能满足你自己的需求,这一点很重要!六、实习个人觉得实习是最优解。如果你能看到公司的产品,尽量把它复现出来,哪怕简单一点。并且也可以写成自己的实习经历(哪怕没能做出来也要会吹,且写在简历上),增加优势。如果实在没能实习,则按照前边讲解的几种方法寻找项目。最后,如果有需要《STM32➕RTOS项目》、《嵌入式八股文合集》及《Freertos开发手册》等资料,也可以私信笔者获取。
简历中的项目经历要怎么写
点赞 评论 收藏
分享
一、学习方向选择以下仅代表笔者个人看法:嵌入式软件总体分为linux和mcu方向。这两个方向的应用场景不同,导致无法在同一份工作中既做Linux,又做mcu。因此,如果在时间不充裕的情况下,大家根据自身情况挑一个方向去学习就够了。mcu方向(也称为嵌入式软硬件方向)更专注于软硬件结合,也就是说除了软件部分之外,还需要懂硬件。如果在软件和硬件分的没那么开的公司,作为一名嵌入式软件工程师,不仅要自己写代码,还需要自己画原理图,画PCB。在软硬件分开的情况下,基本要求是要能看的懂电路原理图,这也是大多数转行者很容易忽视的点。linux方向由于岗位较少,通常需要驱动/内核/应用一起做,仅有部分公司或者原厂才会放出单一的岗位出来,如单独的linux驱动岗位,内核/应用岗位等,这个方向比较偏软件一点。但由于岗位较少,门槛也就稍微高一些。二、mcu方向学习路线0基础的同学建议按照步骤走(再次重申是个人看法,如果你觉得不对,就不要看下去了):1、掌握基本电路知识,重点主要为电容、电感及滤波电路,还有一个傅立叶变换(可以看刘陈版本的电路分析基础这本书或者是b站进行学习)2、模电(主要掌握二极管、稳压管、三极管、mos管、放大电路、运算放大器、反馈电路);笔者个人推荐的书籍是黄丽亚的第三版模拟电子技术基础,学完前7章就够了。当然,也可以选择其他版本的,看个人喜好。3、数电(主要掌握进制转换,反码补码、逻辑电路、触发器、寄存器、AD转换及存储器知识),推荐书籍为华中科技大学的电子技术基础(数字部分)。上述三步就是为了打牢硬件基础,能看懂电路原理图。4、接下来学习一款EDA工具的使用,不要再去学嘉立创了!企业里边只有三大EDA工具:Altium Designer/Candence/Pads,任意挑一个去学习。个人比较推荐学习AD,可以在b站上看凡亿教育的课程进行学习。5、学习C语言,个人还是推荐谭浩强红色的那本高校书籍,当然也有其他优秀课程,大家可以自行选择。C语言的学习是一个持续加深的过程,前期先掌握基础就行,需要学习的是前1-7章,第8章的指针变量/数组指针,第9章的结构体/共用体/枚举/typedef。6、学习stm32,不要再浪费时间去学51老古董了。个人推荐正点原子,资料很充足,按照资料学基本就够了。同时一定要学标准库,前期不要把精力浪费在学hal库上,hal库等后边自己看一下就行。学习方法是买一款开发板(F1/F4都可以),跟着资料一步一步学,掌握基本常用外设如串口/GPIO/定时器/中断/PWM/输入捕获/LCD/ADC/IIC/SPI/485/CAN/IAP等。ps:学习过程中不要只看,一定要做!看懂了不等于你掌握了,毕竟实践是检验真理的唯一标准!7、做完上述步骤,恭喜你已经打好基础了,进一步继续深入学习c语言的提高部分,把前边说的第8章的二维指针/数组指针/指针数组等等指针的高阶用法掌握,以及动态内存分配函数等;还有第9章的链表;此处笔者推荐看人民出版社的c和指针一书,进行c语言的加深学习。这本书需要掌握如编译的底层原理/指针的高阶用法/递归函数/单向或者双向链表/预处理器等。8、完成c语言的进阶学习之后,开始学习stm32内核,这里推荐看CM3权威指南这本资料,主要看前9章内容,至少要知道寄存器组/PendSV/SVC/systick定时器等,为学习RTOS打好基础。9、开始学习RTOS,自行挑选一款rtos进行学习(ucos/freertos/rt-thread),笔者是同时学了ucos和free,个人比较推荐从ucos学起(也是正点原子的资料),毕竟资料比较多,底层原理讲的比较细,比如任哲老师的嵌入式实时操作系统原理及应用就是以ucosii进行讲解的。当然大家也可以选择其他的,这个阶段建议还是多看资料,少看课。因此笔者并没有什么推荐的课程。ps:到这一步要开始做32和rtos的项目了,做完项目以后就可以去投实习/秋招,这个程度已经够找工作了。10、学习常用数据结构:数组/堆/栈/链表/树/哈希表/队列,图不要求掌握,树学二叉搜索树就够,在弄清楚基本数据结构以后再去力扣上进行刷题,比如要知道栈不仅可以用数组实现,还可以用链表实现。ps:这一步想进大厂必不可少,毕竟面试都是要手撕的!11、学习RTOS源码,弄清楚任务调度/任务通信/时钟及延时/内存管理等。为什么要先去学习数据结构再回来看rtos源码,就是因为其源码中包含大量链表和队列的使用,如freertos中列表与列表项中涉及到双向链表的插入和删除操作,这样才能看得懂源码。ps:到这一步已经够卷了,笔者觉得不用担心找不到工作了。接下来说的东西可以入职以后再进行学习12、其他通用中间件的学习,如网络协议(mqtt/lwip协议等),选一个进行学习。还有图形库lvgl/ewmin等,也是选择一个进行学习。学习方法也是找资料,我依然用的是正点原子。13、学习代码版本管理工具git的使用,需要掌握常用命令,如克隆,提交,上传以及创建分支等。学习方法笔者推荐是看官网。三、linux方向学习路线linux方向笔者还在摸索中,因此就简单说一下1、先学会使用linux系统,学会Linux基本命令使用,学习方法推荐b站尚硅谷。2、学习gcc、make工具链的使用及makefile脚本。3、学习c++,主要掌握面向对象特性,如类和对象/继承/重载/多态/封装/虚函数/智能指针/动态内存等。推荐书籍为c++ primer第五版以及菜鸟编程网站。4、Linux应用编程,如进程/线程、文件io、网络编程等。推荐资料--正点原子。5、学习QT开发,推荐资料正点原子。6、Linux下的裸机开发(推荐买板子学习,如imx6ull;掌握常用外设以及CortexA处理器架构),推荐资料--正点原子或者韦东山。ps:学习linux驱动需要有电路原理图能力。7、Linux驱动开发(结束裸奔,上操作系统了, 包括移植uboot/linux内核/根文件系统等、掌握Linux三大类驱动,包括字符设备/块设备/网络设备驱动),同时需要掌握GDB调试。可以看到嵌入式两个方向的内容都非常多,因此大家选一个学,找工作足够了。本次讲解就到这里,感谢观看!
点赞 评论 收藏
分享
评论
4
10
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务