【毕业季

2023-10-27

活动地址:毕业季·进击的技术er

仅以此篇,送给刚毕业的你,望你前程似锦,未来道路一片光明。

 

0、作者介绍

我是一名嵌入式工程师,毕业近三年,回想毕业典礼,依稀还在昨日。

从毕业刚入世界500强企业,到弄明白心之所向,投身于热爱的领域,耗费了太多的时间与经历,今天我想以不一样的视角,带你去探索嵌入式技术er如何在技术领域快速成长
 
人们常说:“人生就是一场场游戏,我们要做的,就是打怪,升级,通关”,学习嵌入式的过程也是如此。

查看源图像

1、前言

最近在CSDN上看到,好多人发布毕业季的话题,借此机会,也想着重新审视一下自己的学习历程,以及结合自身和大牛,分享一些学习经验,希望对大家有所启发和帮助。

本文主要目的是为了

  • 提供一张嵌入式学习路线地图
  • 提供不同阶段的学习建议
  • 推荐不同阶段的学习资料

3000余字,耗时1周,建议收藏;码字不易,如有帮助,慷慨三连

 

本文将嵌入式学习路线分为几个方面

  • 嵌入式基础必备知识
  • 51单片机
  • STM32单片机
  • 小而美的RTOS
  • ARM+LINUX

在这个快节奏的时代,能静下心,耐住性子看看文章,实属不易。

 

2、嵌入式基础必备知识

查看源图像

老子曰:“合抱之木,生于毫末:九层之台,起于垒土;千里之行,始于足下”,根基的重要性不言而喻。

那么对于嵌入式这条路线而言,如何建立一个稳固的根基?

 

2.1、学习内容

image-20220618093005641

  • C语言基础

该部分,主要包括几个核心知识点:三大语法结构常用的数据类型函数结构体指针文件操作等。

  • 硬件基础知识

该部分,核心知识点在于:电路基础知识数电模电基础知识常用的电子元器件等。

  • 数据结构

核心知识点:数组队列链表堆栈散列表等。

  • 操作系统

核心知识点:进程管理内存管理文件管理输入输出管理等。

  • 计算机原理

核心知识点:数据表示和运算存储系统指令系统总线系统中央处理器输入输出系统等。

 

2.2、学习建议

  • 对于C语言基础学习,一定要重点熟练掌握,根基的牢固直接决定了我们的代码质量。
  • 对于硬件基础学习,要适当了解,要能够看懂一些简单的电路结构,认识常用的电子元器件。
  • 对于数据结构学习,前五个是必备学习的,可能在刚开始学习的时候,可能会感觉不到作用在哪里,但是随着接触到嵌入式底层设计以及算法设计的时候,才会恍然大悟。
  • 对于操作系统学习,重点学习其思想,对相关知识点有一个大概的了解,后续接触到继续重点学习,这些无论是RTOS,还是Linux,都有涉及到的。
  • 对于计算机原理学习,可以将其看作是嵌入式系统的各个模块的详解,会让你对嵌入式有一个整体的了解,每一个部分都值得深究。

 

2.3、学习资料

  • C语言基础:推荐经典书籍**《C语言程序设计》(第2版)谭浩强版本**。
  • 硬件基础:大学里面的《数电模电》书籍所涉及的知识即可。
  • 数据结构:推荐经典书籍**《数据结构》——严蔚敏版**。
  • 操作系统、计算机原理:我用的是**《王道》的系列丛书**,个人感觉不错。

计算机组成、数据结构、操作系统、数据库是嵌入式或者说计算机的入门必读书籍,并且也被列入高校教材内,是真正的基础知识。

 

以上,不一定是全部看完才能体验编程的乐趣,这个基础是一个循序渐进的过程,也不是一朝一夕就能完成的,可以先有一个大概,后续做项目时,哪里不懂补哪里!

这里涉及到一个重要的学习方法:项目导向的学习法

 

3、嵌入式入门篇——51单片机

