目录

嵌入式系统学习笔记

嵌入式系统学习笔记

嵌入式系统概述

定义 举例说明

以应用为中心,以计算机技术为基础,软件硬件可裁剪( 量体裁衣 ),适用于应用系统,对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统

eg: 风扇 ,投影仪、家用电器、空间探测、卫星

特点

系统内核小、专用性强、系统精简、实时性高、具有多任务处理功能、系统裁剪方便

arm微处理器的寄存器结构

https://i-blog.csdnimg.cn/blog_migrate/1c91eacefddcb2a0354235a5811c2d0c.jpeg

嵌入式系统的设计与开发流程

https://i-blog.csdnimg.cn/blog_migrate/4eab3bba9855243dc612680b5f031dd1.jpeg#pic_center

  1. 需求分析的目的是确定设计任务和目标,制定说明文档

  2. 体系结构设计是嵌入式系统的总体设计,从功能上对软硬件进行划分

  3. 硬件的设计、制作、测试要确定硬件各功能模块和模块间的关联,并在此基础上完成一系列功能的设计、制作和测试

  4. 软件的设计、制作和测试与硬件开发并行、交互进行。主要完成引导程序的编制、操作系统的移植、驱动程序的开发、应用的编写等工作。

    (这里涉及一个问题:硬件没有设计好,软件如何运行在硬件上 —— 开发板基本上可以满足开发需求,采用开发板进行开发以提高开发效率。)

  5. 系统集成将测试完成的软件系统装入制作好的硬件系统中,进行系统综合测试

  6. 系统性能测试的最终目的是检验完成的系统性能是否满足设计任务书的各项性能指标和要求

嵌入式系统体系结构

嵌入式系统由硬件和软件两个部分组成。

硬件部分包括嵌入式 微处理器外围接口电路与设备 等,

软件部分包括嵌入式操作系统和用户的应用程序。

https://i-blog.csdnimg.cn/blog_migrate/0abdb657b8e5ae6caf62e60dfff918e4.png#pic_center

  • 区分:windows不属于嵌入式微处理器

嵌入式系统软件体系

两者皆可,驱动层是操作系统的一部分,bootloader是引导程序

我的理解:

采用boot loader的三层结构是系统加载过程中的软件体系结构

采用包含驱动层的三层结构是运行过程中的软件体系结构

应用层
操作系统
bootloader

https://i-blog.csdnimg.cn/blog_migrate/6fe703dcd25f76b701b943a867feb6f6.jpeg#pic_center

嵌入式Linux开发基础

Makefile作用,怎么编译

make工具通过一个叫makefile的文件来完成并自动维护编译工作。

makefile按照某种语法进行编写,其中说明了如何编译各个源文件并连接生成可执行文件,并定义了源文件之间的依赖关系。

最大的好处就是,只要把makefile写好,然后执行一个make命令就完成所有的编译了。

如何工作:在工作先编写makefile文件(或者利用tmake工具生成makefile文件),并在该工作目录下执行make命令(默认为 makefile中的第一个目标)

开发环境的建立

搭建Linux环境的方式

  1. 裸机安装
  2. 云端/远程
  3. 虚拟机
  4. WSL、Cygwin

ARM与宿主机的通信方式

(➕用法)

①串口通信:

使用串口进行数据传输,速度较慢

②USB接口:

其总线结构采用阶梯式的星型拓扑结构。统一了各种接口设备的连接头,具备MB级别的传输效率,可以一定程度上提高效率。

③JTAG接口:

最初,用于对芯片测试(在内部定义TAP,通过JTAG测试工具测试),现在常用于实现ISP(在线编程),对FLASH等器件进行编程。

④以太网接口:

以太网是通过广播技术进行数据包交换的局域网,连接在电缆上的设备使用CSMA/CD协议来争夺访问机会。

(eg:网线,网卡)通过以太网接口进行通信的速度较快,可以实现NFS文件共享、TFTP网络文件传输。

简述交叉开发的含义

在开发主机上进行编译,在目标板上运行的开发模式成为交叉开发

https://i-blog.csdnimg.cn/blog_migrate/5abaab8879862a08c92bb37212b0f031.jpeg#pic_center

为什么进行交叉编译

  1. 目标板与宿主机体系结构不同

  2. 可能原因:

    1) 有时是因为目的平台上 不允许或不能够安装我们所需要的编译器 ,而我们又需要这个编译器的某些特征;

    2) 有时是因为目的平台上的 资源贫乏无法运行 我们所需要编译器;

    3) 有时又是因为 目的平台还没有建立 ,连操作系统都没有,根本谈不上运行什么编译器。

