ARM嵌入式Linux系统开发简述

0

嵌入式系统组成

软件:应用软件、嵌入式操作系统
硬件:嵌入式微处理器、外部设备

计算机组成

中央处理器、存储系统、总线系统、输入输出系统

操作系统

基本结构:内核、驱动程序、程序库
设计思路:以微内核为例,注重把系统的基本操作(中断处理、内存管理等)和服务功能(网络数据传输)分开。Linux采用微内核设计思路。

操作系统位数

即地址总线数量,地址总线是用一串数字来标记一个内存中存储位的地址。

ARM

Thumb指令集

ADD 操作数加法
MOV 寄存器复制
等等…

处理器工作模式

Thumb状态(16位)、ARM状态(32位)

存储系统

MMU 可以实现从虚拟地址到物理地址之间的映射。

寻址方式

1.立即寻址
2.寄存器寻址
3.偏移寻址
等等…

Linux常用工具

脚本Shell:如bash,用户通过shell使用系统提供的功能
文本编辑工具vi
搜索工具find和grep(grep支持正则表达式)
FTP工具:标准互联网文件传输协议
串口工具:minicom

Linux应用程序

编译阶段

1、词法分析:扫描源代码中的单词,把字符描述的程序转换为符号描述的中间程序。
2、语法分析:分析单词符号是否符合语法要求
3、中间代码生成
4、代码优化(依赖计算机的类型)
5、目标代码生成:生成汇编语言代码(还需要经过汇编程序汇编)或者机器语言代码。
预处理-》编译-》汇编-》机器码

Makefile

文本文件:GNU make程序执行时候默认读取的配置文件。它定义了文件之间的依赖关系,通过对比目标文件和依赖文件的时间戳(文件修改时间),决定是否需要执行相应的命令。还可以定义变量,接收用户传递的参数。

内存管理

堆和栈的区别:

栈区:编译器分配释放,存放函数的参数、局部变量等。
堆区:由程序员管理,用操作系统提供的分配和释放函数动态分配内存。

文件描述符

任何打开的文件都将被分配一个唯一标识该打开文件的文件描述符(大于0的int)。

多进程/多线程

进程

PCB:进程控制块,管理进程
进程:操作系统分配资源的最小单位

创建:
pid_t = pid; //int类型
pid = fork();

进程间通信:管道、消息队列、信号量、共享内存等。

线程

线程:操作系统调度的最小单位,轻量级进程,没有系统资源。
创建:
pthread_t tid;
pthread_create(&tid, NULL, thread_func,&t_arg)
调用时:
gcc name.c -lpthread

网络编程

TCP/IP协议族模型

应用层:FTP、http
传输层:TCP、UDP
网络互联层:IP
主机到网络层:以太网协议802.11

IP:寻址和分段
TCP:面向连接的可靠传输协议

Socket

概念:网络上的通信端点,封装了通信的细节
创建:socket()

多连接:select、poll,检测集合中可读或者可写的文件
poll()解决了socket()的一些问题,函数调用也更加简洁

Bootloader

概念:嵌入式系统复位后进入操作系统前执行的一段代码

U-Boot

stage1:汇编编写,初始化寄存器与内存,复制代码和中断向量表到RAM,设置堆栈等。
stage2:C编写,初始化Flash与网络设备、检测系统内存与映射

Linux嵌入式初始化

嵌入式系统初始化流程:设置中断向量-》配置系统寄存器-》初始化看门狗和外围电路-》初始化存储器-》初始化堆栈指针-》进Bootloader-》加载linux内核映像-》启动Linux内核。

交叉编译

Linux平台上ARM的交叉编译器是arm-linux-gcc编译器

内核和应用程序调试

gdb:GNU发布的调试器,不仅可以调试普通的应用程序,还可以调试正在运行的进程和线程甚至内核,支持多语言多平台。
功能:可以列出源代码、设置断点、显示程序变量等。

Linux内核移植步骤

ARM体系有关的内核代码存放在Linux内核中arch/arm目录。

1 建立目标平台工程框架

1.1 加入编译菜单项
1.2 设置宏与代码文件的对应关系
1.3 测试工程框架

2 建立目标平台代码框架

2.1 建立machine_desc结构
2.2 加入处理函数
2.3 加入定时器结构
2.4 测试代码结构

3 构建目标板代码

3.1 编写处理器初始化代码
3.2 编写端口映射函数
3.3 引入内核中断处理函数
3.4 引入内核定时器结构
3.5 编译最终代码

Guess you like

Origin blog.csdn.net/weixin_44576259/article/details/120768853