从零开始的嵌入式Linux生活(一) 背景介绍
文章目录
- 前言
- 本系列文章的主要思想:
- 本系列文章包括:
- 一、什么是嵌入式开发
- 二.嵌入式开发 - 由便宜到贵
- 三.嵌入式开发的基本原理
- 一个美好的假设:
- 再来一个美好的假设
- 美好的假设被打破了 - RTOS系统
- 美好的假设又被打破了 - 嵌入式Linux系统
- 老板飘了 - 安卓系统
前言
近年来(截至2023年3月),随着各种各样的因素:实体经济、米国制裁、芯片热、智能汽车等, 嵌入式软件开发(Embedded Software)越来越火热,众多的芯片公司、应用方案公司、甚至是代理商公司如雨后春笋般成立; 各大招聘网站上“嵌入式开发”“驱动开发”等岗位也成为了热门高薪急招岗位。
作者我本人毕业于19年,在某大厂从事了约大半年的互联网前端开发后,转向了嵌入式开发的领域。 从51单片机开始、到32位MCU、再到嵌入式Linux、嵌入式安卓,一步一步的坚持下来了。 这其中离不开自己的努力,但更多的还是受益于互联网的分享精神。 所以我打算写这个关于嵌入式Linux的全方位指南,一方面是对自己的总结提升,另一方面也是回馈感谢互联网上各位网友的分享。
本系列文章的主要思想:
尽量广泛的介绍嵌入式开发的各个部分,力求涉及面广泛,但不一定很深入。 各位读者对某个部分感兴趣的话再自行了解。
本系列文章包括:
(一)背景介绍:主要介绍什么是嵌入式开发,其中嵌入式Linux开发属于哪个部分
(二)启动准备:开发板硬件平台、环境搭建
(三)入门:架构介绍,编译uboot、kernel、rootfs
(四)uboot介绍
(五)kernel介绍
(六)驱动介绍
(七)rootfs介绍
(八)用户空间应用程序介绍
(九)总结
一、什么是嵌入式开发
根据百度百科定义:
嵌入式开发就是指在嵌入式操作系统下进行开发,包括在系统化设计指导下的硬件和软件以及综合研发。除暂且分离硬件的EDA研发以外,侧重的就是在一定硬件条件下的系统化设计和软件研发。
其实“嵌入式”是一个历史遗留名词,在以前,“嵌入式“是“通用”的反义词。例如:我们的PC机是通用的,其中的CPU、内存条、硬盘都是可以通用的; 而银行ATM、空调、手机、收音机等这类设备,其中的CPU、内存条、硬盘却不是通用的,称之为“嵌入式系统“。
这个时候会有同学提问了:那为什么ATM、空调这种设备不用通用的PC机,而非要玩点花样出来呢? 主要是因为以下几个因素:价格、功耗/性能、体积。
价格:性能好一点的PC机价格动辄上千; 性能差一点的工控机价格也要好几百。
功耗/性能:很多应用场景的功耗限制,比如收音机,还是使用电池供电的。 使用功耗动辄几十瓦的PC机显然不合适。 再说关于性能,用于空调的系统显然不需要PC机那么高的性能。
体积:性能越好的PC机,所需散热也越大;目前比较小的PC机可以做到一本书的大小。嵌入式系统可以做到很小,甚至是一枚硬币的大小。
嵌入式开发,就是指专门在上述的嵌入式系统中进行各种工作。其中根据工作内容又可细分为了几个子类:
- 硬件工程师:
- 硬件工程师:针对特定的需求场景,选型合适的CPU(性能、价格等)、内存、磁盘等器件,并设计出原理图。
- layout工程师: 基于硬件工程师的原理图,使用专门的设计软件(EDA)画出电路板设计图(PCB)。并将PCB设计图提供给工厂,生产出可以实际使用的实物电路板。
- 软件工程师:
- 驱动工程师:基于硬件工程师提供的电路板,使用CPU指定的编程语言(通常是C语言)、编译器,编写出特定的、具备基本功能的代码,能够正常驱动CPU、内存、磁盘工作;也能够间接的通过CPU上的串口、I2C、PCIE等接口控制继电器、红外线、喇叭耳机、有线/无线网卡等设备正常工作。
- 应用工程师:基于驱动工程师调试好的各个外部设备,配合产品的实际需求,将各个设备组合协同工作起来,例如:接收到红外线开机信号后,通过喇叭播放一个开机语音; 或者开机后通过网络HTTP请求上报给服务器,机器已在线。
本文主要会站在驱动工程师的角度,来介绍驱动工程师的工作内容之一 - 嵌入式Linux的开发,当然或多或少的也会接触到硬件、应用相关的一些内容。
二.嵌入式开发 - 由便宜到贵
本文的标题中有“嵌入式Linux”的字样,那么这个时候有好奇的同学就会问了:什么是嵌入式Linux?除了嵌入式Linux难道还有嵌入式Windows? 答案是Yes,其实在嵌入式开发的领域中,是这样的:
正如上文所说,嵌入式设备价格、功耗等各方面的考虑,其系统组成可能极其简单。 以最简单的51单片机为例:
如上述图片所示,这个嵌入式系统的组成就是一个单片机(图中方形的那个芯片)、一个晶振、几个电阻,其中可能只执行一个while(1)无限循环。 而这个单片机的内部组成也十分简单,如下图所示:
不要看这个图片花里胡哨的,这可是我国的核心科技STC51单片机的官网:http://www.stcmcudata.com。无数的嵌入式人才、芯片人才都是从STC一步一步培养出来的。
如上图绿框所示,这个单片机内置了大容量的”12KB”RAM内存,“128KB”ROM(类似于PC机的磁盘)。 看到这里相信你已经有一些体会了,嵌入式系统真的节约啊~。 在这么有限的资源情况下,并不能将Linux、Windows这样的操作系统放上去运行,一个Windows安装包都得4个G,这哪够啊。
因此在嵌入式系统中,根据系统资源的由少到多,其并不一定会运行windows系统,而是可能会运行一些其他的系统,通常所用的操作系统如下:
资源数量 | 操作系统 | 备注 | 代表芯片 |
---|---|---|---|
极少(CPU频率20Mhz RAM20KB ROM64KB) | 裸机,无操作系统 | 整个程序就是while(1)循环,单线程,无屏幕 | STC 51单片机 |
少(CPU频率300Mhz RAM128KB ROM1MB) | 实时操作系统RTOS | 有多线程,可接单色小分辨率屏幕 | STM32 意法半导体单片机 |
中(CPU频率1Ghz RAM 2G ROM 4G) | 嵌入式Linux | 有多线程、有内核和用户空间隔离,可接1080P屏幕 | NXP IMX6 IMX7系列 地平线自动驾驶芯片等 |
多(CPU频率 3Ghz RAM 8G ROM 64G) | 安卓Android | 安卓是嵌入式Linux的升级版本 | 瑞芯微rockchip3399 各种安卓手机 |
裸机编程一般需要自学一个月即可入门,教程请各位自行百度。
RTOS编程可能需要3个月才能入门,教程可前往国内最出名的RTOS系统:https://www.rt-thread.org/ 这里查看。 也可以淘宝购买开发板,一般都附送教程。
Linux编程可能需要9个月才能入门,教程可阅读本系列文章(自卖自夸一波),或者也可以淘宝搜索嵌入式Linux开发板,也会有对应的教程 。
Android编程就更困难了,作者我也不太会。
感兴趣的同学可以自行搜索各个操作系统的代表芯片,看一下其芯片介绍、价格等
三.嵌入式开发的基本原理
这个时候可能有读者又会说了: 你说的我大致明白了,但我还是不知道什么是嵌入式开发。 所以接下来我就以实际的例子来说明:
一个美好的假设:
现在我们想做一台收音机,上面有5个按键12345,可以用来选台。 像这样:
其设计思路如下图所示:
主要有5个部分:
- CPU,用来执行代码,检测开关有无被按下,如果有,则立即控制对应的射频电路。
- 电源,5V电池供电
- 开关,五个按键开关,按下后对应的电路会被接通,CPU能够检测到
- 射频电路,用于接收声音信号
- 喇叭,播放射频电路接收的声音
再来一个美好的假设
假设除了1中的CPU执行的代码以外,2345都有硬件工程师帮我们准备好了,那么接下来我们只需要参考CPU厂家提供的方法,写代码即可。
假设我们使用的是上文所说的神器:STC单片机:
- 型号:STC32G
- 官网:http://www.stcmcudata.com/
- 芯片手册:http://www.stcmcudata.com/STC8F-DATASHEET/STC32G.pdf
- 长相:
接下来我们开始写程序… 咦? 怎么芯片手册中都帮我们把程序写好了,STC果然是神器啊 哈哈。
接下来我们把程序编译、烧录下载到芯片里面去,这部分STC也有非常详细的说明:
详情请见: http://www.stcmcudata.com/STC8F-datasheet/STC-TOOL.pdf
到这里似乎一个嵌入式系统的基本流程就已经跑通了,到这里,其实就是叫做bring up OK了,以后你会听到很多次bring up这个术语。
后续的工作都在bring up的基础之上修修补补, 可能过一会儿发现射频部分信号又不好了,要配合硬件工程师调试一下; 可能再过一会儿,产品经理又提了个需求,要调节音量的大小; 甚至再过一年,还是使用相同的芯片,公司要新开发一个收音机2.0。
美好的假设被打破了 - RTOS系统
随着产品经理越来越过分,要求我们的收音机要能够做到:
-
有红黄绿3个指示灯:
a. 红灯是电源灯,每1秒闪烁一次提示有电
b. 黄灯是警告灯,电池电压小于4V时开始每0.7秒闪烁一次
c. 绿灯是正常运行灯,只要程序在运行,就每0.3秒闪烁一次 -
增加一个声音分贝传感器,每10秒采集一次周边环境声音,如果环境声音大于50分贝,则认为此时播放了声音用户也听不见,此时关闭扬声器。
这么多需求,一个while循环写不下了啊。 能写是能写,但是写起来很蛋疼。 while循环每1毫秒执行一次,然后判断到了1秒就闪烁红灯,判断到了0.7秒就闪烁黄灯。 想想这程序都蛋疼啊。
有需求就会有解决方案,此时小型操作系统 RTOS 出现了,其为单个CPU提供了多线程的能力(其原理是分时复用)还挺有意思,感兴趣的读者欢迎下来自行了解。 我们就可以用一个线程闪烁红灯,再用另外一个线程闪烁黄灯…程序设计又变得简单清晰了。
美好的假设又被打破了 - 嵌入式Linux系统
咱们的收音机2.0越卖越好了,公司也从原来的3个人,增长到了30个人。 咱们老板现在融了点资金,不差钱了,想要做个高级、智能、物联网收音机, 不考虑成本,只考虑功能高大上。 于是提出了以下几个要求::
- 要能够接屏幕,最好还是1080P的屏幕,上面可以看电视节目。
- 能够通过手机APP进行控制,使用HTTP网络协议。
- 当然也要接入网线,即以太网。
- 用户能够插入U盘,播放自己U盘上的内容。
这几个要求一提出来,你就懵逼了,咋搞啊。 别急,我来一个一个分析一下:
- 接1080P屏幕,有大量的图像运算,需要高性能的CPU或者内置GPU。
- 关于UI界面可以用QT库来实现,虽然比较丑,但将就能用。
- HTTP、以太网等网络协议,比较复杂,代码量大,只能考虑使用开源的库。
- U盘涉及到USB协议,播放上面的内容更涉及到了USB 存储协议,也只能考虑使用开源的库。
综上考虑,RTOS系统中对以太网、USB协议的支持很少,有的也需要花至少1个月时间移植修改代码。
因此此时便可以考虑Linux系统,Linux是最大的开源操作系统,上述提到的所有各种协议,Linux不仅支持,还是完美支持。 并且有很多的开发者大家一起使用、一起维护。
老板飘了 - 安卓系统
在你成功的做出了Linux系统的收音机之后,公司成功上市了。 你们的收音机也成了人手一个的热门产品。 这个时候老板开始飘了: 咱们公司的收音机不再是一个收音机,而是一个智能平台:
- 现有的LinuxQT界面不好看,必须改了。
- 用户购买了我们的收音机后,可以使用微信、bilibili等第三方APP。
这个时候就需要上安卓系统了。
本文到这里就结束了,嵌入式开发的世界很广阔,没个3、5年学不完,精通更是得10年以上。 这有好有坏:好处是经常能看到35+ 40岁以上的嵌入式工程师,不会早早的失业; 坏处是经常能看到半夜10点还在查软件BUG,最后发现是硬件问题的苦逼嵌入式工程师。 但是总而言之,作为一名嵌入式工程师,当调试出一块板子、开发出一件产品、交付给用户时,那种成就感是无可比拟的。 预祝各位读者在嵌入式的路上披荆斩棘、创造辉煌。
欢迎阅读我的下一篇文档:
从零开始的嵌入式Linux生活(二)启动准备:开发板硬件平台、环境搭建
相关文章:

