Chinaunix首页 | 论坛 | 博客
  • 博客访问: 256719
  • 博文数量: 52
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1538
  • 用 户 组: 普通用户
  • 注册时间: 2013-04-24 07:45
个人简介

生活就像海洋,只有意志坚强的人,才能到达彼岸。

文章存档

2013年(52)

分类: LINUX

2013-09-12 19:37:10

在裸机开发中,其基本流程可以分为: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*/文件代码如下

点击(此处)折叠或打开

  1. .text
  2. .globl _start
  3. #define VIC0_INT    0x71200000
  4. #define VIC1_INT    0x71300000

  5. _start: bl reset
  6.         ldr    pc, _undefined_instruction
  7.         ldr    pc, _software_interrupt
  8.         ldr    pc, _prefetch_abort
  9.         ldr    pc, _data_abort
  10.         ldr    pc, _not_used
  11.         ldr    pc, _irq
  12.         ldr    pc, _fiq
  13. _undefined_instruction:b .
  14. _software_interrupt:b .
  15. _prefetch_abort:b .
  16. _data_abort:b .
  17. _not_used:b .
  18. _irq:b .
  19. _fiq:b .
  20. reset:
  21.         mrs    r0,cpsr
  22.         bic    r0,r0,#0x1f
  23.         orr    r0,r0,#0xd3
  24.         msr    cpsr,r0

  25.         bl set_peri_port
  26.         bl disable_watchdog
  27.         bl disable_irq
  28.         bl init_led
  29.         bl light_led

  30. halt:
  31.         bl halt

  32. set_peri_port:
  33. @告诉cpu外设的地址
  34.      ldr r0, =0x70000000
  35.      orr r0, r0, #0x13
  36.      mcr p15,0,r0,c15,c2,4
  37.         mov    pc, lr

  38. disable_watchdog:
  39. @关闭看门狗
  40.         ldr r0, =0x7E004000
  41.         mov r1, #0
  42.         str r1, [r0] @ str, store,
  43.         mov    pc, lr

  44. disable_irq:
  45. @屏蔽中断
  46.         ldr    r1, =0x0
  47.         ldr    r0, =VIC0_INT
  48.         str    r1, [r0]

  49.         ldr    r1, =0x0
  50.         ldr    r0, =VIC1_INT
  51.         str    r1, [r0]
  52.         mov    pc, lr

  53. init_led:
  54. @设置GPN为输出模式
  55.         ldr r1, =0x7F008820
  56.         ldr r0, =0x1111
  57.         str r0, [r1]
  58.         mov    pc, lr

  59. light_led:
  60. @点亮LED1
  61.         ldr r1, =0x7F008824
  62.         mov r0, #0xf
  63.         str r0, [r1]
  64.      mov r0,#0xe
  65.      str r0,[r1]
  66.      mov    pc, lr
led.lds脚本文件如下

点击(此处)折叠或打开

  1. OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
  2. OUTPUT_ARCH(arm)
  3. ENTRY(_start)
  4. SECTIONS
  5. {
  6. . = 0x50008000;
  7. . = ALIGN(4);
  8. .text :
  9. {
  10. led.o (.text)
  11. *(.text)
  12. }
  13. . = ALIGN(4);
  14. .rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) }
  15. . = ALIGN(4);
  16. .data : { *(.data) }
  17. . = ALIGN(4);
  18. __bss_start = .;
  19. .bss (NOLOAD) : { *(.bss) . = ALIGN(4); }
  20. _end = .;
  21. }
Makefile文件代码如下:

点击(此处)折叠或打开

  1. all: led.o
  2. arm-linux-ld -Tled.lds -o led.elf led.o
  3. arm-linux-objcopy -O binary led.elf led.bin
  4. led.o : led.S
  5. arm-linux-gcc -g -o led.o -c led.S
  6. .PHONY: clean
  7. clean:
  8. 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等将被点

亮,如果没亮,则说明文件烧写不成功。

 
阅读(3722) | 评论(0) | 转发(0) |
1

上一篇:块设备驱动程序设计

下一篇:交叉工具链

给主人留下些什么吧!~~