1、读取g-sensor重力传感器的重力加速度值
cmd.c // 结构体中添加指令与对应函数 mmaxyz, mma8653_get_xyz
mma8653.c // 补充函数:mma8653_get_xyz ( )
// mma8653_active ( ); mma8653_write ( ); show_acc ( );
补充:
<< 逻辑左移(空出的低位补0)
>> 算术右移(最高位补符号位 - '保证负数不被改变')
补码 = 反码 + 1
' 操作IIC接口设备驱动时遇到的问题 - 【可体现到简历】
/* · 操作过I2C接口设备驱动 */
遇到的过的问题总结:
1. start slave_addr << 1 | w 收不到ack?
a. 确认从设备地址是否有误...
b. 借助使用示波器抓波形,时序是否满足I2C协议的需求...
c. 换块板子试试...
d. 找硬件工程师帮忙...
-----------------------------------------------------------
《ARM体系结构与编程、ARM指令流水线、ARM编程模型基础》
// ARM体系结构与编程(优势:汇编).pdf - 找一下这本书
// ARM嵌入式系统开发:软件设计与优化.pdf
www.arm.com // DDI0500D_cortex_a53_r0p2_trm.pdf
RSIC:精简指令集 - arm (汇编指令条数少)
CSIC:复杂指令集 - x86
ARM指令集版本 ARMV4T ARMV5 ARMV6 ARMV7/V8
ARM架构 ARM7 ARM9 ARM11 Coretex-ARM
相关产品 s3c44b0 s3c2410/2440 s3c6410 s5pv210/6818
cortex-a:高大上的领域,手机、PAD、PC,大量的音/视频处理
s5p6818 - a53(最高目前是a73)
华为 - 麒麟960 - a73 - mate9 - 2.8GHz
cortex-r:强实时性控制领域
cortex-m:以单片机的价格实现32bit处理器性能
stm32:有中文数据手册
中文官方论坛
底层硬件驱动库函数 - '关注一下,主要是纯C语言'
// 资料全不全,是否有案例,网上m系列视频教程
1. 流水线
// F - Fetch D - Decode E - Execute
// M - Memory W - Writeback S - Stall
三级流水线:
取指令 解码指令 执行指令
Fetch Decode Execute
最佳流水线:
例如6个时钟周期执行了6条指令,所有操作都在寄存器中单周期执行,指令周期数(CPI) = 1。
冯诺依曼架构:取数据和取指令,用的是同一套总线。
// ARM7 采用的就是冯诺依曼架构。
哈佛架构:取数据和取指令,用的是分别对应一套总线。
// ARM9及更高的版本采用的都是哈佛架构。 - 5 级流水线。
2. ARM编程模型
2.1 工作模式: '7 中基本的模式'。
// 代码在执行时CPU的状态:内核态、用户态
'SVC'(管理模式) - 系统复位,执行了软中断指令后进入【内核态】
'FIQ'(快速中断模式) - 高优先级中断时进入,即收到FIQ信号时
'IRQ'(中断模式) - 低优先级中断时进入,即收到IRQ信号时
'Abort'(终止模式abt) - 用于处理非正常的存储器访问
'Undef'(未定义模式und) - 用于处理未定义指令
'System'(系统模式) - 与用户模式共用寄存器的特权模式
'User'(用户模式) - 多数应用和系统任务运行在该模式【用户态】
// 前五种分为异常模式,前六种分为特权模式。
2.2 工作状态:
'ARM状态':当执行ARM指令时 - 32bit指令。
'THUMB状态':当执行THUMB指令时 - 16bit指令。
两种工作状态可以相互切换(软件编程过程中可实现切换)。
当执行异常处理过程中,必须处于ARM状态。
2.3 寄存器组织结构:
'寄存器与特殊功能寄存器的区别':
1)'所在的位置不同'
特殊功能寄存器是IC公司(三星)设计的,位于SOC内部。
寄存器是ARM设计的,位于ARM core内。
// s5p6818→SOC(system on chip)→片上系统
2)'访问方式不同'
特殊功能寄存器都有物理地址,可以通过地址访问('指针');
寄存器没有地址,只有名称,C语言很难直接访问到。
【 37 个 32-bit 寄存器】
其中' 31 个通用寄存器,名称为r0 r1 r2 ... r15 '
实际编程过程中,以下三个寄存器人为赋予特定含义:
r0-r7 未备份寄存器;r8-r14 备份寄存器;r15 程序计数器。
// r13:sp,栈指针寄存器 - Stack point Register
// r14:lr,保存函数的返回地址 - Link Regiser
// r15:pc,保存取指令的地址 - Program Counter程序计数器
其余' 6 个状态寄存器,名称为cpsr spsr '
// 1个cpsr,程序状态寄存器 - Current Program Status
[ 4 : 0 ]bit:存储当前处理器的工作模式(支持2^5=32种模式)
[ 5 ]bit:T位,T=1,代表THUMB工作状态
T=0,代表ARM工作状态
[ 6 ]bit:F位,F=1/0,屏蔽/使能FIQ异常
[ 7 ]bit:I位,I=1/0,屏蔽/使能IRQ异常
[27: 8 ]bit:保留 - 只关注共性,不关注特性。(忽略)
[31:28]bit: 31-N位,运算结果为负数N=1,反之N=0
30-Z位,运算结果为零Z=1,反之Z=0
29-C位,运算过程中是否有进位或借位
28-V位,有符号运算时,是否溢出(忽略)
// 5个spsr,是cpsr的备份寄存器 - Saved Program Status
'每种工作模式下只能访问37个寄存器的一个子集'。
2.4 异常与异常向量表
支持7种异常:
'reset':按下复位键 → SVC
'undefine':当执行到CPU不认识的指令 → undef
'soft interrupt':当CPU执行到 swi/svc → SVC
'pretch abort':当取指令时访问了不能访问的地址 → ABORT
'data abort':取数据时访问了不能访问的地址 → ABORT
'irq':当按键按下时,可以规定为IRQ → IRQ
'fiq':当按键按下时,可以规定为FIQ → FIQ
'当异常产生时,硬件会自动完成':
1)备份cpsr寄存器的内容到spsr
2)设置cpsr bit
a. 切换到异常模式
cpsr [ 4 : 0 ] 自动被赋值切换对应工作模式
b. 切换ARM状态
cpsr [ 5 ] T=0,切换为ARM工作状态
c. 禁止中断
cpsr [ 6 ] F=1
cpsr [ 7 ] I=1
3)存储返回地址到LR_<mode>(LR寄存器)
4)根据异常不同给PC赋不同的值,即设置PC为相应异常的入口地址
'异常向量表' <Vector Table> Base Address: 0xFFFF0000
fiq: PC=0x1c
irq: PC=0x18
//(reserved) PC=0x14
data abort: PC=0x10 // PC = Base Address + 0x10
pretch abort: PC=0x0c
soft interrupt: PC=0x08
undefine: PC=0x04
reset: PC=0x00
'当异常处理结束后,需要软件必须完成的工作':
1)恢复cpsr
cpsr = spsr_<mode>
2)恢复PC
PC = LR_<mode>
2.5 ARM支持的数据类型
byte 字节8bit (1个字节)
half word 半字16bit (2个字节)
word 字32bit (4个字节)
double word 双字64bit(8个字节)
2.6 对齐方式
ARM 处理器既支持大端模式,也支持小端模式,'软件可配置'。
现用的s5p6818开发板是大端模式,还是小端模式。
int a = 0x12345678; // 12...是高位,...78是低位
地址 大端 小端
0x100 12 78
0x101 34 56
0x102 56 34
0x103 78 12
权重值大的存放在低地址就是大端模式;
权重值小的存放在低地址就是小端模式。
// 编程判断当前处理器是大端还是小端模式? - 开发板ARM
int / short / double 多字节数据类型都涉及大小端的问题。
cmd.c // 结构体中添加指令与对应函数 mmaxyz, mma8653_get_xyz
mma8653.c // 补充函数:mma8653_get_xyz ( )
// mma8653_active ( ); mma8653_write ( ); show_acc ( );
补充:
<< 逻辑左移(空出的低位补0)
>> 算术右移(最高位补符号位 - '保证负数不被改变')
补码 = 反码 + 1
' 操作IIC接口设备驱动时遇到的问题 - 【可体现到简历】
/* · 操作过I2C接口设备驱动 */
遇到的过的问题总结:
1. start slave_addr << 1 | w 收不到ack?
a. 确认从设备地址是否有误...
b. 借助使用示波器抓波形,时序是否满足I2C协议的需求...
c. 换块板子试试...
d. 找硬件工程师帮忙...
-----------------------------------------------------------
《ARM体系结构与编程、ARM指令流水线、ARM编程模型基础》
// ARM体系结构与编程(优势:汇编).pdf - 找一下这本书
// ARM嵌入式系统开发:软件设计与优化.pdf
www.arm.com // DDI0500D_cortex_a53_r0p2_trm.pdf
RSIC:精简指令集 - arm (汇编指令条数少)
CSIC:复杂指令集 - x86
ARM指令集版本 ARMV4T ARMV5 ARMV6 ARMV7/V8
ARM架构 ARM7 ARM9 ARM11 Coretex-ARM
相关产品 s3c44b0 s3c2410/2440 s3c6410 s5pv210/6818
cortex-a:高大上的领域,手机、PAD、PC,大量的音/视频处理
s5p6818 - a53(最高目前是a73)
华为 - 麒麟960 - a73 - mate9 - 2.8GHz
cortex-r:强实时性控制领域
cortex-m:以单片机的价格实现32bit处理器性能
stm32:有中文数据手册
中文官方论坛
底层硬件驱动库函数 - '关注一下,主要是纯C语言'
// 资料全不全,是否有案例,网上m系列视频教程
1. 流水线
// F - Fetch D - Decode E - Execute
// M - Memory W - Writeback S - Stall
三级流水线:
取指令 解码指令 执行指令
Fetch Decode Execute
最佳流水线:
例如6个时钟周期执行了6条指令,所有操作都在寄存器中单周期执行,指令周期数(CPI) = 1。
for (i = 0; i < 10; i++) {
for (j = 0; j < 100000; j++) {
}
} // 此种写法效率更高一些,破坏最佳流水线的次数少一些
for (j = 0; j < 100000; j++) {
for (i = 0; i < 10; i++) {
}
}
LDR流水线:
冯诺依曼架构:取数据和取指令,用的是同一套总线。
// ARM7 采用的就是冯诺依曼架构。
哈佛架构:取数据和取指令,用的是分别对应一套总线。
// ARM9及更高的版本采用的都是哈佛架构。 - 5 级流水线。
2. ARM编程模型
2.1 工作模式: '7 中基本的模式'。
// 代码在执行时CPU的状态:内核态、用户态
'SVC'(管理模式) - 系统复位,执行了软中断指令后进入【内核态】
'FIQ'(快速中断模式) - 高优先级中断时进入,即收到FIQ信号时
'IRQ'(中断模式) - 低优先级中断时进入,即收到IRQ信号时
'Abort'(终止模式abt) - 用于处理非正常的存储器访问
'Undef'(未定义模式und) - 用于处理未定义指令
'System'(系统模式) - 与用户模式共用寄存器的特权模式
'User'(用户模式) - 多数应用和系统任务运行在该模式【用户态】
// 前五种分为异常模式,前六种分为特权模式。
2.2 工作状态:
'ARM状态':当执行ARM指令时 - 32bit指令。
'THUMB状态':当执行THUMB指令时 - 16bit指令。
两种工作状态可以相互切换(软件编程过程中可实现切换)。
当执行异常处理过程中,必须处于ARM状态。
2.3 寄存器组织结构:
'寄存器与特殊功能寄存器的区别':
1)'所在的位置不同'
特殊功能寄存器是IC公司(三星)设计的,位于SOC内部。
寄存器是ARM设计的,位于ARM core内。
// s5p6818→SOC(system on chip)→片上系统
2)'访问方式不同'
特殊功能寄存器都有物理地址,可以通过地址访问('指针');
寄存器没有地址,只有名称,C语言很难直接访问到。
【 37 个 32-bit 寄存器】
其中' 31 个通用寄存器,名称为r0 r1 r2 ... r15 '
实际编程过程中,以下三个寄存器人为赋予特定含义:
r0-r7 未备份寄存器;r8-r14 备份寄存器;r15 程序计数器。
// r13:sp,栈指针寄存器 - Stack point Register
// r14:lr,保存函数的返回地址 - Link Regiser
// r15:pc,保存取指令的地址 - Program Counter程序计数器
其余' 6 个状态寄存器,名称为cpsr spsr '
// 1个cpsr,程序状态寄存器 - Current Program Status
[ 4 : 0 ]bit:存储当前处理器的工作模式(支持2^5=32种模式)
[ 5 ]bit:T位,T=1,代表THUMB工作状态
T=0,代表ARM工作状态
[ 6 ]bit:F位,F=1/0,屏蔽/使能FIQ异常
[ 7 ]bit:I位,I=1/0,屏蔽/使能IRQ异常
[27: 8 ]bit:保留 - 只关注共性,不关注特性。(忽略)
[31:28]bit: 31-N位,运算结果为负数N=1,反之N=0
30-Z位,运算结果为零Z=1,反之Z=0
29-C位,运算过程中是否有进位或借位
28-V位,有符号运算时,是否溢出(忽略)
// 5个spsr,是cpsr的备份寄存器 - Saved Program Status
'每种工作模式下只能访问37个寄存器的一个子集'。
2.4 异常与异常向量表
支持7种异常:
'reset':按下复位键 → SVC
'undefine':当执行到CPU不认识的指令 → undef
'soft interrupt':当CPU执行到 swi/svc → SVC
'pretch abort':当取指令时访问了不能访问的地址 → ABORT
'data abort':取数据时访问了不能访问的地址 → ABORT
'irq':当按键按下时,可以规定为IRQ → IRQ
'fiq':当按键按下时,可以规定为FIQ → FIQ
'当异常产生时,硬件会自动完成':
1)备份cpsr寄存器的内容到spsr
2)设置cpsr bit
a. 切换到异常模式
cpsr [ 4 : 0 ] 自动被赋值切换对应工作模式
b. 切换ARM状态
cpsr [ 5 ] T=0,切换为ARM工作状态
c. 禁止中断
cpsr [ 6 ] F=1
cpsr [ 7 ] I=1
3)存储返回地址到LR_<mode>(LR寄存器)
4)根据异常不同给PC赋不同的值,即设置PC为相应异常的入口地址
'异常向量表' <Vector Table> Base Address: 0xFFFF0000
fiq: PC=0x1c
irq: PC=0x18
//(reserved) PC=0x14
data abort: PC=0x10 // PC = Base Address + 0x10
pretch abort: PC=0x0c
soft interrupt: PC=0x08
undefine: PC=0x04
reset: PC=0x00
'当异常处理结束后,需要软件必须完成的工作':
1)恢复cpsr
cpsr = spsr_<mode>
2)恢复PC
PC = LR_<mode>
2.5 ARM支持的数据类型
byte 字节8bit (1个字节)
half word 半字16bit (2个字节)
word 字32bit (4个字节)
double word 双字64bit(8个字节)
2.6 对齐方式
int a; // 如果4字节对齐,地址的末位0/4/8/c(12)
eg:
struct test {
int a;
char b;
char d;
int c;
};
sizeof (struct test) = 16 byte;
2.7 大小端问题
ARM 处理器既支持大端模式,也支持小端模式,'软件可配置'。
现用的s5p6818开发板是大端模式,还是小端模式。
int a = 0x12345678; // 12...是高位,...78是低位
地址 大端 小端
0x100 12 78
0x101 34 56
0x102 56 34
0x103 78 12
权重值大的存放在低地址就是大端模式;
权重值小的存放在低地址就是小端模式。
// 编程判断当前处理器是大端还是小端模式? - 开发板ARM
int / short / double 多字节数据类型都涉及大小端的问题。
思路一:
int a = 0x12345678;
if (*((char*)&a) == 0x78) { 小端 } else { 大端 }
思路二:
union {
int a;
char c[4];
} test;
test.a = 1; // 0x0000001
if (c[0]) { 小端 } else { 大端 }