开发环境
系统:ubuntu 12.04
单板:tq2440
编译器:arm-linux-gcc-4.4.3
搭建开发环境详见ubuntu 12.04开发环境配置。
使用命令:mkdir,vi,make,
目标:实现tq2440单板上4个led灯闪烁
第一个程序很简单,用汇编实现。硬件如下:
nLED_1——>GPB5
nLED_2——>GPB6
nLED_3——>GPB7
nLED_4——>GPB8
根据s3c2440手册编写代码,包括2个文件1_led.s和Makefile.
加了句:ldr pc,=0x33d00060 出现这个
TFTP from server 192.168.1.2; our IP address is 192.168.1.6
Filename 'leds.bin'.
Load address: 0x30000000
Loading: T #
done
Bytes transferred = 104 (68 hex)
## Starting application at 0x30000000 ...
nand_scan(): Cannot allocate oob_buf
一、编写源码
1:文件·1_led.s:
.text
.global _start
_start:
ldr r0,=0x56000010
mov r1,#0x00015400
str r1,[r0]
ldr r0,=0x56000014
loop: mov r1,#0x00000000
str r1,[r0]
bl delay
mov r1,#0x00000ff0
str r1,[r0]
bl delay
b loop
delay:
mov r4,#100
del1: mov r5,#1000
del2: sub r5,r5,#1
nop
cmp r5,#1
bne del2
sub r4,r4,#1
nop
cmp r4,#1
bne del1
mov pc,lr
反汇编程序;
leds_elf: file format elf32-littlearm
Disassembly of section .text:
00000000 <_start>:
0: e59f0050 ldr r0, [pc, #80] ; 58 <del2+0x24> //[]地址,pc的当前值加偏移地址[((pc=#8)+#80)]=&0x58=0x56000010
4: e3a01b55 mov r1, #87040 ; 0x15400
8: e5801000 str r1, [r0]
c: e59f0048 ldr r0, [pc, #72] ; 5c <del2+0x28> //[]地址,pc的当前值加偏移地址[((pc=0xC)+#72)]=&0x5C=0x56000014
00000010 <loop>:
10: e3a01000 mov r1, #0
14: e5801000 str r1, [r0]
18: eb000003 bl 2c <delay>
1c: e3a01eff mov r1, #4080 ; 0xff0
20: e5801000 str r1, [r0]
24: eb000000 bl 2c <delay>
28: eafffff8 b 10 <loop>
0000002c <delay>:
2c: e3a04efa mov r4, #4000 ; 0xfa0
00000030 <del1>:
30: e3a05ffa mov r5, #1000 ; 0x3e8
00000034 <del2>:
34: e2455001 sub r5, r5, #1
38: e1a00000 nop ; (mov r0, r0)
3c: e3550001 cmp r5, #1
40: 1afffffb bne 34 <del2>
44: e2444001 sub r4, r4, #1
48: e1a00000 nop ; (mov r0, r0)
4c: e3540001 cmp r4, #1
50: 1afffff6 bne 30 <del1>
54: e1a0f00e mov pc, lr
58: 56000010 .word 0x56000010
5c: 56000014 .word 0x56000014
2:文件Makefile:
1_led.bin:1_led.s
arm-linux-gcc -g -c -o 1_led.o 1_led.s
arm-linux-ld -Ttext 0x00000000 -g 1_led.o -o 1_led_elf
arm-linux-objcopy -O binary -S 1_led_elf 1_led.bin
arm-linux-objdump -D 1_led_elf > 1_led.dis
clean:
rm -f 1_led.bin *.o 1_led_elf 1_led.dis
二、编译
change@change:~$ cd /home/change/Si/tq2440/1_led/
change@change:~/Si/tq2440/1_led$ make
arm-linux-gcc -g -c -o 1_led.o 1_led.s
arm-linux-ld -Ttext 0x00000000 -g 1_led.o -o 1_led_elf
arm-linux-objcopy -O binary -S 1_led_elf 1_led.bin
arm-linux-objdump -D 1_led_elf > 1_led.dis
change@change:~/Si/tq2440/1_led$ ls
1_led.bin 1_led.dis 1_led_elf 1_led.o 1_led.s Makefile
把1_led.bin下载到dram中运行