Chinaunix首页 | 论坛 | 博客
  • 博客访问: 493964
  • 博文数量: 223
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 2145
  • 用 户 组: 普通用户
  • 注册时间: 2014-03-01 10:23
个人简介

该坚持的时候坚持,该妥协的时候妥协,该放弃的时候放弃

文章分类

全部博文(223)

文章存档

2017年(56)

2016年(118)

2015年(3)

2014年(46)

我的朋友

分类: 嵌入式

2016-09-25 11:51:34

1.1 异常-Exceptions
异常:因为内部或者外部的一些事件,导致处理器停下正在处理的工作,转而去处理这些发生的事件。
<>

1.2 异常类型
ARM处理器支持7种类型的异常

1.3 异常向量
当一种异常发生的时候,ARM处理器会跳转到对应该异常的固定地址去执行异常处理程序,而这个固定的地址,就称之为异常向量

Reset (重启,休眠->工作)
Undefined instructions (自己定义的中断)
Software instructions (软中断SWI)
Prefetch Abort (instruction fetch memory abort 预取指令中断)
Data Abort (data access memory abort 数据访问中断)
IRQ (interrupt 中断)
FIQ (fast interrupt 快速中断)

CP15如果配置为高位模式,使用High Vector address

2.代码编写
start.S文件编写
  1. .text
  2. .global _start
  3. _start:
  4.     b reset
  5.     ldr pc, _undefined_interrupt
  6.     ldr pc, _software_interrupt
  7.     ldr pc, _prefetch_abort
  8.     ldr pc, _data_abort
  9.     ldr pc, _not_used         这里因为手册里irq从0x00000018开始,而没从0x00000014开始。所以汇编中要留个空
  10.     ldr pc, _irq
  11.     ldr pc, _fiq

  12. _undefined_interrupt: .word undefined_interrupt     uboot中的写法,如果用ldr pc, = undefined_interrupt。其实也可以。
  13. _software_interrupt: .word software_interrupt
  14. _prefetch_abort: .word prefetch_abort
  15. _data_abort: .word data_abort
  16. _not_used: .word not_used
  17. _irq: .word irq
  18. _fiq: .word fiq

  19. undefined_interrupt:
  20.     nop
  21. software_interrupt:
  22.     nop
  23. prefetch_abort:
  24.     nop
  25. data_abort:
  26.     nop
  27. not_used:
  28.     nop
  29. irq:
  30.     nop
  31. fiq:
  32.     nop
  33. reset:
  34.     nop
gboot.lds编写

  1. OUTPUT_ARCH(arm)               这个标明了输出的架构格式
  2. ENTRY(_start)                    设置了CPU从哪个地址开始

  3. SECTIONS {
  4.     . = 0x30008000;                设置文件的起始地址

  5.     . = ALIGN(4);                    4字节对齐
  6.     .text :
  7.     {
  8.     start.o(.text)                    代码段的起始文件,最先运行这个
  9.     *(.text)
  10.     }
  11.     
  12.     . = ALIGN(4);
  13.     .data :
  14.     {
  15.     *(.data)
  16.     }
  17.     
  18.     . = ALIGN(4);
  19.     bss_start = .;                    记录bss段的起始地址
  20.     .bss :
  21.     {
  22.     *(.bss)
  23.     }
  24.     bss_end = .;                        记录bss段的结束地址
  25. }
Makefile编写

  1. all : start.o
  2.     arm-linux-ld -Tgboot.lds -o gboot.elf $^
  3.     arm-linux-objcopy -O binary gboot.elf gboot.bin

  4. #从这里先写,可以写个通用的方式    
  5. %.o : %.S
  6.     arm-linux-gcc -g -c $^
  7. #然后给c文件留个位置    
  8. %.o : %.c
  9.     arm-linux-gcc -g -c $^

阅读(1782) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~