嵌入式基础
嵌入式开发
- 开发环境
- 交叉开发环境:串行、局部以太网、OCD链接在一起,内部通过通信协议建立逻辑链接
- 特点:
- 运行在不同环境
- 可以独立运行
- 调试器完成装载
- 外部通信调试器发出调试信号
- 可以调试不同指令集
- 兼有编译器:Glibc,KEIL
- 调试方式
- 插桩:增加一些器件,实现交叉调试
- 片上调试:在处理器内部嵌入一些控制模块,满足调试状态
- 软件仿真:纯软件,指令模拟器和系统级调用模拟器
- 指令模拟器:用一台计算机模拟嵌入式程序运行工程,ARMEmulator,SkyEye
- 系统级模拟器:ROM Monitor(一段运行在目标板的驻留监控代码)
- 初始化要求的外围设备,初始化用于下载映像的内存系统,初始化中断控制器和安装中断处理程序,初始化自己的程序空间,等待宿主机的命令。
- rom仿真:用于替代硬件芯片的设备
- 减少擦除损伤
- 要和cpu通信,缺点没有克服
- ICEemulator:替代目标机上的CPU,可以完成一些特殊调试,只能完成部分型号售价贵
- OCD:片上调试
- 一般模式和调试模式
- BDM:后台调试模式
- JTAG:边界扫描模式
- OnCE:片上仿真器
嵌入式系统绪论
- 嵌入式系统定义:软硬件都是可裁剪的,低功耗可靠
- 嵌入式系统特点
- 软实时和硬实时
- 健壮可靠:固化在存储中
- 专用定制
- 资源紧缺:够用就行
- 不易垄断
- 嵌入式系统的组成
- 底层系统,应用软件,操作系统
- 嵌入式处理器
- MCU:把计算机需要的最小系统和外设,又称单片机
- DSP:专门处理数字信号,专属的微处理器
- MPU:需要在芯片以外配置RAM ROM 接口等片上外设
- SOC:可以放复杂的系统级代码
- 微处理器的性能指标
- 字长:一次并行处理存储加工的固定长度,可变或固定
- 体系结构:取指令和取数据并行,数据宽度可以不同。哈佛结构提高了吞吐率,适合DSP
- 指令集:CIPS指令长度可变,8/2。RISC指令长度固定,只包含最有用的,硬件结构相对简单。
- 运算速度:MIPS
- 流水线:便于并行,提升运算速度
- 存储器
- SRAM:静态存储,不需要刷新,晶体管制造速度快。cache
- DRAM:动态存储,需要刷新(预充电),电容。
- SDRAM:同步动态,S是同步时钟周期。
- PROM:只有一次写入,用于少量需求或者验证。
- EPROM:可重复擦除,过于专门(紫外线)
- EEPROM:字节最小单位
- FLASH:块是最小单位,删除速度快
- 外围设备
- 人机交互:LED、蜂鸣器、LCD,数字键盘、摇杆等
- 机机交互:传感器、伺服执行机构(继电器和电机)等
- 软件
- 驱动程序bootloader:和处理器有关;内核;根文件系统
- 循环轮询:简单,但对紧急事件不能响应
- 前后台系统:前台设置中断事件,外部事件前台先处理,然后后台继续。中断现场保护等
QEMU-ARMBuild
安装交叉编译器和qemu环境
#sudo apt install gcc-arm-linux-gnueabi
#dpkg -l gcc-arm-linux-gnueabi#verify
sudo apt install qemu qemu-system qemu-user
apt-cache search aarch64
sudo apt install gcc-10-aarch64-linux-gnu
mv /usr/bin/aarch64-linux-gnu-gcc-10 /usr/bin/aarch64-gcc#方便使用命名
make menuconfig
make -j8 ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu-
安装文件系统工具和调试工具
mkdir rootfs
git clone https://github.com/mengning/menu.git
cd menu
# 修改Makefile,去掉"find init hello ***"和"qemu -kernel ../linux"语句
cd ../rootfs
cp ../menu/init ./
find . | cpio -o -Hnewc |gzip -9 > ../rootfs.img
sudo apt-get install gdb-multiarch
配置内核编译文件
#make CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm defconfig
export ARCH=arm64
export CROSS_COPILE=aarch64-linux-gnu-
make defconfig
#需要可以配置initramfs路径为"/tmp/rootfs/xxx"
#勾选"Compile the kernel with debug info",以及其他调试需要的配置
编译至arch/arm/boot
挂载根文件系统
#busybox
mkdir -p rootfs/{dev,etc/init.d,lib}
cp busybox-1.20.2/_install/* -r rootfs/
sudo cp -P /usr/arm-linux-gnueabi/lib/* rootfs/lib/
qemu-img create -f raw disk.img 512M
mkfs -t ext4 ./disk.img
mkdir tmpfs
sudo mount -o loop ./disk.img tmpfs/
sudo cp -r rootfs/* tmpfs/
sudo umount tmpfs
file disk.img
qemu-system-arm -M vexpress-a9 -m 512M -kernel ./linux-4.14.212/arch/arm/boot/zImage -dtb ./linux-4.14.212/arch/arm/boot/dts/vexpress-v2p-ca9.dtb -nographic -append "root=/dev/mmcblk0 rw console=ttyAMA0" -sd disk.img
#关闭虚拟机
killall qemu-system-arm
#menu
mkdir rootfs
git clone https://github.com/mengning/menu.git
cd menu
# 修改Makefile,去掉"find init hello ***"和"qemu -kernel ../linux"语句
cd ../rootfs
cp ../menu/init ./
find . | cpio -o -Hnewc |gzip -9 > ../rootfs.img
#gdb调试
qemu-system-aarch64 -M virt -cpu cortex-a53 -smp 2 -m 4096M -kernel /tmp/arch/arm64/boot/Image.gz -nographic -append "console=ttyAMA0 init=/linuxrc ignore_loglevel" -initrd /tmp/rootfs/rootfs.img -S -gdb tcp::9000
#gdb链接
gdb-multiarch /tmp/linux5.10/vmlinux
target remote :9000
ARM-v8指令集
异常等级
软件运行异常级别:
EL0
: 普通用户应用程序EL1
: 操作系统内核通常被描述为特权EL2
: 管理程序EL3
: 低级固件,包括安全监视器
寄存器
32 位 W 寄存器构成相应 64 位 X 寄存器的下半部分。 也就是说,W0映射到 X0 的低位字,W1 映射到 X1 的低位字
通用寄存器
- 参数寄存器
(X0-X7)
: 用作临时寄存器或可以保存的调用者保存的寄存器变量函数内的中间值,调用其他函数之间的值(8 个寄存器可用于传递参数) - 来电保存的临时寄存器
(X9-X15)
: 如果调用者要求在任何这些寄存器中保留值调用另一个函数,调用者必须将受影响的寄存器保存在自己的堆栈中帧。 它们可以通过被调用的子程序进行修改,而无需保存并在返回调用者之前恢复它们。 - 被调用者保存的寄存器
(X19-X29)
: 这些寄存器保存在被调用者帧中。 它们可以被被调用者修改子程序,只要它们在返回之前保存并恢复。 - 特殊用途寄存器
(X8,X16-X18,X29,X30)
:X8
: 是间接结果寄存器,用于保存子程序返回地址,尽量不使用
X16
和X17
: 程序内调用临时寄存器X18
: 平台寄存器,保留用于平台 ABI,尽量不使用
X29
: 帧指针寄存器(FP)X30
: 链接寄存器(LR)X31
: 堆栈指针寄存器 SP 或零寄存器 ZXR
NEON和浮点寄存器
A64指令集
A64 特点
- 移除了批量加载寄存器指令 LDM/STM, PUSH/POP, 使用 STP/LDP 一对加载寄存器指令代替;
- 没有提供访问 CPSR 的单一寄存器,但是提供访问 PSTATE 的状态域寄存器;
- A64 没有协处理器的概念,没有协处理器指令 MCR,MRC;
- 相比 A32 少了很多条件执行指令,只有条件跳转和少数数据处理这类指令才有条件执行。附件为条件指令码;
指令格式
<Opcode>{<Cond>}<S> <Rd>, <Rn> {,<Opcode2>}
Opcode
:操作码,也就是助记符,说明指令需要执行的操作类型Cond
:指令执行条件码,查看附件图;S
:条件码设置项,决定本次指令执行是否影响 PSTATE 寄存器响应状态位值Rd/Xt
:目标寄存器,A32 指令可以选择 R0-R14,T32 指令大部分只能选择 RO-R7,A64 指令可以选择 X0-X30;Rn/Xn
:第一个操作数的寄存器,和 Rd 一样,不同指令有不同要求;Opcode2
:第二个操作数,可以是立即数,寄存器 Rm 和寄存器移位方式(Rm,#shit);
内存访问指令
加载指令
LDR Rt, <addr>
LDRB
(8-bit, zero extended).LDRSB
(8-bit, sign extended).LDRH
(16-bit, zero extended).LDRSH
(16-bit, sign extended).LDRSW
(32-bit, sign extended).
存储指令
STR Rn, <addr>
ARM家族
内核(架构)版本 | 处理器版本 |
---|---|
ARMv1 | ARM1 |
ARMv2 | ARM2、ARM3 |
ARMv3 | ARM6、ARM7 |
ARMv4 | StrongARM、ARM7TDMI、ARM9TDMI |
ARMv5 | ARM7EJ、ARM9E、ARM10E、XScale |
ARMv6 | ARM11、ARM Cortex-M |
ARMv7 | ARM Cortex-A、ARM Cortex-M、ARM Cortex-R |
ARMv8 | ARM Cortex-A30、ARM Cortex-A50、ARM Cortex-A70 |
- Cortex-A,代表先进的意义(Advanced),目标是以最佳功耗实现最高性能,主要应用领域包括汽车、工业、医学、调制解调器、存储等。Cortex-A也是目前应用最广的处理器版本
- Cortex-M,代表微处理器的意义(Microcontrollers),目标是最节能的嵌入式设备,主要应用领域包括汽车、能源网、医学、嵌入式、智能卡、智能设备。传感器融合、穿戴设备等。
- Cortex-R,代表实时的意义(Real-Time),目标是实时任务处理,主要应用领域包括汽车、相机、工业、医学等。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现