Boot loader 的功能

Boot toader 是在操作系统内核或者这用户应用程序之前运行的一小段程序, 属于BIOS的一种, 可以用来 初始化硬件设备建主内存空间的映射图 ,从而将系统的软硬件环境带到合适的状态,为最终操作系统或者应用程序准备好正确的环境。

Boot loader的两种操作模式

启动加载模式:从目标板上的某个固态存储设备上将操作系统加载到RAM中运行,整个过程没有用户介入

下载模式:目标板上的boot loader将通过串口连接等通信手段从主机上下载文件。

Boot loader的启动过程

过程分为阶段1和阶段2

阶段1依赖于CPU体系结构的硬件初始化代码,包括以下步骤

①硬件初始化,为阶段2及随后内核的执行,准备好基本的硬件环境。

②为加载Bootloader的阶段2准备RAM空间,以获得更快的执行

③复制Boottoader阶段2的代码到RAM空间中

④设置堆栈

⑤跳转到阶段2的程序入口点

https://i-blog.csdnimg.cn/blog_migrate/16dd84580b9774ce352802475f90edad.jpeg

https://i-blog.csdnimg.cn/blog_migrate/cd7b8d21b088c8ff983f00b1d5e10ca9.jpeg

简述LINUX下的文件系统

文件系统是指文件存在的物理空间

ext2、ext3、VFAT、NTFS、ISO9660、jffs、ROMfs、NFS

arm-LINUX下的文件系统包括:

1)基于Flash的文件系统(jfts2、yaffs、 cramfs、 romfs)

2)基于RAM的文件系统(ramdisk、 ramfs/mpfs)

3)网络文件系统(NFS)

嵌入式Linux网络编程

简述TCP和UDP

TCP:为应用程序提供 可靠 的通信连接.适合于一次传输 大批数据 的情况,并适用于 要求得到响应 的应用程序。TCP对话通过三次握手来 初始化 。TCP实现可靠的基本协议是滑动窗口协议.

UDP:用户数据报协议,提供了 无连接 通信,不需要像TCP那样通过三次握手建立一个连接,尽力交付,适用于一次传输 少量 数据,可靠性由应用层负责.

简述socket

socket是一种 特殊的I/0 ,也是一种 文件描述符 。通过socket进行网络编程。通过socket实现 建立连接、传输数据操作.

包括3种socket类型:流式套接字,数据报套接,原始套接字

基于tcp的服务器客户端如何开发

https://i-blog.csdnimg.cn/blog_migrate/10afeff33f3da8396fe95e822394218e.png#pic_center https://i-blog.csdnimg.cn/blog_migrate/8ed3d9880695685485547f02fb3ac61c.jpeg#pic_center https://i-blog.csdnimg.cn/blog_migrate/af2469a9ab30da54f404713e36cdd082.jpeg#pic_center

嵌入式设备驱动

Linux内核把系统设备被分为三类,块设备、字符设备和网络设备。

简述linux中file_operation结构体的作用?

设备驱动程序是操作系统与机器硬件之间的接口,是内核的一部分,可以完成对设备的初始化和释放、数据传送、检测和处理设备错误功能。

在操作系统中,I/O设备的存取是通过一组固定的入口来进行的,在Linux中这组入口点由file_operation向操作系统说明。

下面这段不确定

向上:file_operation将驱动程序和系统调用关联起来。其中每一个成员的名字都对应着一个系统调用。用户进程利用系统调用在对设备文件进行诸如read/write操作时,系统调用通过设备文件的主设备号找到相应的设备驱动程序,然后读取这个数据结构相应的函数指针,接着把控制权交给该函数。

向下:厂家编写设备驱动程序的主要工作就是编写子函数,并填充file_operation的各个域。便于厂家开发驱动程序。

设备驱动程序最重要的是结构体。

依据具体功能划分,Linux设备驱动程序代码可划分为哪几部分?

  1. 驱动程序的注册和注销
  2. 设备的打开和释放
  3. 设备的读写操作
  4. 设备的控制操作
  5. 设备的中断和轮询处理

Linux的设备驱动程序在结构上可以分为三个主要组成部分:

(1)自动配置和初始化子程序

(2)服务于I/O请求的子程序

(3)中断服务子程序

驱动程序加载到内核方式

  1. 编译进内核
  2. 编译成模块