嵌入式Linux复习
2023/6/22大约 8 分钟
嵌入式系统的基本概念
- 嵌入式系统是以应用为中心和以计算机技术为基础的,并且软硬件是可裁剪的,能满足应用系统对功能,可靠性,成本,体积,功耗等指标的严格要求的专用计算系统
嵌入式操作系统的基本功能
- 处理器的控制与管理
- 存储器的分配与管理
- 外部设备的控制和管理
- 文件的控制和管理
- 作业的控制和管理
嵌入式软件基本结构以及功能
1. 设备驱动层
设备驱动层是必不可少的重要部分,使用任何外部设备都需要有相应的驱动程序的支持,它为上层软件提供饿了设备的操作接口。
驱动层一般包括:
- 硬件抽象层
- 在于将硬件抽象化,是操作系统内核与硬件电路之间的接口层。
- 板级支持包
- 系统启动时,完成对硬件的初始化
- 为驱动程序提供访问硬件的手段
- 设备驱动程序
- 为上层软件提供设备操作的接口
2. 实时操作系统RTOS
嵌入式系统通常运行在特定的操作系统上,称为实时操作系统。
RTOS提供任务调度,资源管理,中断处理和通信功能,以确保系统的实时性和可靠性
3. 中间件
中间件屏蔽了底层操作系统的复杂性,使程序开发人员面对一个简单而统一的开发环境,降低程序设计的复杂性,将注意力集中在自己的业务上,不必再为陈旭在不同的系统软件上的移植而重复工作。中间件可以看作是一个API实现的软件层。
4. 实际应用程序层
应用程序是嵌入式系统中实现具体的功能模块,他们根据系统需求设计和开发,执行特定任务或提供特定的服务。
基于Linux的嵌入式软件
- BootLoader
- 内核
- 应用程序
Linux文件系统
Linux目录结构:

- /bin: bin是二进制的缩写,存放Linux常用操作命令的执行文件,如mv,ls,mkdir等
- /boot:存放操作系统启动时所需要的程序,如启动grub就会用到/boot/grub子目录
- /dev:包含所有Linux系统中使用的外部设备,实际上是一个访问这些外部设备的端口
- /etc:存放了系统管理时要用到的各种配置文件和子目录,如网络配置文件,文件系统,设备配置信息和设置用户信息等
- /etc/rc.d 存放Linux启动和关闭时候要用的脚本
- /etc/rc.d/init:新版为/etc/xinetd.d目录,存放所有Linux服务默认的启动脚本
- /home:Linux系统重默认的用户工具根目录
- /lib:存放系统动态链接共享库的.
- /media:光驱和软驱的挂载点
文件类型和文件属性
1. 普通文件
2. 目录文件
3. 链接文件
4. 设备文件
文件属性:
Linux常用命令
四个阶段:
| gcc/g++指令选项 | 功 能 |
|---|---|
| -E(大写) | 预处理指定的源文件,不进行编译。 |
| -S(大写) | 编译指定的源文件,但是不进行汇编。 |
| -c | 编译、汇编指定的源文件,但是不进行链接。 |
| -o | 指定生成文件的文件名。 |
| -llibrary(-I library) | 其中 library 表示要搜索的库文件的名称。该选项用于手动指定链接环节中程序可以调用的库文件。建议 -l 和库文件名之间不使用空格,比如 -lstdc++。 |
| -ansi | 对于 C 语言程序来说,其等价于 -std=c90;对于 C++ 程序来说,其等价于 -std=c++98。 |
| -std= | 手动指令编程语言所遵循的标准,例如 c89、c90、c++98、c++11 等。 |
- 预处理
gcc -E hello.c -o hello.i- 编译
gcc -S hello.i -o hello.s- 汇编
gcc -c hello.s -o hello.o- 链接
gcc hello.o -o hello在Linux上运行编写的c代码:
#include <stdio.h>
int main()
{
// printf() 中字符串需要引号
printf("Hello, World!");
return 0;
}
静态库和动态库
- 静态库:是一系列的目标文件(.o文件)的归档文件,文件格式为(libname.a),如果在编译某个程序时链接静态库,则链接器将会搜索静态库,从中提取出它所需要的目标文件并直接拷贝到该程序的可执行二进制文件(ELF格式文件)之中
- 动态库( 文件名格式为libname.so ):在程序编译时并不会被链接到目标代码中,而是在程序运行时才被载入
Makefile
文件
文件描述符的概念
- 一个非负整数,一个索引值,并指向内核中每个进程打开的文件记录表
- 所有对设备和文件的操作都使用文件描述符进行的
一个进程启动时,会打开三个文件,标准输入,标准输出和标准出错处理,这3个文件分别对应的文件描述符为0,1,2
基本I/O操作和标准I/O操作
串口通信
1.设置串口属性
2. 打开串口
3. 从串口读写数据
4. 关闭串口
进程
进程间的通信机制
1. 管道及有名管道
2. 信号通信
3. 信号量:
1.****semget():创建信号量或获得在系统已存在的信号量。不同
进程通过使用同一个信号量键值来获得同一个信号量。
**2. ** semctl():初始化信号量。当使用二维信号量时,通常将信
号量初始化为1。
3.****semop():进行信号量的PV操作。
4.****semclt()删除不需要信号量。
4. 共享内存
5. 消息队列
网络编程
socket概念
- socket是一种特殊的I/O接口,它也是一种文件描述符。是一种常用的进程间通信机制
- 一个完整的套接字则用一个相关描述{协议,本地地址,本地端口、远程地址、远程端口}来表示
- socket类似文件的概念,打开、连接建立、数据传输
TCP流程:


Linux设备驱动
驱动程序分类:
- 字符设备
- 块设备
- 网络设备
层次结构
- 硬件层(Hardware Layer):
- 硬件层是最底层的驱动程序层次,与物理硬件设备直接交互。
- 硬件层的驱动程序负责对具体硬件设备的控制和操作。
- 总线层(Bus Layer):
- 总线层提供了对硬件总线的抽象和管理,负责连接和控制硬件设备。
- 总线层的驱动程序用于管理特定类型的总线,如PCI总线、USB总线等。
- 核心层(Core Layer):
- 核心层提供了通用的驱动框架和设备模型,用于管理和操作设备驱动程序。
- 核心层的驱动程序实现设备注册、资源管理、设备访问接口等功能。
- 子系统层(Subsystem Layer):
- 子系统层是在核心层之上的一组功能相关的驱动程序组合,用于管理特定类型的设备或子系统。
- 子系统层包括网络子系统、块设备子系统、字符设备子系统等。
- 用户空间层(User Space Layer):
- 用户空间层包含运行在用户空间的驱动程序,通过系统调用和用户态库与内核进行通信。
- 用户空间驱动程序提供对设备的高级操作和服务,以及与应用程序的交互接口。
设备驱动开发流程
- 编写驱动源码
- 编写Makefile文件
- 编译驱动模块
- 加载驱动模块
NFS搭建

交叉编译

