嵌入式开发可以这样学 之--总体目录

新年开新篇!准备出个嵌入式开发相关的系列博文,在这里立一个FLAG
打算通过这一系列文章,整理一下这几年开发过程中思考的东西,对自己是个总结;对相关领域的开发者,希望也能有所帮助。

先来看一个全局图,该图展示了一个嵌入式产品的全貌,从硬件到系统到库到上层架构。本系列博文的内容也就依此图结构而展开讨论。

嵌入式开发可以这样学 之--总体目录_第1张图片

这幅图中的内容细节并不重要,主要是展现嵌入式开发中涉及的方方面面。本来是想整理个Android系统的,但是过于庞大复杂,不见得能提炼出来,而且最终效果可能也不见得比上面这幅图好多少,所以决定还是不弄了。不过,这里放一个Android官方的框架图,粗略一窥高级的嵌入式产品的全貌。来源:平台架构  |  Android 开发者  |  Android Developers

嵌入式开发可以这样学 之--总体目录_第2张图片

   继续说上面第一副图。这幅图展示了对一个嵌入式产品的整体思考过程。从左上到右下,简单对图做一个说明。首先是左边的总体分类,包括了外观、接口、功能及测试。外观和接口影响产品的硬件制版,工业设计。比如是否包含风扇,几个USB接口,是否有高清接口,网口在前面还是后面,有无按钮等。硬件电路板设计关系到粗略的模块构成图以及详细的原理图,再到更细致的PCB图等。其中,原理图影响驱动程序的实现,比如具体用的总线地址范围等;模块构成图则影响软件的设计考虑。再看功能部分,拆分为两部分,一部分跟硬件有较大关系,为存储分区划分。嵌入式设备多以Flash为存储设备,分区也是其特有的。分区关系到bootloader、内核以及文件系统的存放和使用。对于纯粹软件部分,涉及到多个分层图,比如包含驱动、内核和应用的大分层图,单纯包含软件的小分层图,以及到核心模块的多个细分图。对于测试部分,包含了bug列表处理,测试报告以及脚本设计等。通过这幅图,产品负责人对一款嵌入式产品基本上就可以全面了解了。

   通过上面的第一幅图,我们引出本系列博文的目录结构。下面具体列出,并做简单说明。

   主要内容分为三大部分:

   第一部分 基础概念,从硬件模型说起

   这部分主要抽象硬件。在实际介绍过程中,我们会忽略不少细节,内容还是更偏向于程序和软件角度。总的来讲,对硬件的介绍,一方面是为了完整性;另一方面则是为了更好的说明与程序的关联,毕竟硬件的一些特性还是不能完全忽略不管的。为了达到这一目标,这里利用了模型的方法来介绍。所以说,这里的硬件,非模电数电中的硬件电路,而是从软件角度抽象出来的硬件。具体的分为六个子部分:

   1 CPU模型

   模型化一个CPU,为后面分析问题,提供基础。

   参见:1-嵌入式开发总结之--CPU模型_龙城赤字的博客-CSDN博客

   2 内存模型

   模型化内存,忽略硬件细节,包括什么刷新了,控制线、地址线及数据线了之类的。程序的角度在这一部分会体现的更明显。

   参见:2-嵌入式开发总结之--内存模型_龙城赤字的博客-CSDN博客

   3 磁盘模型

   从文件系统角度模型化磁盘,后续讨论就简单看为一块完整的存储区域。即保留区块特色,忽略磁头柱面等概念。

   参见:3-嵌入式开发总结之--磁盘模型_龙城赤字的博客-CSDN博客

   4 显示模型

   GUI系统模型概念。最终抽象为显存像素点概念,忽略显像原理。

   参见:4-嵌入式开发总结之--显示模型_龙城赤字的博客-CSDN博客

   5 外设模型

   各种输入输出设备会抽象为寄存器模型,忽略具体是什么外设,有什么特色。

   参见:5-嵌入式开发总结之--外设模型_龙城赤字的博客-CSDN博客_嵌入式开发板外设

   6 整合模型

   将各硬件模型整合起来,也就是相互串起来,组成系统模型。这一模型在后面的软件和程序介绍中会经常用到。

   参见:6-嵌入式开发总结之--整合模型_龙城赤字的博客-CSDN博客

   第二部分 软件系统的模型

   软件系统模型分为操作系统和应用程序两部分。操作系统不用多说,而应用程序部分会按照构成、运行、扩展、架构一步一步深入,最后以Android作为实际例子,进行综合展示。

   7 操作系统基础

   会具体介绍进程概念、内存的管理、文件系统实现等。最终,构建出软件执行的基础环境,即操作系统环境,然后介绍程序。这就好比一个车间,各种工具都准备齐全了,工人就可以发挥想象做出各种各样实用好用的产品出来。

   7.0 操作系统基础

   参见:7-操作系统基础_龙城赤字的博客-CSDN博客

   7.1 操作系统也是程序

   参见:7.1-操作系统也是程序_龙城赤字的博客-CSDN博客

   7.2 中断

   参见:7.2 中断_龙城赤字的博客-CSDN博客

   7.3 进程管理

   7.4 内存管理

   之一:

   参见:7.4 Step by step之虚拟内存一_龙城赤字的博客-CSDN博客

   之二:

   参见:7.4 Step by step之虚拟内存二_龙城赤子的博客-CSDN博客

   之三:

   参见:7.4 Step by step之虚拟内存三_龙城赤子的博客-CSDN博客

   之四:

   参见:7.4 Step by step之虚拟内存四_龙城赤子的博客-CSDN博客

   之五:

   参见:7.4 Step by step之虚拟内存五_龙城赤子的博客-CSDN博客

   8 程序的构成

   程序本身构成的静态分析,包括数据区、代码区、变量存放以及目标代码的生成、可执行文件等。

   从这部分开始,我们将结合前面有关操作系统的基础内容,来展示程序的前生来世,展示内存中一个活生生的程序,让读者从另一个角度看到动态的程序运行。

   首先,我们来静态的解剖一个程序,看看它里面有那些东西。

   使用PC(Windows/macOS)或者移动终端(Android/iPhone)的人,要想运行一个程序,只需鼠标双击程序图标或者触摸屏幕点击应用图标就可以了,十分的方便。要知道,早期没有图形桌面系统时,要在计算机上运行程序,是需要通过命令行等其他方式来完成的。两种方式对比一下,那个简单易用,可以立判。但不管那种方式,程序还是原来的程序,它们的构成并没有发生本质的变化,因为计算机的构成模型没有发生根本性的改变。

   从字符形式的代码到系统中运行的进程,对程序可以说得上是破茧而出的华丽转身。高级语言编写的程序,经过编译器的分析处理,重新转换,再经过连接器的组装加工,最终变为可执行的机器码(本质上也是二进制码)。一旦运行后,它们将作为一个进程,被操作系统管理,同时,依赖于操作系统的虚拟内存机制,使用着一块充足的内存空间,直到主动或者被动终止。在这部分,我们就看看这个转身是如何做到的。

   程序的构成之一

   参见:程序的构成之一_龙城赤字的博客-CSDN博客

   程序的构成之二

   参见:程序的构成之二_龙城赤字的博客-CSDN博客

   程序的构成之三

   参见:程序的构成之三_龙城赤字的博客-CSDN博客

   9 程序的运行分析

   有了上一部分的可执行文件分析,这块站在多个角度对运行过程的情景进行分析。

   参见:程序的运行视图_龙城赤字的博客-CSDN博客_运行视图

   10 大程序的构成与扩展

   讨论静态库、动态库、插件机制等。

   参见:从俄罗斯套娃看程序的扩展_龙城赤字的博客-CSDN博客

   11 软件架构讨论

   这是一个很大的话题。这里不讨论某个架构本身,而是整理架构相关的一些思考。当对程序构建过程了解后,就需要站在更高的角度来考虑大系统的设计实现问题。我们有了操作系统基础,有了程序构建基础,这就好比有了水泥钢筋,砖石及各种机械,知道如何用这些建造一所房子。但这并不能说明我们就可以建造高楼大厦了,而只能说是具备了这个可能性。可能只是基础,不代表能够,二者是不同层面的问题。架构在这里就好比是图纸,也是需要研究分析的。具体到程序,涉及到算法、接口函数、类、包、模块、设计模式等。这是一个复杂的综合问题,没有标准答案,需要经验积累,需要设计的感觉。

   11.1 软件架构讨论

   参见:软件架构讨论_龙城赤字的博客-CSDN博客

   11.2 架构思考之痛

   参见:架构思考之痛_龙城赤字的博客-CSDN博客

   12 Android实例分析

   以Android作为例子,结合软件架构内容,继续进行复杂化的情景分析,做软件部分的整合模型。之所以选择Android,我觉得Android是一个独特的典型。一方面它开源,我们可以在许多层面对它展开分析,而不会苦于没有源码,只能猜测;另一方面,它可以说是一个优秀的例子,活的例子,也就是说,作为一个商业化应用的系统,对之分析是有意义的,能学到真东西,而不用过多担心分析的东西是否经过实践的检验。

   说不定到时候会切到鸿蒙呢?又有谁知道将来会咋样呢!

   第三部分 开源软件杂谈

   既然谈到了Android,这里就顺势谈谈开源软件。相比早期程序员,现在的程序员可以说幸福多了,不管你对什么软件感兴趣,网上总能找到一些相关的开源系统供你研究,而不像以前,许多系统的代码都藏着掖着,生怕泄露出去,想研究都没有可学习的资料。但事物总是具有两面性,虽然资源丰富了,但是代码也变得复杂庞大了,许多软件都长大了,动辄几十万、上百万行级别,一个人即使不吃不喝,也看不了多少。这种情况,我们是不是就不用学习了呢?当然不是。学还是要学,只是学习的方法需要转变,因此,这部分就这块简单讨论一下。

   13 主题1--论开源软件

   开源软件,到底是陷阱还是馅饼?就此谈谈自己的看法。

   已整理完成,参考本人博文 《开源之我见》

    开源之我见_龙城赤字的博客-CSDN博客

   14 主题2--代码阅读

   如何阅读开源软件代码,避免陷入到代码的汪洋大海中。主要探讨探讨方法论的问题。

   已整理完成,参考本人博文  《谈谈如何阅读源码》

   谈谈如何阅读源码_龙城赤字的博客-CSDN博客

   15 主题3—实例分析

   就Android中所用的一些典型模块,谈谈开源软件在Android中的利用,从中即可看到Android系统的大,也可看到Android系统的小。

   16 随想观点

   随便发点感慨,所以可随便看之,亦或随便略之。

   参见:软件-进阶-产品-突破自我_龙城赤字的博客-CSDN博客

   最后,会列出一些自己看过的有用的书籍,供大家参考。

   

   当前这个目录结构还未脱离狭隘的程序视界。纵观软件业的发展,不论是硬件模块、软件语言还是实际产品,都在向更高的抽象层次发展。从程序、产品、系统、系统产品逐步提升,向平台化、智能化方向发展;从OS到Cloud,虚拟化,容器,集群等将CPU、内存、网络等抽象看做计算、存储、传输资源,实现软件的进一步突破发展。这些新的技术是为解决新的问题而提出的,这些新的解决方案,其实现思想,可整理出新的一章,叫从细胞到生态系统。

   就这个主题,本人也整理了一片博文,只不过名字不再叫从细胞到生态系统了^_^,而是《一文将大数据、云计算、物联网、5G(移动网)、人工智能等最新技术串起来》

   一文将大数据、云计算、物联网、5G(移动网)、人工智能等最新技术串起来_龙城赤字的博客-CSDN博客

你可能感兴趣的:(嵌入式开发,嵌入式,经验分享,程序人生)