详解从0开始的嵌入式学习路线,学什么、怎么学?

2023-11-06

嵌入式是个大筐,什么都可以往里面装,电子、机械、计算机、自动化、测控、通信、物联网……很多很多专业都和嵌入式沾边,硬件、驱动、操作系统、网络、应用、算法……很多同学越学越迷糊,越学越感觉什么也不会。

首先要记住一句话,嵌入式学习奥义:先观其广,再究其深

然后今天给大家捋一捋,一个嵌入式工程师从0开始,到底该学什么,怎么学。

参考资料:

嵌入式基础、C语言技巧、各类协议、ARM等各种知识分类整理均在大叔的嵌入式小站:

详解从0开始的嵌入式学习路线,学什么、怎么学?

1. 基础课打底

高数、英语、计算机基础,C语言程序设计……,这些基础课都是很重要的课,不要因为它们是基础课就忽视其重要性。

基础好了之后学进阶的知识才会厚积薄发,才会游刃有余。这些基础课就像是的内功,内功不行,根本就发挥不出精妙的招式,同样内功深厚,学什么都快。

我重点提几项特别需要重视的基础课:

1. 英语  大多数技术文档、官方资料都是英文的,甚至只有英文版,英语学好了,受益终身。口语不是特别重要,我建议直接搜一本Datasheet,开始啃,不管理不理解,先啃单词。推荐S2C2440的Datasheet

2. 高数  算法以及控制等都对数学上有要求,如果以后想做跟算法和控制相关的,必须好好学,如果不是也至少得及格。

3. 数电 模电 很多同学会想,我不搞硬件,我只搞软件。但是其实嵌入式这行没有办法完完全全避开硬件,即使你做软件、驱动、上层应用,也得了解基本的电路知识,不然硬件同事给你的电路图你都看不懂,根本无法沟通,对于想成为嵌入式硬件工程师的那就得好好学,多实践,自己搭建、仿真、做出实际电路练手。

2. C语言能力非常重要

C语言能力是一个嵌入式工程师最最基础的能力之一,可以说是整个嵌入式的地基(就算成为嵌入式硬件工程师,也必须有一定的C语言能力)。

地基打好了,才有上层建筑。学到什么程度?

最低条件:要对指针特别清楚、数据结构和算法:软件方向要好好学,其他方向必须过一遍。

推荐书籍

  1. The C programming language 《C程序设计语言》
  2. Pointers on C 《C和指针》
  3. C traps and pitfalls 《C陷阱与缺陷》
  4. Expert C Lanuage 《专家C编程》

没必要全看,重在实践。

嵌入式硬件的路线其实非常明白,学各种电子知识、各类电路设计、PCB、电磁兼容……我就不赘述了,下面主要讲嵌入式软件该学什么。

3. 单片机

学完C语言,就可以学单片机了。

先学51,你把基础课学好,就会发现51很简单。

1. 要有个开发板,学串口、中断、定时器、GPIO

2.买一些小模块,LCD显示屏、红外、舵机、超声波

3.自己搭建一下单片机最小系统

做个贪吃蛇、调温、测距什么的小东西,要多实践,多练手,51单片机开发板、教程都是大同小异,就不推荐了。

再学STM32

32裸机中的一部分和51是差不多的,比如串口、中断、定时器、GPIO,原理几乎一样,

32多了一些IIC、SPI、DMA等知识.推荐买个网上的开发板、野火、正点原子等,其实哪家都差不多,并且附带的资料也很全,也差不多。

再学实时操作系统,像ucos,freeRTOS等。

实时操作系统相比linux而言还是一个比较小、比较简单的操作系统,适合作为你入门操作系统的起点。

你可以通过它学习一下操作系统的知识,思考使用操作系统相对于裸机的优点,是不是更方便更有效率了。它里面的任务调度,信号邮箱的通信,中断、优先级的设计等等,基本是所有操作系统共有的特点。

了解它们实现的原理,对你后续linux的学习是很有好处的,跳过其实也行,不建议跳过。

4. ARM+Linux

