从零开始的嵌入式Linux生活(一) 背景介绍

文章目录

  • 前言
  • 本系列文章的主要思想:
  • 本系列文章包括:
  • 一、什么是嵌入式开发
  • 二.从嵌入式单片机 到 嵌入式Linux 再到 Android
  • 三.一个嵌入式开发的例子
  • 一个假设:
  • 简简单单的写点代码
  • 越来越过分 – RTOS系统
  • 融资成功 – 嵌入式Linux系统
  • 老板飘了 – 安卓系统

  • 前言

    近年来(截至2023年3月),随着各种各样的因素:实体经济、米国制裁、芯片热、智能汽车等, 嵌入式软件开发(Embedded Software)越来越火热,众多的芯片公司、应用方案公司、甚至是代理商公司如雨后春笋般成立; 各大招聘网站上“嵌入式开发”“驱动开发”等岗位也成为了热门高薪急招岗位。

    作者我本人毕业于19年,在某大厂从事了约大半年的互联网前端开发后,转向了嵌入式开发的领域。 从51单片机开始、到32位MCU、再到嵌入式Linux、嵌入式安卓,一步一步的坚持下来了。 这其中离不开自己的努力,但更多的还是受益于互联网的分享精神。 所以我打算写这个关于嵌入式Linux的全方位指南,一方面是对自己的总结提升,另一方面也是回馈感谢互联网上各位网友的分享。

    本系列文章的主要思想:

    尽量广泛的介绍嵌入式开发的各个部分,力求涉及面广泛,但不一定很深入。 各位读者对某个部分感兴趣的话再自行了解。

    在阅读本文之前,如果你有嵌入式开发的基础、单片机MCU开发的基础,会更好理解。 如果没有的话也没有关系,建议可以淘宝购买51单片机、STM32单片机开发板进行快速的学习(大约几十~100块),淘宝上的开发板一般都附赠教程。

    本系列文章包括:

    (一)背景介绍:主要介绍什么是嵌入式开发,其中嵌入式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 再到 Android

    本文的标题中有“嵌入式Linux”的字样,那么这个时候有好奇的同学就会问了:什么是嵌入式Linux?除了嵌入式Linux难道还有嵌入式Windows? 答案是Yes,其实在嵌入式开发的领域中,是这样的:

    正如上文所说,嵌入式设备价格、功耗等各方面的考虑,其系统组成可能极其简单。 以最简单的51单片机为例:

    如上述图片所示,这个嵌入式系统的组成就是一个单片机(图中方形的那个芯片)、一个晶振、几个电阻,其中可能只执行一个while(1)无限循环。 而这个单片机的内部组成也十分简单,如下图所示:

    不要看这个图片花里胡哨的,这可是我国的核心科技STC51单片机的官网:http://www.stcmcudata.com。无数的嵌入式人才、芯片人才都是从STC一步一步培养出来的。

    如上图绿框所示,这个单片机内置了大容量的”12KB”RAM内存,“128KB”ROM(类似于PC机的硬盘)。 看到这里相信你已经有一些体会了,嵌入式系统真的节约啊~;对比起来,我们常用的PC机,都是8G RAM内存,1TB硬盘的高端配置。 在这么有限的资源情况下,显然并不能将Linux、Windows这样的操作系统放上去运行,一个Windows安装包都得4个G,这哪够啊。

    因此在嵌入式系统中,根据系统资源的由少到多,可能会运行一些其他的系统,通常所用的操作系统如下:

    资源数量 操作系统 备注 代表芯片
    极少(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个部分:

    1. CPU,用来执行代码,检测开关有无被按下,如果有,则立即控制对应的射频电路。
    2. 电源,5V电池供电
    3. 开关,五个按键开关,按下后对应的电路会被接通,CPU能够检测到
    4. 射频电路,用于接收声音信号
    5. 喇叭,播放射频电路接收的声音

    简简单单的写点代码

    假设除了1中的CPU执行的代码以外,2345都有硬件工程师帮我们准备好了,那么接下来我们只需要参考CPU厂家提供的方法,写代码即可。

    假设我们使用的是上文所说的神器:STC单片机:

  • 型号:STC32G
  • 官网:http://www.stcmcudata.com/
  • 芯片手册:http://www.stcmcudata.com/STC8F-DATASHEET/STC32G.pdf
  • 长相:
  • 接下来我们开始写程序… 咦? 怎么芯片手册中都帮我们把程序写好了,STC果然是神器啊 哈哈。
    不难看出,下面的程序实际上只有一个while循环,芯片不停的执行while里面的代码就行了


    接下来我们把程序编译、烧录下载到芯片里面去。 如何编译、烧录一般芯片的官方都会有文旦个,STC也有非常详细的说明:

    详情请见: http://www.stcmcudata.com/STC8F-datasheet/STC-TOOL.pdf

    到这里似乎一个嵌入式系统的基本流程就已经跑通了,到这里,其实就是叫做bring up OK了,以后你会听到很多次bring up这个术语。

    后续的工作都在bring up的基础之上修修补补, 可能过一会儿发现射频部分信号又不好了,要配合硬件工程师调试一下; 可能再过一会儿,产品经理又提了个需求,要调节音量的大小; 甚至再过一年,公司要新开发一个收音机2.0。

    越来越过分 – RTOS系统

    果然过了一年,公司要新开发一个收音机2.0。产品经理越来越过分,要求我们的收音机要能够做到:

    1. 有红黄绿3个指示灯:
      a. 红灯是电源灯,每1秒闪烁一次提示有电
      b. 黄灯是警告灯,电池电压小于4V时开始每0.7秒闪烁一次
      c. 绿灯是正常运行灯,只要程序在运行,就每0.3秒闪烁一次

    2. 增加一个声音分贝传感器,每10秒采集一次周边环境声音,如果环境声音大于50分贝,则认为此时播放了声音用户也听不见,此时关闭扬声器。

    这么多需求,一个while循环写不下了啊。

    有需求就会有解决方案,此时小型操作系统 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生活(二)启动准备:开发板硬件平台、环境搭建

    物联沃分享整理
    物联沃-IOTWORD物联网 » 从零开始的嵌入式Linux生活(一) 背景介绍

    发表评论