从零开始的嵌入式Linux生活(一) 背景介绍
文章目录前言本系列文章的主要思想:本系列文章包括:一、什么是嵌入式开发二.嵌入式开发 - 由便宜到贵三.嵌入式开发的基本原理一个美好的假设:再来一个美好的假设美好的假设被打破了 - RTOS系统美好的假设又被打破了 - 嵌入式Linux系统老板飘…...

后缀为whl的文件是什么?如何安装whl文件?学习一下(22)
小朋友们好,大朋友们好! 我是猫妹,一名爱上Python编程的小学生。 欢迎和猫妹一起,趣味学Python。 今日主题 了解并使用Pyhton的库安装包文件whl。 什么是whl文件 whl格式本质上是一个压缩包,里面包含了py文件&am…...

整合Juit
整合Juit 1.SpringBoot整合Juit SpringBootTest class Springboot04JuitApplicationTests {AutowiredBookDao bookDao;Testvoid contextLoads() {System.out.println("test................");bookDao.save();} } 名称:SpringBootTest 类型&…...

C#,码海拾贝(11)——拉格朗日(Lagrange)三点式曲面插值算法,《C#数值计算算法编程》源代码升级改进版
本文开始是曲面插值(Surface Interpolation,也称作:二维插值,二元插值)。 数值计算三点式 数值计算三点式是一种常见的数值计算方法,它是通过对已知函数在某个点及其左右两个点处的函数值进行数值插值&…...