了解ARM架构、ARM指令集,适当背一背知识点。推荐:《ARM体系结构与编程》杜春雷着

此时应当重点提高,拿到一款芯片和Datasheet,脱离例程,从0开始驱动一些基本模块的能力。

Linux系统

了解Linux常用命令,会一些基本的操作就行了,不需要太深入的学习每一个命令,用到的时候会去搜索就行了,推荐《鸟哥的Linux私房菜》

Makefile

了解它的基本规则,会用Makefile就可以。不需要深入研究那些make函数,因为在工作中有现成的,看得懂就行,很偶尔才需要自己去编写一套Makefile。这个搜搜资料就能学会。

ARM裸机驱动

自己编写一下启动代码、Makefile、硬件初始化。不想成为嵌入式驱动开发也必须好好学LED、按键、中断、UART等特别常见的基础驱动。

Linux内核与驱动

u-boot的移植,linux内核的移植,根文件系统的制作、linux下的基本驱动。推荐B站上韦东山老师的视频课程(非广告),韦老师讲课很到位,很详细。

u-boot的主要功能就是:启动内核。它涉及:读取内核到内存、设置启动参数、启动内核。工作中要么不改,要么小改,除非特殊方向。

u-boot的移植,linux内核的移植,根文件系统的制作,会就行,工作以后根据工作需求,再深入

linux下的基本驱动:比如先自己写一个led灯的驱动,试试驱动的安装和卸载这些流程,然后写一写复杂点的串口的驱动,移植一些复杂点的,比如网卡驱动、LCD屏的驱动等。

按照早期驱动模型平台设备驱动设备树的使用,把简单驱动过一下

会字符设备驱动其实就已经具备找工作的能力了。

在学习驱动过程中,你会越来越多的接触到内核。这时候免不了学点内核调试技术了,比如中断子系统、内核休眠与内核定时器,异步通知,内核同步机制等。

这是一个边实践,边学习的过程,初期目标也是会,不要太深入。

Linux应用

是否深入,跟你以后的工作有关,工作再深入不迟,但一些基本的应用开发编写能力是必要的:

  1. 基本设备的访问,比如LCD、输入设备
  2. 进程、线程、进程通信、线程同步与互斥
  3. 休眠-唤醒、POLL机制、信号
  4. 网络编程

5. C++和QT

这部分对于决心做驱动的同学是没必要的,对于决心做软件、嵌入式应用开发,还是需要学一学的。

这部分也没什么好深入讲的,C学得好学C++就很快,主要理解封装、继承、多态等面向对象特性,QT可以理解为C++的图形库。

学习C++和QT的话,推荐B站上黑马程序员的课程(非广告),讲得非常好。

6. 结尾

嵌入式实在是太杂了,人的精力是有限的,一定要记住我开头说的那句话,先观其广,再究其深。

你的深度是在实际工作中,根据工作具体方向不断深入的。

如果是学生,在校期间踏实学习,多动手实践,多参加蓝桥杯、电赛等比赛,结识同伴、锻炼技术、增加简历,一举多得。

如果是转行至嵌入式,要保持热爱,耐得住学习的寂寞。

嵌入式这行,越干越觉得自己会的东西好少,越干越深入,这也是为什么这行并不存在35岁危机的原因,只要你脚踏实地,随着时间的积累,自身价值愈发提升。

最后助大家学有所成,升职加薪。

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

