一、交叉编译工具(编译出能在ARM平台上运行的程序)
1)文件生成过程:
①预处理:事先将“#”开头的文件加入进去
②编译:C/C++ ----->汇编代码
③汇编:汇编代码----->机器代码
④连接:将生成的目标文件(OBJ)和系统的OBJ文件、库文件 连接起来
2)编译器各个选项
①
arm-linux-gcc选项
-o -S -E -v
-Wall : 打开所有警告信息
②
arm-linux-ld选项
-T :只用于连接Bootlodar、内核等没有“底层软件支持”的软件
-Ttext startaddr (代码段)
-Tdata startaddr (数据段)
-Tbss startaddr (bss段)
③
arm-linux-objcopy选项
用于复制一个目标文件的内容到另一个文件中,可以使用不同于源文件的格式输出目标文件,即可以进行格式转换。
arm-linux-objcopy -O binary -S elf_file bin_file 【 elf格式----->二进制格式(bin)】
④
arm-linux-objdump选项
(将其他文件转换为
反汇编文件)
arm-linux-objdump -D elf_file > dis_file 【elf_file----->dis_file】
arm-linux-objdump -D -b binary -m arm bin_file > dis_file 【bin_file----->dis_file】
3)Makefile用法
①必须以Tab键缩进
②赋值方法
immediate = deferred
immediate ?= deferred
immediate := deferred
immediate += deferred
延时变量:当真正使用这个变量时,这个变量的值才真正确定 “=”“?=”
立即变量:定义时它的值就已经确定 “:=”
③常用函数
④自动变量
$@:目标文件名
$^: 所有依赖文件名
$<: 第一个依赖文件名
4)常用ARM汇编指令及ATPCS规则
①相对跳转命令:b、bl
Bl 除了跳转之外,还会将返回地址(bl的下一条指令的地址)保存在lr寄存器中
②数据传送指令:mov 地址读取指令:ldr
mov r1, r2 (r1 = r2) ldr r1, =4096
mov r1, #4096 (r1=4096)
mov传输的常数必须为“立即数”
③内存访问指令:ldr、str、ldm、stm
ldr r1, [r2, #4] 将地址为r2+4的内存单元的数据读到r1中
ldr r1, [r2], #4 将地址为r2的内存单元中数据读到r1中,然后r2+4
str r1, [r2] 将r1的数据存放到r2的内存单元中
str r1, [r2], #4 将r1的数据存放到r2的内存单元中,然后r2+4
ldm、stm属于批量内存访问指令,只用一条指令就可以读/写多个数据
ldm / stm {cmd}
{!} {^}
i:increment ia:事后递增
d:decrement ib:事前递增
a:after da:事后递减
b:before db:事前递减
④add sub
add r1, r2, #1 ===> r1=r2+1
sub r1, r2, #1 ===> r1=r2-1
⑤程序状态寄存器的访问指令:msr mrs
msr cpsr, r0 ===>复制r0到cpsr中
mrs r0, cprs ===>复制cprs到r0
⑥其他伪指令
.extern 外部符号
.text 代码段
.global _start 定义全局
_start:
⑦汇编指令的执行条件
根据cpsr寄存器中的条件标志位决定是否执行该指令
5)ARM-THUMB子程序调用规则:ATPCS
(为了使C程序和汇编程序之间能够互相调用)
ATPCS规则:
①寄存器使用规则:
ARM处理器中有r0--r15一共16个寄存器
②数据栈使用规则:
数据栈:
FD : Full Desending : 满递减
FD : Emptyl Desending : 空递减
FA : Full Acending : 满递增
EA : Emptyl Acending : 空递增
③数据传递规则
当参数个数不超过4个时,使用r0--r3这4个寄存器来传递参数
6)diff patch命令
制作补丁:
$ diff -urNwB linux-2.6.22.6 linux-2.6.22.6_ok > linux_2.6.22.6_ok.diff
打补丁:
cd linux-2.6.22.6
Patch -p1 < ../linux-2.6.22.6_ok.diff
二、GPIO接口
(S3C2440 : 130个I/O端口,分为A---J共9组)
1)通过寄存器来控制GPIO引脚
GPxCON:用于选择引脚功能
GPxDAT: 用于读/写引脚数据
GPxUP: 用于确定是否使用内部上拉电阻
(x = A、B、C、.....J)