需要注意的是每个APP包括IAP都有各自的中断向量表,若在相应代码中有使用中断,跳转前记得先关闭中断,以免刚跳转过去但你还没来得及重新设置中断向量表就进入中断,拍老程序可能跑飞。
你先实现了一个IAP+APP,那么一个IAP+多个APP也就差不多懂了。
1、检查代码跳转方式是否正确:IAP程序为了跳转到bootloader中,使用函数指针+汇编指令的方式进行跳转,这样可以保证代码跳转的正确性。需要检查跳转代码中是虚扮否有误,确保可以正常跳转到指定的ROM段。2、检查内存布局是否正确:在跳转前,需要确保在IAP和bootloader两段程序哗喊之间有足够的空间,以免跳转后出现内存溢出等问乱誉野题。需要检查bootloader程序所在的ROM段以及可以被复制和更新的数据段是否设置正确。
IAP起始地址:iapaddrAPP起始地址:appaddr
中断向量表的起始地址:IAP:iapaddr+4(APP:appaddr+4)
中断向量存储的内容是中断服务程序的入口地址
typedef void(*iapfun)(void) //定义函数指针类型
理解:iapfun表示一个指向函数的指针类型的名字,该指针类型为“指向返回void类型并且无参数的函数的指针”,可以使用函数名对函数指针进行初始化(定义函数指针对象):
iapfun iapjump2app //定义函数指针对象
jump2app=(iapfun)*(vu32*)(appxaddr+4) //为函数指针对象赋改嫌春值
appxaddr+4:APP程序中断向量表起始地址(即复位中者改断)
(vu32*)(appxaddr+4):将APP程序中断向量表起始地址强制类型转换为指向vu32类型数据的地址
*(vu32*)(appxaddr+4):取出(vu32*)(appxaddr+4)地址所存储的内容(这个内容刚好就是该地址对应中断向量的中断服务程序入口地址,其实就是复位核耐中断服务程序函数的函数名)
jump2app() //调用函数
运行的是中断服务程序对应的函数
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)