北大硕士7年嵌入式学习经验分享
阶段 1
大一到大三这个阶段我与大多数学生相同:
学习本专业知识(EE专业),学习嵌入式软件开发需要的计算机课程(汇编原理,计算机组成原理,操作系统,C语言等),学习嵌入式项目(来源于实验室项目,自己想到的项目以及各种比赛)。
关于如何学习嵌入式软件开发:
① 学习51单片机。
这个阶段你只需要跟着郭天翔的视频去学,只要求实现功能,不求甚解。
但建议能够提出问题,比如“为什么往IO控制寄存器写入特定值能点亮LED灯?”
“IO口的电路结构是什么样子的?”
“什么是上拉下拉,灌电流拉电流?”,
这一阶段主要是熟悉单片机的使用,并且在使用中思考发现问题,还能熟悉一些基本概念。
② 开始查资料看书。
看模拟电路数字电路等等,开始去弄明白1中所提出的问题。这时候问题主要集中在电路方面。
③ 开始学习STM32。
随便买个板子,看原子的书跟着一步步去做。
这时候你会遇到很多计算机方面的问题,这时候一边学习教程,一边学习:微机原理,编译原理,操作系统。
你要弄清楚 ARM 架构,弄明白 CPU 如何取指,译码,执行,知道地址总线,控制总线,数据总线如何工作。
要弄明白你编译各个阶段产生的各个文件是什么,什么是分散加载,什么是重定位,什么是代码段,什么是数据段,等等。
弄明白 CPU 如何启动,程序镜像在内存中如何布局。
要知道中断的原理,以及现场保护等等。最后你了解了各个知识点之后,转向 GCC 开发 STM32,这时候你如果知识掌握得不错,你应该可以很快地学会编写链接器脚本并且明白每一条语句所代表的含义。
④ 开始增强 C 语言。
深入挖掘C语言的各个死角。
最好可以做到当你写下一条语句的时候知道编译器会如何处理。
还需要数据结构和软件工程,建议最好还要学习一下设计模式。
开始学习养成良好的代码风格,开始思考代码的结构。
可以说设计模式如果能学好,在往后学习 LINUX 内核时大有裨益。
你会发现 LINUX 的输入子系统有点像职责链模式,会发现 ASOC 音频系统有点像模板方法模式。
私以为,如果能在两个以上不同方面考察同一种编程思想,你会得到更加深刻的理解,更能领会其精华。
⑤ 认真研读 OS 方面的书。
各个知识点都要弄明白,进程是什么,程序是什么,线程是什么,竞争死锁优先级反转,虚拟地址空间物理地址空间,用户空间内核空间等等。
开始学习 ucos,这个没什么可说的,如果在 2 中能熟练掌握各种知识点,知道 CPU 如何中断如何保护恢复现场,那么读ucos 的源码时候,在原理上就不会有什么疑惑。
如果能在 4 中养成把握代码整体结构的能力并且学习好数据结构和基本的算法,读源码就没有什么障碍。
一旦原理弄通了,源码也能读懂,那么吃透 ucos 就是顺理成章的事情。
⑥ 自己仿照 ucos 写一个 stm32 上的实时 os 出来。
⑦ 进军 LINUX。
学习 LINUX 的基本使用,看赵炯那本内核剖析,啃 LINUX 内核设计与实现,把握总体的内核架构。
之后可以学习驱动,看建议陈学松老师的书,弄明白基本的驱动架构和如何编写简单的驱动,认真对待,这里强调一下设备驱动模型。
最后啃 LINUX 内核源码情景分析,上下两册用心读,这里着重强调一下内核中的 VFS 部分。
之后就是看宋宝华老师的书,进一步学习驱动开发。
最后,看内核源码看内核源码看内核源码。
⑧ 其它的什么 SPI,IIC,什么 DMA,都只是技能问题,只要知识学的好,技能想咋点就咋点。
阶段 2
大三到研究生入学前这个阶段我在工作与考研之间无比纠结,并在此期间无数次常思考嵌入式开发到底是什么,如何把嵌入式开发做好,以后该选择怎样的一条职业道路。
为此,像很多人一样,在知乎上像做嵌入式开发的前辈们咨询过多次。
在这个阶段,我学习了 Linux 驱动开发,并渐渐认识到,嵌入式开发是一个比较偏软件的岗位(我认为大多数学生做的工作都是嵌入式软件开发,而不是硬件开发),
应该深入学习计算机体系结构的知识,而不是把那些无聊的嵌入式相关项目翻来覆去的做(尤其少参加乱七八糟的比赛)。
最终,我选择了读研,想站的再高一点看这件事。
阶段 3
研一进入研究生阶段(2018),当大家都火急火燎的加入 AI 的阵营时,我依然对嵌入式爱的深沉。
选课时,我选择了嵌入式实时操作系统,计算体系结构相关的课程,还看了很多相关的书籍,依然每周保持嵌入式 Linux 的学习。
时不与我,明明选择了做底层的导师,结果导师转做深度学习了,还好是做终端+AI相关的方向,也不算完全偏离嵌入式,这让人多少有点欣慰(毕竟我还是放不下嵌入式的)。
在这个阶段,由于接触了不少的人和事,我越来越认识到,嵌入式只是一个平台,切勿把嵌入式看作一个具体的岗位,无论硬件还是软件。
因此,我对这个岗位以及行业就业现状有了更进一步的认识。
阶段 4
研二到研三在这个阶段,我对狭义嵌入式(驱动,应用开发)完全释怀,
我认为许多人喜欢的嵌入式并不是驱动或者应用等开发,而是对底层系统的一种好奇心与掌控时的快感。
与其说喜欢嵌入式,还不如说喜欢的是计算机体系结构。
因此,只要是涉及到硬件的软件开发,我都喜欢,我也将其均定义为嵌入式。
因为嵌入式软件开发就是建立在底层语言,计算机组成原理,操作系统等知识上的一种软件开发,
如果你想将嵌入式开发做好,你就得学好这几门课程 ,如果你学好了这几门课程,底层软件开发工作的岗位你应该都能胜任。
因此,又何必将嵌入式开发狭义的划到驱动开发,XX协议开发之类的呢?
最终,这个阶段我毅然放弃了 Linux 驱动的学习,投入了 Python 深度学习的怀抱中。
我不再关注我到底做的是不是嵌入式开发,只关注和嵌入式平台有没有关系。
我研究的是如何把一个深度学习模型部署到嵌入式平台上去。
有人可能会疑问,这和嵌入式开发有什么关系?为什么没有关系呢?在嵌入式平台上用 C 语言编写神经网络模型的前向推理,这不是把我们的C语言和组成原理的知识发挥出来了吗?
当图像处理程序性能不足时,查看生成的汇编程序,当汇编效率不高时,将 C 语言替换为我们自己写的汇编代码,这还不够嵌入式吗?
其实,当我们把思路放宽后,嵌入式就不再是某一个具体的岗位了,
它有可能是 AI 算子工程师,AI编译器开发工程师,FPGA加速工程师,高性能工程师等等。
这些岗位需要的技能与嵌入式工程师极为相似,年薪却最低 30W 起。
为什么?很简单,供需关系决定价格!嵌入式早已江河日下,但嵌入式+某一风口就能迈向高薪之路,这个道理在任何技术领域都是通用的。
2018年-2021年,嵌入式+AI=高薪,未来嵌入式+XX也可以。
至于未来的风口是什么,就要靠我们自己去探索了。只要保证我们自己有核心的知识储备,再学习一下风口相关的技术,立马就能咸鱼翻身。
在视野拓宽后,我去了 2 家大公司实习,后续我陆续收到了很多公司的offer。
里面既有纯算法(计算机视觉)的岗位(50-60W),也有异构计算的岗位(45-55W),也有AI芯片工具链相关的岗位(45W-50W)。
回头看,我好像已经荒废技术好久了,但是好像依旧在嵌入式学习的路上。
相关文章:
北大硕士7年嵌入式学习经验分享
阶段 1 大一到大三这个阶段我与大多数学生相同: 学习本专业知识(EE专业),学习嵌入式软件开发需要的计算机课程(汇编原理,计算机组成原理,操作系统,C语言等),…...
华为鸿蒙手表开发之动态生成二维码
华为鸿蒙手表开发之动态生成二维码 前言: 最近入职新公司,由于之前的哥们临时离职,走得很突然,所以没有任何交接和文档,临时顶上公司手表应用的上架,更换了新的密钥和key之后重新测试功能和流程ÿ…...
2023-09-28 monetdb-databae的概念和作用-分析
摘要: 每个数据库对于db,schema以及user,role都有一套自己的设计, 不同数据库间对于相同名字的东西例如database和schema可以说南辕北辙, 例如mysql中schema其实是database的同义词. 本文分析monetdb的database的概念和作用 database的概念和作用: 和mysql的database完全不同…...
2024级199管理类联考之数学基础(上篇)
管理类考试介绍 管理综合200分,时间3小时 数学:75分/25题,是拉开差距的核心模块 问题求解题:15个,5选一条件充分性判断:10个,结合两个条件选择答案 条件一充分,条件二不充分:A条件一不充分,条件二充分:B条件一充分,条…...
RFID技术引领汽车零部件加工新时代
RFID技术的兴起引领了汽车零部件加工领域的新时代,作为一种利用无线电频率进行自动识别的技术,RFID技术能够快速、准确地识别物体并获取相关数据,在汽车零部件加工中,RFID技术具有重要的应用价值,可以提高生产效率、降…...
python中使用matplotlib绘图
一、背景 当我们在写python程序时,不可避免的需要将数据可视化,也就是绘制出数据的曲线图,以便我们更直观的观察数据间的变化,和方便对比。此时就要用到matplotlib库了。 matplotlib官方给出的定义是: 翻译过来也就是…...
Qt Creator 使用技巧
使用技巧 功能快捷键解释Switch Header/SourceF4在同名的头文件和源程序文件之间切换Follow Symbol Under CursorF2变量:跳转到声明;函数:声明和定义切换Refactor Rename Symbol Under CursorCtrlShiftR改名称,将替换所有用到这个符号的地方RefactorAdd Definition…...
来看看双阶段目标检测算法趴
🚀 作者 :“码上有钱” 🚀 文章简介 :AI-目标检测算法 🚀 欢迎小伙伴们 点赞👍、收藏⭐、留言💬简介 双阶段目标检测算法是一类深度学习算法,通常分为两个阶段来检测和识别图像中的…...
python利用matplotlib绘图,对于中文和负号不显示,显示方框“口口”完美解决办法!!
文章目录 一、问题展示二、问题分析三、解决办法四、结果展示 一、问题展示 二、问题分析 可以发现对中文,以及负号不显示。 三、解决办法 import matplotlib.pyplot as pltplt.rcParams[font.sans-serif] [usimHei] # 显示中文 plt.rcParams[axes.unicode_mi…...
【数组及指针经典笔试题解析】
1.数组和指针笔试题 题目1 int main(){int a[5] { 1,2,3,4,5};int * ptr (int * )(&a 1);printf("%d,%d",*(a 1),*(ptr - 1));return 0;}图文解析: int * ptr …...
Transformer学习-self-attention
这里写自定义目录标题 Self-attentionMulti-head self-attention用self-attention解决其他问题 Self-attention 用Wq、Wk、Wv分别乘输入向量得到q、k、v向量 用每个q向量乘所有的k向量得到对应项的attention,即用每项的query向量去匹配所有的key向量,得…...
Spring Boot:利用JPA进行数据库的增改
目录 JPA介绍Service接口Service和Autowired示例代码 Dao数据库操作层Repository示例代码 控制器文件示例代码-增加增加成功示例代码-修改修改成功 JPA介绍 JPA(Javaa Persistence API)一种用于持久化 Java 对象到关系型数据库的标准规范。它提供了一种统一的方式来…...
列表的增删改查和遍历
任务概念 什么是任务 任务是一个参数为指针,无法返回的函数,函数体为死循环不能返回任务的实现过程 每个任务是独立的,需要为任务分别分配栈称为任务栈,通常是预定义的全局数组,也可以是动态分配的一段内存空间&#…...
获取网卡上的IP、网关及DNS信息,获取最佳路由,遍历路由表中的条目(附源码)
VC常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/details/124272585C软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...&a…...
保姆级 -- Zookeeper超详解
1. Zookeeper 是什么(了解) Zookeeper 是一个 分布式协调服务 的开源框架, 主要用来解决分布式集群中应用系统的一致性问题, 例如怎样避免同时操作同一数据造成脏读的问题. ZooKeeper 本质上是 一个分布式的小文件存储系统 . 提供基于类似于文件系统的目录树方式的数据存储, …...
【通意千问】大模型GitHub开源工程学习笔记(2)--使用Qwen进行推理的示例代码解析,及transformers的库使用
使用Transformers来使用模型 如希望使用Qwen-chat进行推理,所需要写的只是如下所示的数行代码。请确保你使用的是最新代码,并指定正确的模型名称和路径,如Qwen/Qwen-7B-Chat和Qwen/Qwen-14B-Chat 这里给出了一段代码 from transformers import AutoModelForCausalLM, Aut…...
从0开始python学习-23.selenium 常见鼠标的操作
注意:必须创建一个事件链对象(ActionChains);最后鼠标事件链完成之后一定要进行事务提交perform()(如果事件链不提交那么所有的鼠标事件都不会执行) 1. 左键单击:click()…...
电气基础——电源、变压器、接触器、断路器、线缆
目录 1.电源 2.变压器 三项电和2相电的转换 3.接触器 4.断路器 5.线缆 1.电源 2.变压器 三项电和2相电的转换 三相电转为2相电 1.变压器 2.相位移转换器 3.电容器 两相电变不了三相电。但是两相电可以通过电容移相后带动三相电机 零线,地线Nÿ…...
步力宝科技爆款产品定位,开创智能物联网新商业
数据显示,中国处于 “亚健康”状态人口数量约占总人口的70%,亚健康是一种临界状态,指介于健康和疾病之间的状态。亚健康是一个动态演变的过程,既有向慢病发展的趋势,也能通过合理的干预使人体重返健康状态,…...
凉鞋的 Unity 笔记 105. 第一个通识:编辑-测试 循环
105. 第一个通识:编辑-测试 循环 在这一篇,我们简单聊聊此教程中所涉及的一个非常重要的概念:循环。 我们在做任何事情都离不开某种循环,比如每天的 24 小时循环,一日三餐循环,清醒-睡觉循环。 在学习一…...
【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...
盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...
FFmpeg:Windows系统小白安装及其使用
一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】,注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录(即exe所在文件夹)加入系统变量…...