CentOS7系统安装MySQL 5.7
目录一、官网下载mysql5.7二、检查mysql依赖环境三、安装MySQL 5.7.281.将安装程序拷贝到/opt目录下2.安装四个安装包3.查看mysql版本4.服务的初始化5.启动mysql,并查看状态(加不加.service后缀都可以)6.查看mysql服务是否自启动(默认自启动)…...

基于粒子群算法优化BP神经网络的高炉si预测,PSO-BP
目录 摘要 BP神经网络的原理 BP神经网络的定义 BP神经网络的基本结构 BP神经网络的神经元 BP神经网络的激活函数, BP神经网络的传递函数 粒子群算法的原理及步骤 基于粒子群算法改进优化BP神经网络的用电量预测 代码 效果图 结果分析 展望 参考 摘要 一般用启发式算法改进B…...

STM32输出PWM波控制电机转速,红外循迹避障智能车+L298N的详细使用手册、接线方法及工作原理,有代码
智能循迹红外避障小车 本设计的完整的系统主要包括STM32单片机最小系统、L298n电机驱动,超声波 ,舵机 ,红外模块等。寻迹小车相信大家都已经耳熟能祥了。 我们在这里主要讲一下L298N驱动电机和单片机输出PWM控制电机转速。 本设计软件系统采…...

