在裸机开发中,其基本流程可以分为:1、编写裸机程序,2、调试裸机程序,3、生成二进制文件(编译、链接、格式转换),4、烧写/运行二进制映像。本节重点阐述第3步和第4步。
当我们在编译、链接、格式转换然后生成二进制文件的时候,我们需要使用交叉工具链,所以我们首先需要安装交叉编译器。如果所用的是arn-linux-gcc-4.3.2.tgz,则使用命令
tar xvzf arm-linux-gcc-4.3.2 tgz -C ./ 解压即可,然后编辑/root/.bashrc文件,vim /root/.bashrc 在该文件后面加上一行:export PATH=$PATH:/usr/local/arm/4.3.2/bin保存退出。这
样我们的交叉编译器就安装成功了。
接下来我们就可以编译裸机程序了,在我们的源程序文件中,我们一共有三个文件他们分别是led.S , led.lds , Mkefile
/*led.S*/文件代码如下
-
.text
-
.globl _start
-
#define VIC0_INT 0x71200000
-
#define VIC1_INT 0x71300000
-
-
_start: bl reset
-
ldr pc, _undefined_instruction
-
ldr pc, _software_interrupt
-
ldr pc, _prefetch_abort
-
ldr pc, _data_abort
-
ldr pc, _not_used
-
ldr pc, _irq
-
ldr pc, _fiq
-
_undefined_instruction:b .
-
_software_interrupt:b .
-
_prefetch_abort:b .
-
_data_abort:b .
-
_not_used:b .
-
_irq:b .
-
_fiq:b .
-
reset:
-
mrs r0,cpsr
-
bic r0,r0,#0x1f
-
orr r0,r0,#0xd3
-
msr cpsr,r0
-
-
bl set_peri_port
-
bl disable_watchdog
-
bl disable_irq
-
bl init_led
-
bl light_led
-
-
halt:
-
bl halt
-
-
set_peri_port:
-
@告诉cpu外设的地址
-
ldr r0, =0x70000000
-
orr r0, r0, #0x13
-
mcr p15,0,r0,c15,c2,4
-
mov pc, lr
-
-
disable_watchdog:
-
@关闭看门狗
-
ldr r0, =0x7E004000
-
mov r1, #0
-
str r1, [r0] @ str, store,
-
mov pc, lr
-
-
disable_irq:
-
@屏蔽中断
-
ldr r1, =0x0
-
ldr r0, =VIC0_INT
-
str r1, [r0]
-
-
ldr r1, =0x0
-
ldr r0, =VIC1_INT
-
str r1, [r0]
-
mov pc, lr
-
-
init_led:
-
@设置GPN为输出模式
-
ldr r1, =0x7F008820
-
ldr r0, =0x1111
-
str r0, [r1]
-
mov pc, lr
-
-
light_led:
-
@点亮LED1
-
ldr r1, =0x7F008824
-
mov r0, #0xf
-
str r0, [r1]
-
mov r0,#0xe
-
str r0,[r1]
-
mov pc, lr
led.lds脚本文件如下
-
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
-
OUTPUT_ARCH(arm)
-
ENTRY(_start)
-
SECTIONS
-
{
-
. = 0x50008000;
-
-
. = ALIGN(4);
-
.text :
-
{
-
led.o (.text)
-
*(.text)
-
}
-
-
. = ALIGN(4);
-
.rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) }
-
-
. = ALIGN(4);
-
.data : { *(.data) }
-
-
-
. = ALIGN(4);
-
__bss_start = .;
-
.bss (NOLOAD) : { *(.bss) . = ALIGN(4); }
-
_end = .;
-
}
Makefile文件代码如下:
-
all: led.o
-
arm-linux-ld -Tled.lds -o led.elf led.o
-
arm-linux-objcopy -O binary led.elf led.bin
-
-
led.o : led.S
-
arm-linux-gcc -g -o led.o -c led.S
-
-
.PHONY: clean
-
clean:
-
rm *.o led.elf led.bin
在以后的章节我们会详细的介绍.lds脚本文件和Makefile文件。在此就不做详细的介绍了。下面我们着重介绍逻辑程序的编译过程。
1、使用命令:arm-linux-gcc -g -c led.s 编译文件生成led.o文件。
2、使用命令:arm-linux-ld -Tled.lds -o led.elf led.o 链接生成led.elf文件,但是我们需要二进制文件才能烧写到开发板上运行,所以进行第3步。
3、使用命令:arm-gcc-objcopy -O binary led.elf led.bin 生成二进制文件led.bin,这样我们所需要的二进制文件就这样生成了,接下来我们需要使用烧写工具将二进制文件烧写到开发板上运行。
在这里我们使用SD卡进行映像的烧写,所以我们首先将SD卡插入电脑,将其格式化,以管理员身份打开SD_Writer程序,点击Scan找到我们的SD卡,然后进行Format,此时不用动,待
自动退出,否则会烧写 mmc_ram256.bin 文件到SD卡出错。Format完成后再选择mmc_ram256.bin文件进行Program。成功后,用串口将开发板和电脑连接起来,使用secureCRT软
件。把SD卡插入6410的开发板上,以SD卡的方式启动开发板,记住一定要按住空格键,再打开开发板电源。成功启动后,首先选择[1] format the nand flash 然后选择y,然后选择[3]
Burn image from USB,这个时候需要链接USB下载线,如果是虚拟机。右击右下角的USB图标,选择连接(connect),然后使用insmod dnw_usb.ko 加载usb下载驱动程序。安装成功使
用dnw应用程序下载映像:./dnw led.bin 50008000 完成后就把二进制文件成功写入了nand flash了。关闭开发板电源,以nand flash启动开发板。这时我们开发板上的一个led等将被点
亮,如果没亮,则说明文件烧写不成功。
阅读(3693) | 评论(0) | 转发(0) |