linux嵌入式编程学习笔记(0)

*IC, 电子, 计算机英文术语
*infocenter.arm.com
*Arm指令集, 芯片用户手册, 博客

gcc常用编译参数:

-E(仅仅对代码进行预处理, 不编译)
-S(只编译到汇编文件,  生成.s文件)
-c(只编译生成目标文件, 不链接, 生成.o文件)
-o(指定输出的文件名, 不链接)
-g(生成带有调试信息的debug文件)
-O2(编译器对代码的的优化等级, 一般选2)
-W(在编译中开启警告(warning)信息)
-l(指定头文件所在路径或指定所用的函数库)
-L(指定函数库所在路径)

git常用命令:

git config --global user.email xxx@xx.xx(设置邮箱)
git config --global user.name "xxx"(设置姓名)
git init(创建一个仓库)
git add xxx(将修改添加到暂存区)
git commit(将修改提交到本地仓库)
git log(查看提交历史)
git show xx(查看某一个(xx为哈希值)提交的信息)
git checkout xx(切换到xx分支)
git branch xx(新建xx分支)

最小系统:

系统运行的最小硬件配置: CPU 内存 I/O控制
嵌入式最小系统: 电源 时钟 CPU 内存(DDR) 外存(Flash 磁盘 SD卡等) 串口/JTAG

x86与ARM(AMBA)总线:

总线作用: 为了频率同步, 提高性能
	低速设备通过控制器连接总线, CPU通过倍频与总线通信工作
	RAM, 显卡等高频率, 大数据模块, 连接在高性能主线上
	串口, 打印机, I2C等低速设备连接在低速总线上
区别: x86总现在CPU外部, ARM总线在SOC内部

总线:

实质: 各种数字信号的集合
组成: 地址信号, 数据输入/输出信号, 控制信号, 电源线/接地线

总线编址:

统一编址: 内存和外设共享CPU寻址空间, 如ARM, MIPS
独立编址: I/O外设不占用CPU寻址空间, 独立编址, 使用独立命令访问, 如x86下的IN/OUT指令, 享有64K的I/O地址空间

精简指令计算机结构(RISC)

load/store体系结构, 只能处理寄存器的数据
固定指令长度, 单周期指令
流水线
倾向于使用更多的寄存器来存储数据

ARM指令集:

采用RISC但有差异
桶形移位寄存器: 单周期完成数据的各种移位操作
并非所有ARM指令都是单周期
Thumb指令集: 32位ARM指令集的压缩形式, 提高代码密度
条件执行: 减少分支指令数目, 提高代码密度
增加DSP指令

ARM工作模式:

User Mode(0b10000): 处理器正常运行时的工作模式
FIQ Mode(0b10001): 快速中断模式, 中断优先级高于IRQ
IRQ Mode(0b10010): 中断模式
Supervisor Mode(0b10011):  管理模式, 操作系统的保护模式, 复位和软中断时会进入此模式
Abort Mode(0b10111): 数据存取异常, 指令读取拒绝时, 会进入该模式
Undefined Mode(0b11011): 未定义指令被执行时, 进入该模式
System Mode(0b11111): 类似用户模式, 但可运行特权级os任务, 如切换到其他模式
Monitor Mode(0b10110): 仅限于安全扩展

寄存器:

通用寄存器:
	R0~R12: R0~R3用于传递函数参数, R4~R11用于保存子程序局部变量, R12常用作调用过程中的临时寄存器
	程序计数器: R15(PC: 指令计数器), 不能用于其他用途, 取指令地址指针, 其值为当前内存指令执行地址加8
状态寄存器:
	CPSR: 当前处理器的状态
各模式下独立的寄存器:
	堆栈寄存器: R13(SP), 在子程序中不能用于其他用途
	链接寄存器: R14(LR), 保存子程序的返回地址
	FIQ工作模式下, 有自己的R8~R12寄存器
	SPSR: 用于保存CPSR的工作状态, 每个模式下有一个寄存器

CPSR寄存器:

N(31): 符号标志位, 负数为1, 正数或零为0
Z(30): 零标志位, 零为1, 非零为0
C(29): 进位/借位标志位
V(28): 溢出标志位, 溢出为1
I(7): IRQ中断位, IRQ中断禁止时为1
F(6): FIQ中断位, FIQ中断禁止时为1
T(5): Thumb指令控制位, ARM指令为0, Thumb指令为1
M4~M0(4~0): 处理器模式位

条件码标志: 31~28
保留: 27~8
控制位: 7~0

ARM寻址方式:

寄存器寻址: 操作数的值在寄存器中, 指令直接取值, 如MOV, SUB
 立即寻址: 立即数以#为前缀, 如#0xff
 
寄存器偏移寻址: 
	逻辑移位: 空缺补0
	算术移位: 保证符号位不变, 右移空缺用符号位补, 左移补0
	LSL: 逻辑左移
	LSR: 逻辑右移
	ASR/ASL: 算术右移/左移
	ROR/ROL: 循环右移/左移
	RRX: 带扩展的循环右移
寄存器间接寻址: 寄存器为操作数的指针地址, 如[R2], R2的值作为内存地址, 取该内存地址的数据

基址寻址: 
	寄存器中的值与给出的偏移量相加得到地址
	取出此地址中的值
	常用于查表, 数组操作, 功能部件寄存器访问
	
多寄存器寻址:
	寄存器列表的顺序不重要, 最终编号小的寄存器会与低地址的内存相对应
	连续的寄存器可用"-"链接, 寄存器之间用","隔开
	LDM/STM可接IA/IB/DA/DB, 分别表示Increase After/Before, Decrease After/Before
	
堆栈寻址:
	子程序局部变量存储, 参数传递要通过堆栈完成
	ARM指令集中没有出栈和入栈的专门指令
	ARM中栈的操作是通过STM/LDM和栈指针SP配合操作完成
	ARM采用栈的类型是满递减堆栈
	
	栈的分类:
		递增堆栈A: 向上生长, 向高地址方向增长
		递减堆栈D: 向下生长, 向低地址方向增长
		满堆栈F: SP栈指针指向栈顶元素
		空堆栈E: SP栈指针指向下一次要入栈元素的地址
相对寻址:
	由PC作为基地址, 指令中的地址码段作为偏移量
	两者相加后得到的地址即为操作数的有效地址
	常见指令: B, BL, ADR
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值