image-20220618091321192

在上面的基础知识进行熟悉之后(C语言基础、计算机组成、硬件基础必备),我们准备叩开嵌入式世界的大门。

入门篇,依旧推荐51单片机,当然有人会说,直接上STM32岂不更好?

我的看法:建议新手还是以51单片机来入门,因为STM32体系架构比51大很多,对于新手刚开始可能会不太容易适应。

 

3.1、学习内容

image-20220618093041553

该部分,主要在最小嵌入式系统中,实现各种有趣的实验。通过51单片机的学习,我们要做到:

  • 软件类

主要知识点有:认识单片机熟悉逻辑运算点亮一颗LED灯按键检测串口通信定时器中断等。

  • 硬件类

主要知识点有:电阻元器件了解基本模块电路了解时钟电路尝试绘制51单片机原理图和PCB

 

3.2、学习建议

  • 对于软件类,我们主要做到:认识单片机,熟悉单片机的GPIO的输入、输出操作,串口通信协议掌握等,这些部分都是任何一款嵌入式设备的必备技能
  • 对于硬件类:我们主要做到:能看懂电路图熟悉一些简单模块的设计电路,了解Altium Designer的使用方法。

 

3.3、学习资料

51单片机郭天祥的51单片机教程,经典著作,经久不衰,强烈推荐。

 

庄子说:“水之积也不厚,则其负大舟也无力。“

该部分,是嵌入式领域的基石,只有将基础打牢,才能负得起Linux泰坦号。

 

4、STM32进阶篇

查看源图像

STM32是C51的进阶版,拥有C51的基础知识,开发STM32会得心应手。

STM32的系统架构以及硬件设计相比于C51来说,都是上升了一个维度的,这也是为什么我推荐入门学习C51的原因。

 

STM32F407平台为基础,去学习目前嵌入式主流的一些技术,探寻底层的原理,做到不同平台,都能够得心应手。

 

4.1、学习内容

image-20220618093112817

  • 基础练习

该部分,主要练习:点亮LED灯GPIO的输入输出操作中断操作UART通信IIC通信

  • 进阶练习

该部分,主要练习:DMA通信SPI通信CAN通信LCD显示屏ADC

  • 高阶练习

该部分,主要学习:STM32时钟架构总线架构电源管理代码框架SDIO通信USB通信等。

 

4.2、学习建议

  • 对于基础练习,主要目的是为了方便让我们从C51STM32环境的过渡。
  • 对于进阶练习,主要练习一些通信类相关的协议,可以结合一些传感器进行开发。
  • 对于高阶练习,主要目的是为了熟悉单片机的设计架构,编程的框架,以及一些更复杂的通信技术。

另外,STM32会有寄存器和库函数两个版本,建议交叉学习,理解会更加深刻。

 

4.3、学习资料

STM32单片机:推荐正点原子野火STM32F103或者STM32F407系列。

两家的学习资料都非常丰富,既有详细的文档说明,也有完整的学习视频教程,非常适合新手入门学习。

 

俗话说:“有道无术,术尚可求,有术无道,止于术”。要明白道和术的区别,不要本末倒置

 

5、小而美的RTOS

查看源图像

RTOS,实时操作系统,可以理解为STM32Linux之间的桥梁,由于其实现思想大都取之于Linux,所以也称之为精简版的Linux

我们常用的有实时操作系统有:UCOSVxWorkFreeRtos,近些年RT-Thread也异军突起。

学习这些简单的嵌入式系统,一来能够帮助我们为学习Linux操作系统打下基础,二来也能够扩宽我们的职业道路。

前面也说过了,无论是UCOSFreeRtosRt-thread,其内部的设计思想大同小异,下面主要以Ucos为例。

5.1、学习内容

image-20220618092246693

  • 实时系统学习

该部分,主要学习:移植Ucos系统多任务管理调度算法消息队列信号量互斥量事件内存管理等。

 