3、AI的道德性测试
AI的道德性 AI系统的道德性如何保障是一个重要而复杂的问题,涉及到人工智能的发展、应用、监管、伦理、法律等多个方面。保障AI系统的道德性是一个很重要的问题,因为AI系统不仅会影响人类的生活和工作,也会涉及人类的价值观和伦理道德原则。针对这部分,也需要测试AI系统是…...

银行数字化转型导师坚鹏:银行业务需求分析师技能快速提升之道
银行业务需求分析师技能快速提升之道 ——以推动银行战略目标实现为核心,实现知行果合一课程背景: 很多银行都在开展业务需求分析工作,目前存在以下问题急需解决:不知道银行业务需求分析师掌握哪些关键知识?不清楚…...

C++IO流
文章目录一、CIO流体系二、C标准IO流三、C文件IO流1.ifstream2.ofstream一、CIO流体系 C流是指信息从外部输入设备向计算机内部输入,从内存向外部输出设备输出的过程,这种输入输出的过程非常形象地被称为流的概念。IO流指的就是输入输出流。 我们平时对…...

交友项目【后端环境搭建】
目录 1:环境搭建 1.1:MYSQL数据库 1.1.1:导入相应的sql 1.2:Linux中的docker-compose方法集中部署 1.2.1:介绍 1.3:IDEA设置 1.3.1:基本要求 1.3.2:设置项目编码格式 1.3.3&…...

