S3C6410裸机进不了中断(异常)处理函数、MMU、lds链接地址相关问题
来源:互联网 发布:上海预算软件 编辑:程序博客网 时间:2024/06/06 09:42
第一部分:异常、中断原理知识:http://blog.csdn.net/u013476840/article/category/1914325/1
第二部分:异常、中断代码:http://blog.csdn.net/u013476840/article/category/1914325/1
第三部分:MMU:
http://www.jianshu.com/p/faebd7feb218
http://comm.chinaaet.com/adi/blogdetail/40052.html
所谓MMU(虚拟内存管理单元),无非就是把物理地址转换为虚拟地址。所谓物理地址,用的STM32的都知道,它的RAM是从0x20000000开始的,ROM是从0x8000000开始的,这就是物理地址,也就是说在0x20000000这个地址里面放的就是一个值(当然你放的是几,里面存放的就是几),你给RAM一个地址0x20000000并给了读信号,数据线上就会出现你放进去的值,这就是实实在在的物理地址。而虚拟地址,就和它的位段有些相似,你访问的地址,并不是真正的物理介质里面的地址。你访问一个地址,比如0x20,可能会被MMU映射到0x80里面去了,在开启MMU之后,你写了一条指令,往0x20这个地址里面写了一个数,比如8,然后MMU就会向存储器发出命令,向0x80这个物理地址写入数据8。当然,这些你都不知道,这是MMU私下干的。当你要求读这个值的时候,写了从0x20读指令,然后MMU就会从物理地址0x80把这个数(8)读出来,并送给你,然后你并不知道他私下已经干了那么多事,你表面看来就是往0x20这个地址写了一个数8,然后读出来也是8,这就对了。
第四部分:程序用jlink+eclipse仿真进不了中断
最近调试按键触发中断的裸机程序时,.bin下载到SDRAM中就是进不了中断。在jlink下调试.elf文件,也一样进不了中断。其实,仿真的时候,你的程序也是运行在SDRAM里面的,也就是0x5000_0000处开始运行。所以上述问题本质上是同一个问题。
后来想了一下,其实在jlink中调试中断这个方法论都是错误的,利用minitools的download&run功能到SDRAM也是错误的。因为两种情况下内部SDRAM在6410的起始地址是0x5000_0000,这个地方不存在你要调试的程序的中断向量表(向量表在6410的地址是0x0、0x4、0x8……0x18、0x1c),因此将代码直接放到内部SRAM上,肯定不能正确将中断引导到你编写的中断服务程序中来。
解决办法:
1、直接烧写到nand flash的第0块,并从nand启动。因为我们6410上电后,系统会自动将nand中的前8k复制到setppingstone中,而这个setppingstone就是上文提到的6410里面从0地址开始的SRAM。复制的结果就是,我们编写的中断向量表,就到了6410的0地址处,从而让6410能正常进入中断(如果代码大于8K,我们编写的代码中必须要有拷贝到SDRAM功能,但是前8k系统仍然会拷到0地址处的setppingstone中)
2、除了将代码拷贝到0x5000_0000开始的SDRAM外,再改写自己的程序,在初始化中断之前将中断向量表拷贝到0地址开始的SRAM。这样6410也能找得到中断向量表。这个方法貌似有点难度,小弟不才,没敢尝试。
3、利用上文讲的MMU的重定向功能。这就是网上有人说要包含MMU.C然后主程序里面调用init_mmu的原因了。比如,仿真的时候,你的程序是运行在sdram里面的,也就是0x5000_0000处开始运行,你的中断向量表通过仿真器已经放在了0,5000_0000处,打开mmu是为了把0x5000_0000地址处的值映射到0x0的地方,因为你的中断向量表是保存在0x0开始的地方,当中断发生时的第一时间CPU会去0x0地方查中断向量表看是发生了什么中断,是reset还是IRQ还是FIQ还是取数据终止或取指令终止按键外部中断是IRQ中断,然后CPU会去IRQ开始的地方找到你的中断服务函数,这个时候轮到了你的中断服务函数运行的时间了。所以打开MMU后,系统去0x0地址处找中断向量表,而该地址又通过MMU映射到0x5000_0000(0x5000_0000处有向量表),从而系统就能找到向量表(虽然该表放在SDRAM中,但是只要系统能访问到向量表即可),最终就能成功进入中断服务程序。
4、既然nand 0地址处的程序,在系统上电后会自动拷贝到系统的0x0开始的8k SRAM里面,那我岂不是可以提前烧写一个简单的小程序到nand 0处,并让开关从nand启动,这个小程序要包含我的向量表。这样我正式的代码里面即使不开MMU,也能将代码下载到SDRAM里面,或者使用jlink调试了。
参考文章:
http://www.arm9home.net/read.php?tid-6331-fpage-20.html
http://www.arm9home.net/read.php?tid-5148.html
http://www.arm9home.net/simple/index.php?t5717.html
http://www.eeworld.com.cn/mcu/2015/0825/article_21920.html
- S3C6410裸机进不了中断(异常)处理函数、MMU、lds链接地址相关问题
- S3C6410裸机程序相关系统函数
- s3c6410裸机学习笔记(二)--中断
- S3C6410裸机中断编程
- s3c6410中断处理
- s3c6410中断处理
- S3C6410中断处理
- s3c6410中断处理
- s3c6410中断处理
- s3c6410中断处理
- S3C6410中断控制,基于OK6410A裸机按键中断程序设计
- ARM中断返回时间过长的问题(.lds文件)
- 【GCC-ARM裸机开发随笔】----之lds链接脚本分析
- 异常处理也有处理不了的“异常”问题
- S3C6410裸机中断终于搞定了,不需要汇编 ,使用VIC
- S3C6410外部中断裸机学习笔记(VIC模式)
- 《tiny6410裸机程序》第七章:S3C6410外部中断简介
- 《tiny6410裸机程序》第八章:S3C6410外部中断控制寄存器
- 使用到的工具
- Qt4过渡至Qt5
- 140款Android开源优秀项目源码
- Numpy学习笔记之ndarray的索引和切片
- 电子书文档下载:
- S3C6410裸机进不了中断(异常)处理函数、MMU、lds链接地址相关问题
- android studio怎样导入android源码
- validate.js表单验证
- 深入理解Java:注解(Annotation)自定义注解入门
- RecyclerView 实现item点击水波纹动画
- cookie httponly
- springmvc 添加 log4j 日志
- 静默安装、正常安装与打开等PackageManager运用
- CentOS+nginx+uwsgi+Python 多站点环境搭建