5.2、学习建议

  • 对于实时系统学习,除了上述的那些核心知识点外,还要结合2.1 基础必备知识操作系统书籍加深理解。

 

5.3、学习资料

RTOS的学习:依旧推荐正点原子野火,因为这些实时操作系统开发,可以基于STM32开发板,同时也有非常详细的文档和视频教学。

 

6、ARM+Linux篇

查看源图像

学习完RTOS后,基本嵌入式所涉及的技术已经掌握一半了,你也可以独立完成一些小的项目,也可以找到一个不错的工作,但是一定不要自我满足,有机会一定要接触Linux。

还是那句话:ARM+Linux,也是最为复杂的东西,如果你不去接触Linux,你永远不知道嵌入式的魅力。

 

Linux开发又分为驱动开发内核开发应用开发,每一个方向都需要几年甚至几十年的积累。

作为初学者,我们要做的就是宏观了解,扩大我们的知识面,然后去选择自己感兴趣的方面。

6.1、学习内容

image-20220618092751914

  • Linux基础篇

该部分主要学习:Linux常用命令VIM学习Linux的Shell编程Gcc编译Makefile等。

  • 驱动篇

该部分主要学习:内核模块编译原理字符设备驱动框架平台设备驱动设备树Pinctrl子系统I2C子系统中断子系统块设备驱动框架Bootloader

  • 内核篇

该部分主要学习:系统调用存储管理进程管理内存管理文件管理等。

  • 应用篇

该部分主要学习:QT编程TCP/IP协议HTTP协议等。

 

6.2、学习建议

  • 对于基础学习,刚接触到Linux,一般比较难上手,与之前的单片机完全不同,需要一个熟悉环境的过程。
  • 对于驱动学习,重要在于明白“如何在Linux环境下编写驱动程序”,驱动的底层原理还是那样,加了一层层的框架,需要我们去熟悉。
  • 对于内核学习,上述也是系统的几大核心特色,重点在于"如何使Linux性能最优"
  • 对于应用学习,上述的几个方面也是基础,重点还在于开发什么应用,去学习哪方面的知识,没有定论。

对于Linux,有句老话“学习Linux,3年才算入门,5年才勉强算Linux工程师,对于不太熟悉的领域,博主也不敢妄加断言。”

 

6.3、学习资料

  • 对于基础学习,推荐**《鸟哥的Linux私房菜》《Unix环境高级编程》**等入门书籍。
  • 对于驱动开发,推荐**《Linux设备驱动开发详解》**,Linux内核源码详解等。
  • 对于内核学习,推荐**《Linux Shell脚本攻略》《深入理解Linux内核》**等。
  • 对于应用开发,推荐**《嵌入式Linux应用开发完全手册》《Unix网络编程》**等。
  • 另外,推荐正点原子野火韦东山三个Linux开发教程,韦老师的课程好评居多,但还是看哪个更适合自己。

 

7、总结

全文整体的学习路线:嵌入式基础学习 -> 51单片机 -> STM32单片机 -> RTOS篇 -> ARM+Linux

每一个部分,也都从学习内容学习建议学习资料三个方面来展开,层层深入,步步指引。

文章既是我的学习历程,又结合了一些大佬的学习分享,不断调整总结出来的,如有异同,可以讨论。

全文3000余字,耗时1周,如有帮助,望不吝点赞关注。

最后,文章所涉及的学习资料以及整理的思维导图全盘奉上:【Linux学习路线——DonGe

六月的阳光灿烂,分别的泪花闪闪。不必把相聚的誓言宣,深厚的友情记在心间。今日告别,来日再见。同学们,让我们重逢在完美的明天。祝你前程似锦,一帆风顺!

