本节课的第一个程序韦老师是想让大家见识一下未定义异常,而第二个程序是对第一个程序进行改进,防止在某些条件下执行不了,下面就来讲一下第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伪指令存在的问题)