韦东山嵌入式第一期14课第004节_und异常模示程序示例_P笔记

本节课的第一个程序韦老师是想让大家见识一下未定义异常,而第二个程序是对第一个程序进行改进,防止在某些条件下执行不了,下面就来讲一下第2个程序改进了哪些地方并且有什么用。

程序在此路径中:源码文档图片\源码\源码_20180321_添加传感器\014_und_exception_014_004

                                                      第一个程序中uart0_init所在地址为300001e4

 

假设我们为NAND启动,在清除了BSS段之后,我们的程序完全拷贝到SDRAM里了,如果我们的程序很大,那么uart0_init就有可能在4K之后,那么采用b1相对跳转必定会出错,所以我们必须使用绝对地址来跳转到SDRAM上,修改代码如下:

使用ldr伪指令实现绝对跳转把程序跳转到SDRAM上去,不过其实这种做法也有可能有“危险”,下面我们结合反汇编来看一下

第58行把地址为0X300000dc的内存的值300000b0赋给了pc,也就是使程序跳转到了sdram:处的bl 300001f0,然后再跳转到uart0_init。ldr伪指令的执行机制是这样的:把sdram这个地址放到内存中,内存的地址由编译器帮我们做好,一般放在.S汇编文件的最后,然后再把这个内存的值赋给pc实现绝对跳转,倘若我们的.S文件大过4K,那岂不是也会出错,其实我们可以人为地来修改这个内存的地址,我们可以这样做(下面以未定义异常来举例说明):

当我们程序出现未定义异常时,会自动跳转到第7行的ldr pc, und_addr,该语句把und_addr(30000008)这个地址里的值(3000000c)赋给了pc,从而实现了绝对跳转,可以看到,我们人为地加入了und_addr:就是把存放要赋给pc的值的内存放到前面来(仅仅在_start:之后,_start:段存放的信息很少,所以不会出现上面用ldr伪指令存在的问题)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值