ARM加电后从0地址开始取指执行。

连接为bin文件时时,连接脚本lcd.lds指定将head.o放在开头,所以head.S就是系统起步的地方。

head.S开头就是异常向量定义,0地址就是reset中断。

发生不同的异常,系统跳转到相应函数处理。

系统启动时就进入reset函数进行初始化,并将程序复制到SDRAM,然后跳到SDRAM继续执行。


.extern main  @表示全局查找外部文件中的main函数

.text
.global _start
_start:
  b Reset  @0地址,b指令直接跳转到Reset函数地址执行。b指令相当于mov pc,=Reset。bl是调用子程序指令,相当于ldr r14,pc 然后调用子程序,子程序返回时,再mov r14,pc

HandleUndef:  
  b HandleUndef   @ 0x04: 未定义指令中止模式的向量地址

HandleSWI:
  b HandleSWI  @ 0x08: 管理模式的向量地址,通过SWI指令进入此模式

HandlePrefetchAbort:
  b HandlePrefetchAbort  @ 0x0c: 指令预取终止导致的异常的向量地址

HandleDataAbort:
  b HandleDataAbort  @ 0x10: 数据访问终止导致的异常的向量地址

HandleNotUsed:
  b HandleNotUsed  @ 0x14: 保留

HandleIRQ:

  b HandleIRQ  @ 0x18: 中断模式的向量地址

HandleFIQ:
  b HandleFIQ  @ 0x1c: 快中断模式的向量地址

Reset:
  ldr sp, =4096 @ 设置栈指针,以下都是C函数,调用前需要设好栈
  bl disable_watch_dog @ 关闭WATCHDOG,否则CPU会不断重启
  bl clock_init @ 设置MPLL,改变FCLK、HCLK、PCLK
  bl memsetup @ 设置存储控制器以使用SDRAM
  bl nand_init @ 初始化NAND Flash

  @ 复制代码到SDRAM中
  ldr r0, =0x30000000   @ 调用CopyCode2SDRAM函数前,设置调用参数。参数1 目标地址 = 0x30000000,这是SDRAM的起始地址
  mov r1, #4096    @  第二个参数 源地址 = 4096。lcd.lds连接脚本中规定了.text段的地址号从0x30000000开始,放在了bin文件的4096开始的位置
  mov r2, #16*1024    @ 第三个参数 复制长度 = 16K,因为本实验程序代码长度不会超过16K

  bl CopyCode2SDRAM @ 调用C函数CopyCode2SDRAM

  bl clean_bss @ 清除bss段,未初始化或初值为0的全局/静态变量保存在bss段

  msr cpsr_c, #0xd2 @ 进入中断模式
  ldr sp, =0x31000000 @ 设置中断模式栈指针

  msr cpsr_c, #0xdf @ 进入系统模式
  ldr sp, =0x34000000 @ 设置系统模式栈指针,

  ldr lr, =ret_initirq @ 设置返回地址 ,中断初始化函数执行完后,进行开中断、调用main函数
  ldr pc, =init_irq @ 调用中断初始化函数

ret_initirq:
  msr cpsr_c, #0x5f @ 设置I-bit=0,开IRQ中断

  ldr lr, =halt_loop @ 设置返回地址
  ldr pc, =main @ 调用main函数
halt_loop:
  b halt_loop

HandleIRQ:  @中断向量指向的中断处理函数。首先保存现场,然后调用c写的中断分发函数,完成后,恢复现场
  sub lr, lr, #4 @ 计算返回地址,当前lr-4
  stmdb sp!, { r0-r12,lr } @ 保存使用到的寄存器到中断栈
  ldr lr, =int_return @ 设置调用IRQ_Handle函数后的返回地址
  ldr pc, =IRQ_Handle @ 调用中断分发函数,在interrupt.c中

int_return:
  ldmia sp!, { r0-r12,pc }^ @ 中断返回, ^表示将spsr的值复制到cpsr。pc值恢复为中断前的lr值,所以继续原程序执行


