嵌入式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系列芯片)

添加图片注释,不超过 140 字(可选)

我们学习的常见外设,只是挂载到总线(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. 这个时候应该做一些有难度的项目,将自己学习的内容、技术体现在项目中,用于找工作。

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

2.4 stm32深入

这部分内容属于较深入的技术了,适合对技术(工资)有追求的同学,需要静下心来,慢慢研究的技术。这些技术都是较深入的,如果连上面的内容(指入门、提高部分)都学不会的话,这些内容还是算了,别为难自己,即学不懂,学了也没啥用(水平不够,用不到)。这里只放一下学习大纲,有兴趣的自己学习。

C语言

添加图片注释,不超过 140 字(可选)

芯片内核

添加图片注释,不超过 140 字(可选)

Keil提高

添加图片注释,不超过 140 字(可选)

FreeRTOS

添加图片注释,不超过 140 字(可选)

2.5学习路线思维导图

在最后,放一个学习路线思维导图,拿着这个,按照上面的知识点,一点点学习,肯定可以成为大佬(30K+)。

添加图片注释,不超过 140 字(可选)

03 浅谈学习方法

学习stm32已经7、8年了,对stm32的学习也有一点心得,这里浅谈下学习方法,仅供参考。

3.1. 挑选一个合适的开发板

作为一个初学者而言,开发板并不是越高端越好,能够有基本的功能、满足自身学习即可(土豪当我没说)。我在第一次学习stm32时,就只买了一个核心板、一个TFT屏幕、一个J-Link下载器就开始学习了(大学的时候真是一个穷学生)。后续的学习过程中,缺什么就买什么,不重要的东西,基本上都没去接触(如can总线、以太网等)。

添加图片注释,不超过 140 字(可选)

添加图片注释,不超过 140 字(可选)

添加图片注释,不超过 140 字(可选)

这里给一个极致低价的stm32学习硬件:一个stm32核心板、一个st-link下载器、一个usb转ttl(用于调试),这一套成本也就30左右(之前推荐过这一套方案,很适合穷学生(比如大学的时候),可以去某宝上找下。

一般而言,比较推荐用stm32f407入门stm32,这个芯片的性能较强、价格也够低、性价比很高,除此之外,资料也很丰富,还可以用标准库开发,某宝上一搜一堆。

3.2 动手实践

嵌入式是工科,工科讲究熟能生巧。在学习的时候一定不能偷懒,一定要多动手写代码。每学习一个外设都应该去动手写代码,将这部分功能的代码调通。每学习一个知识点都应该写代码验证自己的想法是否正确(到今天依然也是这样学习,学习某个知识点之后,写代码验证)。写代码写多了,自然就能理解了。同时也要注意写项目,巩固已经学习的知识,顺带锻炼自己项目整合的能力。

3.3 从浅入深

工科的任何知识学习都应该遵守从浅入深、从看得见摸得着的内容开始学习,逐渐过渡到看不见、摸不着的领域(这个时候只能靠自己的基础,推理到这部分了,然后做实验进行直接、间接验证)。stm32的学习也是,从基本的外设开始,这些最容易看到(改个参数,就能看到现象),然后逐渐过渡到对内核的学习、对工具链、RTOS等一些比较深入领域内容的学习。

04 常见问题解答1

问:学stm32是用hal库学习还是标准库学习?

答:这里首先要明确一个概念,hal库是st公司为自己家的stm32系列芯片开发的一套库,一套库兼容所有的stm32芯片,必然导致代码臃肿(为了兼容性)。标准库是st公司早期为stm32芯片研发的开发库,目前只支持到stm32f429系列,再往后的stm32f7系列就只有hal库了。hal配合cubemx开发,速度飞快,确实有多种优点。

但博主不推荐使用hal库学习,理由如下:

1. hal库是st的,只支持st的芯片,而我们以后开发芯片,不知道是哪家公司的,其他家芯片提供的开发库更类似于标准库(这里可以看出st真是有实力的巨头)。

2. hal和标准库差别不大,但hal学习起来成本更高(为了兼容性,使用了较复杂的软件特性),而且会了标准库,hal上手难度并不大,学习成本基本为0,过度平滑。

3. 最关键的,hal库编译太慢了,真的巨慢,比标准库慢多了,博主当年的笔记本性能也是还可以的,也觉得编译慢,无奈选择标准库开发(再吹一波cubemx,真的开发超快)。

我们从hal库和标准库本身出发,得到初学者更适合学习标准库的结论。所以,作为初学者,别纠结了,无脑标准库吧。当然要是实验室的同学、或者老师、或者小伙伴都是hal库学习,还是拿hal库学习stm32吧,可以更好的交流。

问:学习stm32之前需要先学习51单片机吗?

答:博主本人在刚上大一的时候,就开始玩51单片机了,博主确实是先学51单片机、再去学习stm32。所以我对这个问题还是有发言权的。结论是:没有必要先学习51单片机。因为51和stm32差别太大了,我除了大一玩过51单片机,再也没写过51代码,都已经忘了怎么写了。stm32和51虽然同属MCU,但就跟五菱和劳斯莱斯都属于汽车一样(没别的意思,别乱想,仅仅比较价格而已),二者差别太大了。在51上面学习的内容除了外设原理在stm32上有用之外,基本没啥太大用处了

但这些知识在stm32上同样可以学习,所以大胆的学习stm32吧,现在招聘都要求会一款32位处理器。

05 常见问题解答2

在这一节中,我们简单的聊一聊招聘市场的情况。经济学里面有一个论断:供需关系决定价格。对于我们工程师找工作而言,就是招聘市场上找工作的人与企业招聘人数,二者决定工程师的工资水平。我们工程师找工作靠的是技术水平(能做什么),技术水平的高低(准确的说是稀缺性)决定我们的工资水平。

  1. 3、5k薪资水平:这是绝大部分应届生的水平。这些人大概会一些stm32外设的配置,使用这些外设,配合一些模块(比如屏幕、蓝牙、陀螺仪等等)做一些应用开发,做一些小项目。这种水平的同学,找工作其实比较难(因为大家都类似,企业凭什么要你),这是个很现实的问题。而且这种水平对应的工作也不会太好,一般就是3、5k的样子,市面上一抓一大把。

  2. 7、8k的薪资水平:要想再进一步,就要学习更多的东西,比如RTOS。RTOS是一个非常好的技能点,它是和周围同学、同事拉开差距的一个切点,也是关键点。能够使用RTOS提供的功能,如任务管理、信号量、邮箱、互斥量等,可能还会配上其它的中间件,如LVGL,fatfs等,做一些项目,这种应届生都是比较少的了。相比较前面那些同学,这种应届生更容易找工作,但依然处于初级阶段,依然还是做简单的应用开发,并未涉及较深入的内容。

  3. 10k以上:若是想拿到这种水平的offer,就不能光局限在应用层面了。前面两者都是在应用层打转,并没有涉及较深入的内容。我们需要了解RTOS内部的实现机制、实现算法,stm32内核(IAP是个好东西,非常适合作为深研stm32的切入点)。只有到这个时候,我们才算是开始真正具备走向一个技术大牛应该有的基础。这个水平的嵌入式工程师,有了走向成为技术大牛的可能和基础,已经在技术大牛的起点了。

  4. 20k以上:能在应届生水平拿到20k以上offer的,都是有两把刷子的。以博主本人为例,在2.4节提到的那些技术,博主都有所涉猎,不仅如此,我还在Linux驱动、嵌入式AI领域有所研究。2.4节提到的技术,可以说20K薪资只是起点了,以后30K、50K也可以理解为2.4节技术的深入研究了。

上面只是博主自己的理解,具体情况,各地可能都不一样,不能进行统一比较,也可能说的并不对,仅供参考(希望大家也不要在这里较真,只是参考的数据)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/82052.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

服务器上机用到的设备

服务器上机通常需要以下硬件设备: 服务器主机: CPU:选择高性能的多核处理器,如英特尔至强(Xeon)系列或AMD EPYC系列,以满足高并发和多任务处理需求。 内存(RAM)&#xf…

FreeCAD傻瓜教程-涡轮蜗杆的快速绘制FCGear工作台的使用方法

起因:涡轮蜗轴的组合,是一种比较简单且高效的传动结构。可以实现减速、加速、转动角度的放大、缩小等应用。 如何绘制呢?我搜索了不少教程,看起来都挺复杂的,对于小白来说有点像天书。这里介绍和记录一下利用FreeCAD 的…

daplink开发_一次开发DAPLink的详细开发流程及调试步骤

以下是针对第一次开发DAPLink的详细开发流程及调试步骤,结合STM32平台特性,分阶段指导您完成从零到一的完整开发过程: 一、开发流程1. 硬件准备阶段选型STM32芯片:推荐型号:STM32F103C8T6(成本低、资源足够)、STM32F405RGT6(性能更强,支持更多外设)。关键外设需求:U…

给小白的AI Agent 基本技术点分析与讲解

引言:重塑交互与自动化边界的 AI Agent 在人工智能技术飞速发展的浪潮中,AI Agent(智能体)概念的兴起标志着自动化和人机交互正迈向一个全新的阶段。传统的软件系统通常被设计来执行精确预设的指令序列,它们强大且高效…

Mysql常用语句汇总

Mysql语句分类 DDL: 数据定义语言,用来定义数据库对象(数据库、表、字段)DML: 数据操作语言,用来对数据库表中的数据进行增删改DQL: 数据查询语言,用来查询数据库中表的记录DCL: 数据控制语言,用来创建数据…

【Python 模块】

Python 中的模块(Module)是组织代码的核心方式,通过将相关函数、类和变量封装到独立文件中,实现代码复用和结构化管理。以下是模块的核心知识点: 一、基础概念 1. 模块定义 任何 .py 文件都是一个模块模块名即文件名…

黑电平校正(Black Level Correction, BLC)算法

黑电平校正(Black Level Correction, BLC)算法 黑电平校正(BLC)是图像传感器(如CMOS/CCD)信号处理中的一个重要步骤,主要用于消除传感器暗电流(Dark Current)导致的基线…

处理PostgreSQL数据库事务死锁过程

查询pg_locks表,获取未得到满足的锁信息: select * from pg_locks where granted is false ; --查询得不到锁的,那就是两个互相等待对方持有的锁查询活动的事务会话进程,和上一步的锁的事务对应起来: select * from …

Android开发-文本显示

在Android应用开发中,文本显示是用户界面设计中最基本也是最重要的部分之一。无论是展示欢迎信息、错误提示还是动态内容,合理地使用文本元素能够极大地提升用户体验。本文将详细介绍如何在Android应用中有效地显示文本,包括使用TextView组件…

基于大模型的输卵管妊娠全流程预测与治疗方案研究报告

一、引言 1.1 研究背景与意义 输卵管妊娠作为异位妊娠中最为常见的类型,严重威胁着女性的生殖健康和生命安全。受精卵在输卵管内着床发育,随着胚胎的生长,输卵管无法提供足够的空间和营养支持,极易引发输卵管破裂、大出血等严重并发症,若救治不及时,甚至会导致孕产妇死…

当向量数据库与云计算相遇:AI应用全面提速

如果将AI比作一台高速运转的机器引擎,那么数据便是它的燃料。 然而,存储数据的燃料库--传统数据库,在AI时代的效率瓶颈愈发明显,已经无法满足AI对于数据的全新需求。 因此,向量数据库近年来迅速崛起。向量数据库通过…

Media3 中 Window 的时间相关属性详解

AndroidX Media3 的 Timeline.Window 类中,与时间相关的属性描述了媒体播放窗口(window)在时间维度上的关键信息。这些属性帮助开发者理解媒体的播放范围、起始点、持续时间以及与设备时间或直播流的同步关系。 Timeline.Window 的时间相关属…

【Python爬虫电商数据采集+数据分析】采集电商平台数据信息,并做可视化演示

前言 随着电商平台的兴起,越来越多的人开始在网上购物。而对于电商平台来说,商品信息、价格、评论等数据是非常重要的。因此,抓取电商平台的商品信息、价格、评论等数据成为了一项非常有价值的工作。本文将介绍如何使用Python编写爬虫程序&a…

工业相机的芯片CRA角度与镜头选型的匹配关系

工业相机的芯片CRA角度与镜头选型的匹配关系 Baumer工业相机​工业相机的芯片CRA角度的技术背景​工业相机的芯片CRA的信息CRA相差过大的具体表现怎样选择工业相机sensor的CRABaumer工业相机sensor的CRA工业相机的芯片CRA角度与镜头匹配好的优点 Baumer工业相机 工业相机是常用…

深度学习中常见的矩阵变换函数汇总(持续更新...)

1. 转置操作 (Transpose) 概念:将矩阵的行和列互换应用场景: 在卷积神经网络中转换特征图维度矩阵乘法运算前的维度调整数据预处理过程中的特征重排 原始矩阵 A [[1, 2, 3], 转置后 A^T [[1, 4],[4, 5, 6]] [2, 5],[3, 6]]代码…

day 14 SHAP可视化

一、原理——合作博弈论 SHAP(SHapley Additive exPlanations)是一种用于解释机器学习模型预测结果的方法,它基于合作博弈论中的 Shapley 值概念。Shapley 值最初用于解决合作博弈中的利益分配问题。假设有 n 个参与者共同合作完成一项任务并…

从0开始学习大模型--Day03--Agent规划与记忆

规划(planning) 规划,可以为理解观察和思考。如果用人类来类比,当我们接到一个任务,我们的思维模式可能会像下面这样: 1、首先会思考怎么完成这个任务。 2、然后会审视手头上所拥有的工具,以及如何使用这…

使用 Couchbase Analytics Service 的典型步骤

下面是使用 Couchbase Analytics Service 的典型步骤,包括部署、配置、创建数据集、运行查询以及监控优化等环节。 首先,您需要安装并启用 Analytics 服务;然后将节点加入集群并重平衡;接着在 Analytics 中映射数据服务的集合&am…

从零开始学习人工智能(Python高级教程)Day6-Python3 正则表达式

一、Python3 正则表达式 正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。 在 Python 中,使用 re 模块来处理正则表达式。 re 模块提供了一组函数,允许你在字符串中进行模式匹配、搜索和替换操作。 r…

MATLAB导出和导入Excel文件表格数据并处理

20250507 1.MATLAB使用table函数和writetable函数将数据导出Excel表格文件 我们以高斯函数为例子,高斯函数在数学和工程领域有着广泛的应用,它的一般形式为: 其中是均值,决定了函数的中心位置; 是标准差,决…