LCD实验学习笔记(二):head.S
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值,所以继续原程序执行
最新文章
- Java多线程理解
- openssl evp 哈希算法(md5,sha1,sha256)
- phpcms--使用添加php原生支持
- 兰勃特投影C#实现
- No bean named 'transactionManager' is defined
- css布局: 两栏 自适应高度
- Software Industry Revolution----POJ3898----DP
- Spring MVC整合DWR
- win下安装Redmine常见错误解决方案
- jQuery中$(function(){})与(function($){})(jQuery)、$(document).ready(function(){})等的区别详细讲解 ----转载
- selenium + python自动化测试(一)
- sublime和vscode 格式化Json ——两步走
- Java核心技术卷一基础知识-第8章-事件处理-读书笔记
- Eclipse错误集合
- 方法 - ShellCode测试
- 20155215 2016-2017-2《Java程序设计》课程总结
- Holm–Bonferroni method
- [BZOJ4869][六省联考2017]相逢是问候(线段树+扩展欧拉定理)
- Dubbo (开源分布式服务框架)
- BZOJ3670:[NOI2014]动物园
热门文章
- C#操作Excel文件(转)
- gcc6.3编译c++11的程序链接opencv时字符型函数未定义
- BZOJ 4276 [ONTAK2015]Bajtman i Okrągły Robin 费用流+线段树优化建图
- HDU 2175 汉诺塔IX
- XML中的DTD语法
- WIN8 打开图片内置管理员无法激活此应用
- cf 442 D. Olya and Energy Drinks
- [Leetcode] plus one 加一
- BZOJ2257 [Jsoi2009]瓶子和燃料 【裴蜀定理】
- BZOJ3211 花神游历各国 【树状数组 + 并查集】