LCD实验学习笔记(二):head.S的更多相关文章

  1. LCD实验学习笔记(十):TFT LCD

    硬件组成: REGBANK是LCD控制寄存器组,含17个寄存器及一块256*16的调色板,用来设置参数. LCDCDMA中有两个FIFO,当FIFO空或数据减少到阈值,自动发起DMA传输,从内存获取图 ...

  2. LCD实验学习笔记(一):Makefile

    主Makefile总领全局的就这句—— lcd.bin: $(objs) 要生成lcd.bin,依赖于objs列举的一堆文件:head.o init.o nand.o interrupt.o seri ...

  3. LCD实验学习笔记(九):UART

    s3c2440包含三个通用异步收发器,可工作于中断模式或DMA模式.每个UART包含两个64字节的FIFOs用于接收和发送数据.可编程设置波特率.1或2个停止位,5/6/7/8个数据位和奇偶校验状态. ...

  4. LCD实验学习笔记(八):中断

    s3c2440有60个中断源(其中15个为子中断源). 31个32位的通用寄存器,6个程序状态寄存器.有6种工作模式(系统/用户模式,快中断模式,管理模式,数据访问中止模式,中断模式,未定指令中止模式 ...

  5. LCD实验学习笔记(七):NAND FLASH

    s3c2440 CPU内置NAND FLASH控制器.相关寄存大器起始地址为0x4e000000. 通过设置NFCONF寄存器,设置NAND FLASH 时序. 通过设置NFCONT寄存器,使能NAN ...

  6. LCD实验学习笔记(六):存储控制器

    s3c2440可使用地址空间为1GB(0x00000000到0x40000000). 1G空间分为8个BANK,每个BANK为128MB. 设27条地址线,和8个片选引脚(nGCS0-nGCS7). ...

  7. LCD实验学习笔记(五):MMU

    内存管理分别页表机制和内存分配机制两块. 页表机制就是管理设备真实物理地址与虚拟地址的动态或静态的映射,基于cpu内部的mmu(内存管理单元)进行. CP15(协处理器)的C0(缓存)是一级页表,含4 ...

  8. LCD实验学习笔记(四):系统时钟

    一般CPU频率(FCLK)高于内存.网卡等设备频率(HCLK),而串口.USB.I2C等设备频率(PCLK)更低. 系统时钟: 系统时钟源为晶振,初始频率12MHz. 通过设置MPLLCON寄存器的M ...

  9. LCD实验学习笔记(三):WATCH DOG

    看门狗是为了能够防止程序跑飞用的.程序应该定时的去喂狗.如果程序跑飞了,那么就不会去喂狗了.如果超过了喂狗的时间,那么狗就会生成一个信号来reset CPU.一般程序不需要,特殊情况下需要这种机制. ...

随机推荐

  1. 命令行下对apk签名

    l创建key,需要用到keytool.exe (位于jdk安装目录\bin目录下),使用产生的key对apk签名用到的是jarsigner.exe (位于jdk安装目录\bin目录下),把上两个软件所 ...

  2. 「暑期训练」「Brute Force」 Restoring Painting (CFR353D2B)

    题意 给定一定条件,问符合的矩阵有几种. 分析 见了鬼了,这破题谁加的brute force的标签,素质极差.因为范围是1e5,那你平方(枚举算法)的复杂度必然爆. 然后你就会思考其中奥妙无穷的数学规 ...

  3. LeetCode - 67. Add Binary(4ms)

    Given two binary strings, return their sum (also a binary string). The input strings are both non-em ...

  4. 文件特殊权限:SUID,SGID,SBIT

    我们之前认识的文件的权限仅局限于r,w,x,但如果我们执行命令“ll /tmp; ll /usr/bin/passwd”,会出现除了r,w,x之外的其他字母: 即出现了特殊权限(s跟t). [SetU ...

  5. VS2010历史记录清理

    把如下粘贴到文本文件里,另存为批处理文件.(后缀为 *.bat)双击执行就可 @echo off cd \ @echo on @REG Delete HKEY_CURRENT_USER\Softwar ...

  6. poj1789 Truck History最小生成树

    Truck History Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 20768   Accepted: 8045 De ...

  7. 【历史】- 一段关于 Unix、Linux 和 Windows 的暗黑史

    “SCO在言语上变得越来越好斗,而且还拒绝展示有关诉讼的任何证据,一切都似乎在表明,SCO只不过是在那里拉虎皮做大旗地狂言乱语.但是,微软决不会轻易放弃这么可以一个利用这些狂言乱语的好机会.”2003 ...

  8. 【bzoj1263】[SCOI2006]整数划分 高精度

    题目描述 从文件中读入一个正整数n(10≤n≤31000).要求将n写成若干个正整数之和,并且使这些正整数的乘积最大. 例如,n=13,则当n表示为4+3+3+3(或2+2+3+3+3)时,乘积=10 ...

  9. 【算法】最小乘积生成树 & 最小乘积匹配 (HNOI2014画框)

    今天考试的时候果然题目太难于是我就放弃了……转而学习了一下最小乘积生成树. 最小乘积生成树定义: (摘自网上一篇博文). 我们主要解决的问题就是当k = 2时,如何获得最小的权值乘积.我们注意到一张图 ...

  10. [洛谷P4291][HAOI2008]排名系统

    题目大意:三种操作: $+Name\;Socore:$上传最新得分记录,把以前的记录删除. $?Name:$ 查询玩家排名.如果两个玩家的得分相同,则先得到该得分的玩家排在前面. $?Index:$ ...