活动地址:毕业季·进击的技术er

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【毕业季 的相关文章

  • 用于 e NetworkManager VPN 连接的 dbus 信号处理程序

    我需要开发一些在建立 VPN 连接时执行的 python 代码 VPN 由 NetworkManager 控制 我试图弄清楚如何为此使用 NM DBUS 事件 使用 dbus monitor system 我能够识别连接信号 signal
  • 如何在 Ubuntu/Linux 发行版中安装 Tesseract-OCR 3.03?

    我和一个朋友有兴趣为 CV 项目训练 tesseract OCR 引擎 我们尝试使用一些包装器 例如 PyTesser 和 pyocr 但结果目前不如我们需要的那么准确 因此 我们希望尝试训练超立方体以更好地实现我们的目的 即识别食品标签上
  • EULA 接受 Bash 脚本

    我有一个尝试安装垃圾箱的脚本 除了 bin 在 more 中打开 EULA 之外 一切正常 在脚本再次开始并自行完成安装之前 您必须手动 ctrl c 退出此 more 实例 因为这更多的是逃离 shell 所以脚本在打开后不知道要运行什么
  • 在 Windows / Linux 中创建 Mac 包

    我自己努力制作一个 r 包 我按照 stackoverflow 中上一个问题的说明进行操作如何为外行开发软件包 http cran r project org bin windows Rtools 以下是我根据上一个问题采取的步骤 在新的
  • 使用 hcitool 扫描低功耗蓝牙?

    当我运行此命令时 BLE 设备扫描仅持续 5 秒 sudo timeout 5s hcitool i hci0 lescan 输出显示在终端屏幕中 但是 当我将输出重定向到文件以保存广告设备的地址时 每次运行该命令时 我都会发现该文件是空的
  • 在Linux中创建可执行文件

    我计划做的一件事是编写 非常简单的 Perl 脚本 并且我希望能够在不从终端显式调用 Perl 的情况下运行它们 我明白 要做到这一点 我需要授予他们执行权限 使用 chmod 执行此操作非常简单 但它似乎也是一个稍微费力的额外步骤 我想要
  • 使用 terminfo 的终端颜色?

    我正在编写一个 C 类 允许在终端中使用颜色 我希望它适用于每个终端 在支持真彩色 24 位 的终端上打印 在支持它的终端上具有 256 色 6x6x6 其他都是基本的 16 种颜色 我曾经使用 termcap 编写过一次 C 函数 并且我
  • 在bash中用其他文件过滤一个文件

    我有一个带有数字的文件 例如 cat file 31038467 32048169 33058564 34088662 35093964 31018168 31138061 31208369 31538163 31798862 和其他例如
  • 如何从 Linux 命令行确定 LCD 显示器是否打开

    如何通过 Linux 命令行判断计算机的显示器是否打开 关闭 我传统上认为显示器是仅输出的设备 但我注意到 Gnome 显示器首选项对话框具有 检测显示器 功能 这可以推广到确定显示器是否物理关闭吗 VESA DDC 连接是I2C http
  • 即使使用 rvm pkg install zlib 后也无法加载此类文件 -- zlib

    我使用 rvm 安装了 zlib 包和 ruby 1 9 3 但是每当我尝试安装时 它说宝石cannot load such file zlib 我用来安装的命令是 rvm install 1 9 3 rvm pkg install zli
  • 我们可以在 Bash 脚本中使用 PHP 吗?

    我有一个 bash 脚本abcd sh bin sh for i in seq 8 do ssh w i uptime ps elf grep httpd wc l free m mpstat done pid sleep 1 kill 9
  • 为什么 RHEL 上的 bash 中 `read -t` 没有超时?

    Why read t在 RHEL5 或 RHEL6 上从管道读取时不会超时 这是我的示例 在从管道读取数据时 我的 RHEL 盒子不会超时 tail f logfile log grep something read t 3 variabl
  • 动态加载库和共享全局符号

    由于我在动态加载的库中观察到全局变量的一些奇怪行为 因此我编写了以下测试 首先我们需要一个静态链接库 头文件test hpp ifndef BASE HPP define BASE HPP include
  • 如何从python导入路径中删除当前目录

    我想使用 Mercurial 存储库hg本身 也就是说 我克隆了 Mercurialhttps www mercurial scm org repo hg https www mercurial scm org repo hg并想运行一些h
  • /usr/bin/as:无法识别的选项“-EL”

    因此 在为我的1plus手机编译android内核时 经过3天的多次尝试 我放弃了并尝试在这里询问是否有人以前遇到过这个问题 这个错误对我来说有点模糊 但我觉得问题来自于我最近对 GNU Linux 发行版 Gentoo 的更改 它在不应该
  • 尝试编译 git 但在 linux 中找不到 libcurl

    我想编译支持 http https 的 git 我有 ls usr include curl curlbuild h curl h curlrules h curlver h easy h mprintf h multi h stdchea
  • 有没有办法改变vim的默认模式

    有谁知道如何更改vim的默认模式 它的默认模式是命令模式 但是我可以将其更改为插入模式吗 只需将以下行添加到您的 vimrc 中 start Vim s default mode will be changed to Insert mode
  • 在 4.x 内核上的 64 位内存中查找系统调用表

    我正在尝试编写一个简单的内核模块来查找 Linux 中的 sys call table 但遇到了一些麻烦 我在这里找到了 32 位 Linux 的基本指南 https memset wordpress com 2011 03 18 sysc
  • bash.sh 运行 cron 的权限被拒绝

    如何在这里使用 bash 脚本运行 cron 我做了如下操作 这里有错误 我想知道如何在 ubuntu 中做到这一点 我现在对它感到震惊 bash sh 文件 bin bash cd var www Controller usr bin p
  • BlueZ D-Bus C,应用 BLE

    我正在尝试编写一个应用程序来搜索附近的蓝牙设备并与它们通信 我的应用程序将用 C 语言编写 并打算在 Linux 下工作 是否有通过 C 中的 D Bus 使用 BlueZ 的教程或示例 此应用程序的目的是从 BLE 中的文件发送数据 你能

