第 2 章 嵌入式软件开发的基本逻辑

目录

2.1. 嵌入式软件开发的基本逻辑
2.1.1. 按照是否有操作系统
2.1.2. 按照操作系统是否是私有的
2.2. 嵌入式软件开发内容分类
2.3. 嵌入式软件期间会涉及哪些内容
2.4. 嵌入式软件开发需要学习哪些知识
2.4.1. 嵌入式领域内相对通用的知识和技能
2.4.1.1. 嵌入式相对通用的知识:计算机编程语言
2.4.1.1.1. 嵌入式相对通用语言:C语言
2.4.1.1.2. 嵌入式相对通用语言:汇编语言
2.4.1.1.3. 嵌入式相对通用语言:C++语言
2.4.1.2. 嵌入式相对通用的知识:芯片架构
2.4.1.3. 嵌入式相对通用的知识:嵌入式操作系统
2.4.1.3.1. 嵌入式常用操作系统:嵌入式Linux
2.4.1.3.2. 嵌入式常用操作系统:μC/OS-II
2.4.1.3.3. 嵌入式常用操作系统:ThreadX
2.4.1.3.4. 嵌入式常用操作系统:VxWorks
2.4.1.3.5. 嵌入式常用操作系统:WinCE
2.4.1.3.6. Android不是传统意义上的嵌入式操作系统
2.4.1.3.6.1. Android和嵌入式Linux的区别
2.4.1.4. 嵌入式相对通用的知识:嵌入式开发环境搭建和使用
2.4.1.4.1. 嵌入式开发环境:交叉编译器
2.4.1.4.2. 嵌入式开发环境:固件的烧写
2.4.1.4.3. 嵌入式开发环境:调试
2.4.1.4.3.1. 嵌入式开发调试方法和调试工具
2.4.1.4.4. 嵌入式开发环境:嵌入式IDE
2.4.2. 嵌入式领域内某领域内相关特定知识
2.4.2.1. 嵌入式领域相关知识之消费类数码
2.4.2.2. 嵌入式领域相关知识之工业自动化控制
2.4.2.3. 嵌入式领域相关知识之汽车电子
2.4.2.4. 嵌入式领域相关知识之医疗器械
2.4.2.5. 嵌入式领域相关知识之航空航天
2.5. 嵌入式系统中从底层硬件到上层软件之间的逻辑层次和映射关系

摘要

2.1. 嵌入式软件开发的基本逻辑

包括嵌入式软件开发的知识体系和背景:

先说背景:

计算机,领域内,知识体系,按层次分,可以分为:

  • 上层:纯软件
  • 中间:嵌入式
  • 底层:硬件

其中:

  • 纯软件:无需实际接触硬件,写代码,也不会涉及到操作硬件

    ->当然你对硬件的工作方式,工作机制,特点等内容有了解,自然更容易设计出,写出高质量的软件代码

  • 嵌入式:全称算是嵌入式软件

    注意:对应的,很多时候,也有把嵌入式硬件,简称为嵌入式的。

  • 嵌入式软件方面,更多的时候,写的代码,都是和硬件打交道的。

此处,暂且不讨论上层的纯软件,以及底层的硬件,只是简要概述一下,中间的嵌入式,尤其是嵌入式软件部分的知识体系,基本架构:

2.1.1. 按照是否有操作系统

按照是否有操作系统,可分为:

  • 无OS的嵌入式系统

    其中,无OS的,相对比较简单:一个大循环,

    http://www.segger.com/admin/uploads/productDocs/UM01001_embOS_Generic.pdf

    提到的那个Super Loop

  • 有OS的嵌入式系统

    有OS的,往往架构都和OS有关:

    • 应用程序
      • 应用程序
      • 库函数
    • 操作系统内核
      • 各个功能模块:网络,文件系统,进程通信,进程管理,存储管理
      • 硬件抽象层HAL
    • 硬件

    典型的嵌入式Linux软件系统,根据不同的阶段和模块分,又可以分为:

    • Bootloader:最常见的就是Uboot了
    • Rootfs:根文件系统
    • Kernel:嵌入式Linux内核

    更多详细的解释,请参见:嵌入式Linux软件开发详解

2.1.2. 按照操作系统是否是私有的

其中有OS的,按照是否是开源的,是否是常用的,通用的,还是私有分,可以分为:

  • 开源的/常见的/通用的 嵌入式操作系统

    开源的/常见的/通用的 ,并不是等价的,但是只是此处相对于私有的来说,从概念上和逻辑上,是等价的。

    常见的有:嵌入式Linux(及其衍生物Android),QNX,VxWorks,ucOS/II,TRON(ITRON),WinCE等等。

  • 私有的嵌入式操作系统

什么叫做,写的代码,是和硬件打交道的?

意思是:对于物理上,真实存在的硬件设备,写代码,操作对应的硬件设备,往往是写硬件的驱动程序之类的

什么叫做,写代码操作硬件设备?

本质上就是:写代码,设置,配置硬件

往往都是:读写硬件设备的寄存器,从而达到使得硬件可以工作,可以正常工作的目的。

什么叫做用代码驱动硬件工作,即什么叫做硬件设备驱动?

背景:

硬件有各种功能,特性;

目的:

希望硬件按照我们所希望的方式,去工作;

需要做的事情:

大体分两步:

  1. 初始化硬件
  2. 实现硬件数据的读写

举例:

一个典型的,在嵌入式Linux系统中,实现对应的SD卡的

背后的逻辑

我们的目标

以及具体如何去写SD卡驱动的大概步骤和逻辑就是:

SD卡,插入到开发板的SD卡插槽上,然后开发板中正在运行的嵌入式Linux系统,可以识别出该SD卡,并且可以实现SD的数据的读写:

  • 读:把里面的数据拷贝出来,比如里面有张图片,可以把图片这个文件的数据拷贝出来
  • 写:往里面写数据,比如想要拷贝一首歌曲到SD中

那么,我们就需要:

在嵌入式Linux系统中,为SD卡写驱动

其大概的逻辑和步骤是:

  1. SD的初始化部分

    去设置对应的SD卡的寄存器,申请各种相关的软硬件资源(此部分相关细节很多,待以后详解)

    即把SD卡配置成你需要的工作模式了,然后再去实现后续的数据读写。

  2. 让SD卡工作的部分:实现数据的读写

    然后再去(Linux的相关的驱动框架下)写相关的SD的数据的读写的功能

    操作对应的寄存器

    把数据从SD的相关的数据寄存器中读出来

    或者是

    把要写入的数据,写入到SD的相关的数据寄存器中

    其他相关的内容还有:为了提高数据读写速度,可以去利用DMA,如果有DMA可用的话