详解从0开始的嵌入式学习路线,学什么、怎么学? 的相关文章

  • arm64 汇编:LDP 与 LD4 执行时间

    假设我想用连续内存位置的值加载四个连续的 aarch64 向量寄存器 一种方法是 ldp q0 q1 x0 ldp q2 q3 x0 32 根据ARM优化指南 https static docs arm com uan0016 a cort
  • 嵌入式 C++ (ARM9) 单元测试

    我来自 Java 和 JUnit 的世界 我演示了 Hudson 以及我使用 JUnit 取得的所有成果 我想在嵌入式设备上对 C 代码执行相同的操作 但找不到从哪里开始 该项目使用 iccarm exe IAR 编译器 进行编译 现在使用
  • 适用于arm(cortex-m3)的位置独立可执行文件(-pie)

    我正在使用codesourcery g lite 基于gcc4 7 2版本 为stm32 Cortex m3 编程 我希望动态加载可执行文件 我知道我有两个选择 1 可重定位的elf 需要一个elf解析器 2 具有全局偏移寄存器的位置无关代
  • ARM Neon:如何从 uint8x16_t 转换为 uint8x8x2_t?

    我最近发现了关于vreinterpret q dsttype src类型转换运算符 https stackoverflow com a 43519190 2436175 但是 这似乎不支持所描述的数据类型的转换这个链接 http infoc
  • 使用 ARM NEON 内在函数添加 alpha 和排列

    我正在开发一个 iOS 应用程序 需要相当快地将图像从 RGB gt BGRA 转换 如果可能的话 我想使用 NEON 内在函数 有没有比简单分配组件更快的方法 void neonPermuteRGBtoBGRA unsigned char
  • 在 ARM 处理器上执行存储在外部 SPI 闪存中的程序

    我有一个 ARM 处理器 能够与外部闪存芯片连接 写入芯片的是为 ARM 架构编译的程序 可供执行 我需要知道如何将这些数据从外部闪存获取到 ARM 处理器上以供执行 我可以提前运行某种复制例程 将数据复制到可执行内存空间吗 我想我可以 但
  • 小型 ARM 微控制器的 RTOS 内核之间的可量化差异 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 有许多不同的 RTOS 可用于微控制器 我专门寻找支持 ARM Cortex M 处理器的 RTOS 另外 我对闭源解决方案不感兴趣 试图从网站
  • ARM Cortex A8 PMNC 读取在启用后也给出 0.. 有什么想法/建议吗?

    MODULE LICENSE GPL MODULE DESCRIPTION user mode access to performance registers int init arm init void unsigned int valu
  • C 嵌入式应用程序中 time() 函数的问题

    我在用time 在 ARM 微控制器上 处理器一到达此函数就会重新启动 奇怪的是 当我处于调试模式时 代码运行得很好 但一旦我想将其应用到独立模式 我就会遇到重置 我是否忽略了什么 这个功能有替代品吗 代码部分是这样的 include
  • 为 ARM 交叉编译 zlib

    我尝试为arm poky linux gnueabi交叉编译zlib 但启动 make 时出现错误 zlib 1 2 11 AR HOST ar CC HOST gcc RANLIB HOST ranlib configure prefix
  • M1 MacBook Pro 上的 Android Studio 无法使用 ABI armeabi-v7a 模拟系统映像

    我的 M1 Macbook Pro 上的 Android Studio 可以很好地模拟 ABI arm64 v8a 的所有系统映像 API 24 29 30 31 但是 它无法使用 ABI armeabi v7a 运行所有映像 例如 API
  • 基于 Windows 8 ARM 的平板电脑上的 VB6

    随着 Windows 8 将支持 VB6 我的问题是 Microsoft 是否在任何地方表示 是或否 VB6 应用程序将在基于 ARM 的平板电脑上运行 如果没有 是否有任何 ARM 模拟器 以便我们可以在 Windows 8 ARM 平板
  • ARM 系统调用的接口是什么?它在 Linux 内核中的何处定义?

    我读过有关 Linux 中的系统调用的内容 并且到处都给出了有关 x86 架构的描述 0x80中断和SYSENTER 但我无法追踪 ARM 架构中系统调用的文件和进程 任何人都可以帮忙吗 我知道的几个相关文件是 arch arm kerne
  • 使用 NEON 优化 Cortex-A8 颜色转换

    我目前正在执行颜色转换例程 以便从 YUY2 转换为 NV12 我有一个相当快的函数 但没有我预期的那么快 主要是由于缓存未命中 void convert hd uint8 t orig uint8 t result uint32 t wi
  • 直接在 ARM 目标上调试单声道应用程序

    我最近在 BeagleBone 嵌入式 ARM 设备上安装了 Mono 希望通过 USB 连接 Kinnect 传感器并使用 C Mono 控制它 我想知道 Mono 我正在使用 MonoDevelop 但我想这个问题也适用于 VS 是否允
  • iPhone 3GS 上的 ARM 与 Thumb 性能比较,非浮点代码

    我想知道是否有人有关于 iPhone 3GS 上 ARM 与 Thumb 代码性能的硬性数据 特别是对于非浮点 VFP 或 NEON 代码 我知道 Thumb 模式下的浮点性能问题 更大的 ARM 指令的额外代码大小是否会在某个时刻成为性能
  • 什么是遗留中断?

    我正在开发一个项目 试图弄清楚 ARM 架构的全局中断控制器中如何处理中断 我正在使用 pl390 中断控制器 我看到有一条线被称为传统中断 它绕过了分配器逻辑 假设有 2 个中断可以被编程为传统中断 任何人都可以帮助解释一下什么是遗留中断
  • stm32l0: 执行MI命令失败。使用 vFlashErase 数据包擦除闪存时出错

    我正在使用 Nucleo STM32L031 和 AC6 STM32 工作台 eclipse 我编写应用程序并进入调试模式 一切正常 直到我在应用程序中添加另一个功能 我注意到当我删除 评论 新函数 软件可以再次进入调试模式 但是当我添加
  • 为arm构建WebRTC

    我想为我的带有arm926ej s处理器的小机器构建webrtc 安装 depot tools 后 我执行了以下步骤 gclient config http webrtc googlecode com svn trunk gclient s
  • ARM NEON 矢量化失败

    我想在 ARM cortex a9 上启用 NEON 矢量化 但在编译时得到以下输出 未矢量化 不支持相关 stmt D 14140 82 D 14143 77 D 14141 81 这是我的循环 void my mul float32 t

