本帖最后由 luaffy 于 2020-8-17 12:22 编辑
什么叫建立中断向量表?按笔者的理解解释一下——
就是写这种东西。
笔者为了底部的flash截图看起来好看一点,就把所有的中断几乎全建立起来了,所以才有图三所示的填得满满当当的中断向量区。这是个不好的做法,各位不要学,这里笔者吃了大亏,等会详谈。
如果没有建立,例如看门狗定时器的中断,xcl文件中设置的中断向量区中,对应的定时器A1的中断向量就只是FF。示例的bootloader和app程序里,都没有建立看门狗定时器中断,于是对应的位置是ff。
再献上内存窗口的图——
Msp430f247.h硬件中断向量地址
0xfff4为硬件中断向量区中的看门狗定时器的地址
中断向量区里的地址指向中断程序执行入口。如上图我们可知0xfff0是定时器A1中断向量的地址,从内存窗口可以看到,0xfff0上的数据为8628,再献上汇编窗口——
可以看到8628指向定时器A1中断程序入口。
除此之外,中断最重要的是复位中断。程序一般只响应硬件中断向量区中的中断向量,上电是先运行硬件中断向量区的复位中断,如果复位中断向量写值错误,容易造成单片机死机。
工欲善其事必先利其器,理解好中断后,就能理解为何直接把APP的中断向量区简单粗暴直接复制到硬件中断向量区就能完美运行具有中断程序的APP了。
这是最后一步,在bootloader的场子,升级APP的数据文件接收并写入相应flash区结束后,或者直接想跳转APP,你再操作擦写中断向量区。由于当前硬件中断向量区储存的是bootloader的中断向量,为了不丢失原有的bootloader中断向量,还得先把硬件中断向量写到提前开辟的bootloader中断向量区,再把APP的中断向量写到硬件中断向量区。同理可得,在APP的场子,你想回到bootloader程序区得把硬件中断向量区的中断向量存回APP中断向量区,把bootloader的中断向量写到硬件中断向量区。
都说bootloader中尽量不要开中断,但在笔者的方案里,bootloader中断尽管用,没关系,no problem,大丈夫,当然说是这么说,乱开一通还是不好的,省点单片机资源。
说到这里就可以解释应用这种中断处理方案的bootloader为什么不能做到全局初始化功能。bootloader跳转到APP后,硬件中断向量区已经存储了APP中断向量,系统重新上电后,从APP的复位向量地址(当前0xfffe)开始运行,不再经过bootloader。
|