随机推荐

  • Spring 的创建和使用

    目录 一 创建 Spring项目 二 存储 Bean 对象到Spring中 1 添加Spring配置文件 2 创建一个 Bean 对象 3 将 Bean 存储到 Spring 容器中 三 从 Spring 中获取并使用 Bean 对象 1
  • flutter Could not get unknown property ‘ndkVersion’

    使用的 flutter 版本为 3 7 2 编译运行 如下 Could not get unknown property ndkVersion for object of type com android build gradle inte
  • QSqlite3创建数据库表格时出现的create error QSqlError(““, ““, ““)

    QSqlite3创建数据库表格时出现的create error QSqlError 这个问题卡了很长时间 连接数据库成功了 但是创建表格时一直失败 通过 qCritical lt lt file lt
  • stm32学习笔记 AFIO重映射功能 以TIM2的CH1可以从PA0挪动到PA15的引脚上距离为例

    首先在STM32F103C8T6引脚定义的图里找到是否有可以复用的引脚 因为我们的TIM2 CH1 ETR的数据是在引脚PA0上显示 如果要换 根据此表只能换到PA15 如图PA15 默认 是调试端口所以如果要想让其作为普通IO口或者复用定
  • Blazor + Ant Design + .NET 5快速开发框架(1) - 项目创建

    目录 序言 模式选择 项目创建 序言 net 5发布至今已经有一段时间了 但是在国内一直不温不火 虽然心里可惜 但是没有什么办法 作为 net开发的一员 只能在前进的道路上留下一笔 这次使用Blazor是微软新出的前端框架 采用c 代替Ja
  • MathType丢失Mplugin.dll文件解决方法

    MathType有着强大的功能 能够进行多种数学符号编辑 所以用来编辑公式确实很方便 但是在对MathType进行安装时也会遇到很多问题 比如Mplugin dll文件缺失 这样就导致了MathType无法正常安装或者使用 具体解决方法如下
  • Linux各类下载方式

    FTP 基于TCP协议的文件存储与下载协议 两个端口 20与21 20端口用于数据的传输 21端口用于身份验证 SCP 是Linux系统下基于ssh协议的远程文件拷贝命令 scp filename username hostname pat
  • python函数的使用

    创建函数 函数名 形参1 形参2 形参n 代码块 函数名必须要符合标识符的规范 可以包含字母 数字 下划线 但是不能以数字开头 函数中保存的代码不会立刻执行 需要调用函数代码才会执行 函数中的参数 在定义函数时 可以在函数名后面的 中定义数
  • 异常值检测——绝对中位差MAD(median absolute deviation )

    文章目录 一 MAD介绍 二 计算MAD方法 三 MAD实现剔除异常值 四 其它检测异常值方法 参考资料 一 MAD介绍 MAD median absolute deviation 绝对中位差 在统计学中 MAD是对单变量数值型数据的样本偏
  • HttpClient4.0 应用二 Post方法传参

    Post方法来得更加直观 有时候 Get请求实在有点长 List
  • text-generation-webui加载chatglm2-6b时,报错,要求set the option trust_remote_code=True

    背景 使用text generation webui加载chatglm2 6b大模型时报错 要求设置option trust remote code True 一开始没注意界面 去翻找配置文件 后来发现 就在Model界面 有一个复选框 可
  • mysql 启动时停止(innodb)

    110406 23 49 40 Note Plugin FEDERATED is disabled 110406 23 49 40 注意 插件federated存储引擎已经禁用 InnoDB The log sequence number
  • JSP整合VUE前序

    对于一个全栈开发工程师来说 懂前端才会开发出更好的后端程序 不懂前端 的后端工程师会设计出非常难用的API 懂后端才会开发出更好的前端程序 程序设计的基本思想在前后端都是通用的 两者并无本质的区别 这和 不想当 厨子的裁缝不是好司机 是一个
  • C++函数参数传递的两种方式:值传递和引用传递(包括整型变量和字符串变量)

    C语言函数参数传递的两种方式 值传递和引用传递 1 值传递 值传递包括实实在在的值传递和指针传递 指针传递参数本质上是值传递的方式 它所传递的是一个地址值 传递的都是实参的一个拷贝 1 1 实实在在的值传递 include
  • -lrt问题,即:shm_open的头文件存在,编译却不通过,提示undefined

    C programming in the UNIX environment的编程手册 一般都会为进程间用共享内存的方法通信提供两组方法 POSIX定义的 int shm open const char name int oflag mode
  • 计算机网络知识点(物理层)

    文章目录 重要内容 2 1 物理层基本概念 2 2 数据通信的基础知识 2 3 物理层下面的传输媒体 2 4 信道复用技术 2 4 1 频分复用 FDM 2 4 2 时分复用 TDM 2 4 3 统计时分复用 STDM 2 4 4 波分复用
  • java中使用分数

    分数是一个不是整数而是由两个数字组成的量 分数有两部分 分子和分母 以 分隔 分数的例子是 15 2 35 6 分数应始终以简化 或最简单 形式表示 其中没有分子和分母的公倍数 例如 56 12 不是它的约数 因为它的分子和分母仍然有公倍数
  • 事件委托订阅与发布

    第一步 客户端 public class Client public string Name get set public void Subscription string guestName Name guestName Server s
  • stm32F4的ADC+DMA+Timer,实现2MHz连续采样。1LSB分辨率,极低噪声。

    1 ADC DMA Timer的实现原理 stm32F407 405的ADC为12位逐次逼近型ADC 有着高达2 4MHz的采样率 分辨率 1LSB 这样参数的ADC放在市面上单卖 也起码是 10 起步 而 stm32F407 405不仅内
  • 【毕业季

    活动地址 毕业季 进击的技术er 文章目录 0 作者介绍 1 前言 2 嵌入式基础必备知识 2 1 学习内容 2 2 学习建议 2 3 学习资料 3 嵌入式入门篇 51单片机 3 1 学习内容 3 2 学习建议 3 3 学习资料 4 STM