大事务问题解决方案
文章目录 大事务引发的问题解决办法少用@Transactional注解将查询(select)方法放到事务外事务中避免远程调用事务中避免一次性处理太多数据非事务执行异步处理总结大事务引发的问题 1、死锁 2、回滚时间长 3、并发情况下数据库连接池被占满 4、锁等待 5、接口超时 6、数据库主…...

python开启局域网传输
python开启局域网传输 1.找自己的IP 在命令提示窗口输入:ipconfig <----找自己的IP地址 2.创建要传输文件的文件夹(只允许在该文件夹下访问传输) a.复制文件夹路径 b.在命令提示窗口cd打开新创建的文件夹 cd “C:\Users\86151\Desktop…...

病毒丨熊猫烧香病毒分析
作者丨黑蛋 一、病毒简介 病毒名称: 熊猫烧香 文件名称: 40fee2a4be91d9d46cc133328ed41a3bdf9099be5084efbc95c8d0535ecee496 文件格式: EXEx86 文件类型(Magic): MS-DOS executable 文件大小: 29.30KB SHA256&…...

SparkSQL学习——SparkSQL配置与文件的读取与保存
目录 一、添加依赖 二、配置log4j 三、spark提交jar包 四、读取文件 (一)加载数据 (二)保存数据 1.Parquet 2.json 3.CSV 4.MySql 5.hive on spark 6.IDEA的Spark中操作Hive 一、添加依赖 <properties><project.build.sourceEncoding>UTF-8</proje…...

随想录Day45--动态规划:70. 爬楼梯 (进阶), 322. 零钱兑换, 279.完全平方数
70爬楼梯这道题之前已经做过,是动态规划思想的入门,想要爬上第n层阶梯,看爬上n-1层的方法和n-2层的方法共有多少种,两个相加就是爬上n层阶梯的方法。这里扩展到每次可以爬k层,这样就是一个动态规划问题。因为每次可以爬…...

原理+案例,关于主从延迟,一篇文章给你讲明白!
前言 在生产环境中,为了满足安全性,高可用性以及高并发等方面的需求,基本上采用的MySQL数据库架构都是MHA、MGR等,最低也得是一主一从的架构,搭配自动切换脚本,实现故障自动切换。 上述架构都是通过集群主…...

QT开发笔记(Camera)
Camera 此章节例程适用于 Ubuntu 和正点原子 I.MX6U 开发板,不适用于 Windows(需要自行修改 才能适用 Windows,Windows 上的应用不在我们讨论范围)! 资源简介 正点原子 I.MX6U 开发板底板上有一路“CSI”摄像头接口。支持正点原…...
从C++的角度讲解C#容器
讲解C#容器的文章网上一搜一大把,作为一名C程序员如何高效学习C#容器呢,其实学语言如果能讲到这点就能触类旁通,举一反三,那效果是最好的问题市面上没有这样的书籍,那就跟着老白来一起从C的角度去讲解C#容器1.List<…...