随机推荐

  • Ubuntu安装Android Studio和SVN配置

    Ubuntu安装Android Studio和SVN配置 Java jdk的配置 在 home hongzhen 目录下新增Java目录 下载Java的Linux包 放到 home hongzhen Java目录下 执行tar zxvf j
  • unity有限状态机和模糊状态机(怪物AI、自动寻路)

    自动寻路步骤 1 把场景中不同的物体勾选static 2 烘培寻路网格 3 添加NavMeshAgent组件 4 给需要寻路的物体添加脚本 游戏中有限状态机的体现 小怪的巡逻和追逐功能 模糊状态机的体现 当玩家离小怪比较近时 小怪会追逐玩家
  • 线程方法wait/wait(timeout)源码分析

    1 wait wait timeout wait有三个重载的方法 但是最终都是调用native的wait timeout 方法 那我们来看看这个方法在jvm中具体做了些什么 图1 1 图1 2 java中的object wait方法对应c
  • 基础算法题——最短路计数(bfs遍历)

    最短路计数 题目描述 给出一个N个顶点M条边的无向无权图 顶点编号为 1 N 问从顶点1开始 到其他每个点的最短路有几条 输入格式 第一行包含2个正整数 N M 为图的顶点数与边数 接下来M行 每行2个正整数 x y 表示有一条顶点x连向顶
  • Graft货币(GRFT)结点搭建

    Graft官网 https www graft network github地址 https github com graft project GraftNetwork releases 节点搭建 从https github com gra
  • MPC车辆轨迹跟踪----理论推导

    MPC控制简介 众所周知 控制算法中 PID的应用占据了90 而另外10 就是这次的主角MPC控制算法 MPC控制算法全称模型预测控制 它相对比PID有着多输入 多输出以及更加平稳的特点 并且最重要的是 MPC可以针对非线性的系统进行控制
  • PCB正片和负片有什么区别

    PCB正片和负片有什么区别 概念 正片和负片是底片的两种不同类型 正片 简单地说就是 在底片上看到什么就有什么 负片 正好相反 看到的就是没有的 看不到的就是有的 见下图 在 Allegro中使用正负片的特点 正片 优点是所见所的 有比较完
  • IDEA 2018 Mybatis Plugin插件安装破解及使用

    一 进入官网http plugins jetbrains com 二 搜索Free MyBatis Plugin 三 点击get 选择Free Mybatis plugin 点击下载 四 下载完成 五 打开Idea 点击File 点击Set
  • ARM汇编基础详解(PS学习汇编的原因)

    目录 前言 1 GNU 汇编语法 2 Cortex A7 常用汇编指令 2 1 处理器内部数据传输指令 内部寄存器数据非内存数据 2 2 存储器访问指令 RAM 2 3 压栈和出栈指令 了解 2 4 跳转指令 2 5 算术运算指令 2 6
  • brew 安装 for Mac

    安装命令 usr bin ruby e curl fsSL https raw githubusercontent com Homebrew install master install brew 官网 http brew sh 安装过程遇
  • 电子学会2022年09月青少年软件编程C语言等级考试试卷二级真题及(参考答案)

    编程题 共5题 共100分 1 统计误差范围内的数 考试题目 统计一个整数序列中与指定数字m误差范围小于等于X的数的个数 时间限制 5000 内存限制 65536 输入 输入包含三行 第一行为N 表示整数序列的长度 N lt 100 第二行
  • 代码静态扫描工具sonar介绍

    一 SonarQube整体介绍 SonarQube为静态代码检查工具 采用B S架构 帮助检查代码缺陷 改善代码质量 提高开发速度 通过插件形式 可以支持Java C C JavaScripe等等二十几种编程语言的代码质量管理与检测 通过客
  • 右值引用详解

    何谓右值 右值引用 右值引用与其他对比 右值引用与移动语义 右值引用与std move 移动语义与std move 移动语义注意事项 移动语义与swap 完美转发 何谓右值 一个最简单判断左值 右值的方式是 等号左边的值即左值 等号右边的值
  • 深度学习之浅见

    通常来说 大家认为深度学习的观点是Geoffrey Hinton在2006年提出的 这一算法提出之后 得到了迅速的发展 关于深度学习 zouxy09的专栏中有详细的介绍 Free Mind 的博文也很值得一读 本博文是我对深度学习的一点看法
  • VS Code Remote Development

    在Windows下编辑Linux代码 并且有Linux下的系统接口 第三方dep库的语法解析 代码提示 自动补全 跳转 用起来真香 困扰了Linux后台开发人员多年的难题终极解决方案 要求VS Code版本在1 35 1以上 1 安装远程开
  • 基础学习JavaScript 之 Array

    笔记文 Array JavaScript内置对象之一 由索引值来排序的数据集合 下面就列出了array上的方法 会改变自身的方法 copyWithin 在数组内部 将一段元素序列拷贝到另一段元素序列上 覆盖原有的值 fill 将数组中指定区
  • dc-9 靶机渗透学习

    信息收集 用nmap扫描当前网段 nmap sP 192 168 202 0 24 对靶机进行端口扫描 nmap A p v 192 168 202 148 访问靶机的80端口 进行框架识别 无框架的页面 尝试web服务漏洞 用dirsea
  • java数据结构-栈

    栈 1 栈的定义 栈 Stack 是只允许在一端进行插入或删除的线性表 首先栈是一种线性表 但限定这种线性表只能在某一端进行插入和删除操作 栈顶 Top 线性表允许进行插入删除的那一端 栈底 Bottom 固定的 不允许进行插入和删除的另一
  • VMware+CentOS7搭建私有云桌面服务

    VMware CentOS7搭建私有云桌面服务 1 安装VMware虚拟机工作台 官网下载安装包 版本 14 1 3 Pro 地址 https my vmware com en web vmware info slug desktop en
  • 详解从0开始的嵌入式学习路线,学什么、怎么学?

    嵌入式是个大筐 什么都可以往里面装 电子 机械 计算机 自动化 测控 通信 物联网 很多很多专业都和嵌入式沾边 硬件 驱动 操作系统 网络 应用 算法 很多同学越学越迷糊 越学越感觉什么也不会 首先要记住一句话 嵌入式学习奥义 先观其广 再