React组件库实践:React + Typescript + Less + Rollup + Storybook
背景 原先在做低代码平台的时候,刚好有搭载React组件库的需求,所以就搞了一套通用的React组件库模版。目前通过这套模板也搭建过好几个组件库。 为了让这个模板更干净和通用,我把所有和低代码相关的代码都剔除了,只保留最纯粹的…...

c++ atomic
文章目录why atomic?sequentially consistent atomicRelaxed memory modelswhy atomic? 当我们有一片内存空间S,线程A正在往S里写数据,这个时候线程B突然往S中做了操作,导致线程A的操作结果变得不可预知(对线程A来说),这种情况换句话说叫做data race,我们一般的操作时上锁,在…...

要想孩子写作文没烦恼?建议家长这样做
说起语文学习,就不得不提作文。作为语文学习中的重中之重,作文写作一直是压在学生和家长身上的一块“心头大石”。发现很多孩子在写作文时,往往存在四大问题:写不出、不生动、流水账、太空洞。如今,孩子怕写作文&#…...

基于Python的高光谱图像分析教程
1、前言超光谱图像 (HSI) 分析因其在从农业到监控的各个领域的应用而成为人工智能 (AI) 研究的前沿领域之一。 该领域正在发表许多研究论文,这使它变得更加有趣! 和“对于初学者来说,在 HSI 上开始模式识别和机器学习是相当麻烦的”ÿ…...

【图神经网络】从0到1使用PyG手把手创建异构图
从0到1用PyG创建异构图异构图创建异构图电影评分数据集MovieLens建立二分图数据集转换为可训练的数据集建立异构图神经网络以OGB数据集为例HeteroData中常用的函数将简单图神经网络转换为异质图神经网络GraphGym的使用PyG中常用的卷积层参考资料在现实中需要对 多种类型的节点以…...

2023美赛春季赛思路分析汇总
将在本帖更新汇总2023美赛春季赛两个赛题思路,大家可以点赞收藏! 2023美赛春季赛各赛题全部解题参考思路资料模型代码等全部实时更新!第一时间获取全部美赛春季赛相关资料! 目前思路整理仅为部分,请大家耐心等待&…...

GPT4国内镜像站
GPT-4介绍GPT-4是OpenAI发布的最先进的大型语言模型,是ChatGPT模型的超级进化版本。与ChatGPT相比,GPT-4的推理能力、复杂问题的理解能力、写代码能力得到了极大的强化,是当前人工智能领域,最有希望实现通用人工智能的大模型。但G…...

代码随想录算法训练营第四十八天| 198 打家劫舍 213 打家劫舍II 337 打家劫舍III
代码随想录算法训练营第四十八天| 198 打家劫舍 213 打家劫舍II 337 打家劫舍III LeetCode 198 打家劫舍 题目: 198.打家劫舍 动规五部曲: 确定dp数组以及下标的含义 dp[i]:考虑下标i(包括i)以内的房屋,最多可以偷…...

飞桨DeepXDE用例验证及评估
在之前发布的文章中,我们介绍了飞桨全量支持业内优秀科学计算深度学习工具 DeepXDE。本期主要介绍基于飞桨动态图模式对 DeepXDE 中 PINN 方法用例实现、验证及评估的具体流程,同时提供典型环节的代码,旨在帮助大家更加高效地基于飞桨框架进行…...

telegram连接本地Proxy连接不上
1.ClashX开启允许局域网连接。 2.重启ClashX和Telegram...

【分布式版本控制系统Git】| 国内代码托管中心-Gitee、自建代码托管平台-GitLab
目录 一:国内代码托管中心-码云 1. 码云创建远程库 2. IDEA 集成码云 3. 码云复制 GitHub 项目 二:自建代码托管平台-GitLab 1. GitLab 安装 2. IDEA 集成 GitLab 一:国内代码托管中心-码云 众所周知,GitHub 服务器在国外&…...