IAP实现原理

IAP实现原理

讲完了一些背景知识,我们可以切入正题了。实现IAP的核心原理很简单,就是在flash中保留一个小的升级程序,即boot loader。为了安全起见boot loader一般放在芯片默认启动起始位置,这样即使升级过程中发生错误,芯片依然可以通过重启进入boot。比较标准的方式是一个bootloader和一个app,bootloader主要负责和iap有关的工作,若启动后无IAP任务bootloader把CPU使用权转交给APP,开始正式工作。

Bootloader转交CPU使用权的过程中,就涉及到程序重定位问题,重定位方面的问题主要包括两个,其一是函数重定位问题:使用mdk时默认是以芯片基址作为程序的基址,这也就使得boot和app程序地址发生重叠,使用某个app函数可能会跳转到boot的某一段程序上。其二是中断向量表重定位的问题:发生中断事件时芯片以中断向量表基址+中断偏移量找到中断处理函数的地址存放位置,若app执行时中断向量表依然指向芯片默认起始位置,就可能出现在app中使用boot中断函数的尴尬局面。

除此之外,还有一个是中断问题,中断在iap过程中是一个要十分谨慎处理的部分,处理不好可能出现各种严重事故和各种难以追踪到的bug(相信我,你不会想在各种随缘复现的错误中找bug的)。
————————————————
版权声明:本文为CSDN博主「csdn1344789841」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/CSDN1344789841/article/details/114902609

 

 

bootloader实现

原理讲完实现就是水到渠成的事了,首先要新建一个boot loader工程,默认情况下boot loader只需要简单跳转到app即可

主函数如图所示,首先要初始化一次中断向量表,随后初始化所需的硬件,判断跳转的条件是否满足,若满足则直接跳转到app,否则执行boot中的IAP主任务函数。

 

 

 

注意,下面是重点中的重点,搞懂了下面的部分,IAP就不是问题了

 

 

 

核心函数: IAP_JumpTo,进入函数后首先判断所给出的程序地址是否可能是有效的,即地址中第一组值是否是一个有效的内存值,若是,则正式开始跳转。

首先屏蔽所有中断,防止跳转前的预处理过程被打扰。
设置指针
关闭所有外设中断,所有的外设中断都要在这个函数里关掉,另外注意,滴答定时器的中断是没法通过正常的关中断方式关闭的,因此要单独处理,调用systick_deinit直接把滴答定时器关掉。
设置psp和msp,其中psp不是必须的,在没有使用RTOS的程序中可以不用管。
重定位中断向量表,这一步对应中断处理函数地址问题。
现在已经可以跳转,但在跳转之前还要做一点清尾工作:首先要清除所有的已挂起中断,防止隐藏中断出现,其次,重新打开全局中断,然后跳转到app的地址即可。
到这里boot跳转原理已经讲完,然后我们再来看一下app。

 

APP设置

与boot loader不同,app不需要在程序里特别处理什么,但项目设置要改

主要是两个部分,一个是target中的ROM基址要改,另一个是下载器的ROM基址要改,如下图所示

另外注意,一定要屏蔽app的systeminit函数中设置中断向量表的部分,否则可能影响中断向量表基址。

 

 

 

 

 

 

IAP的核心部分就是这样,之后就是在boot loader中添加接收app bin文件并写入芯片flash的功能。接收bin的方式有很多,例如常见的串口,usb,rs485,can甚至可以通过TF卡,网络等等。再调用芯片库函数中的flash操作函数将接收到的bin文件写入flash中即可,当然还可以在此基础上添加一些其他的功能和逻辑。本节先只讲一下核心原理,其余的部分可能会在之后讲到。


————————————————
版权声明:本文为CSDN博主「csdn1344789841」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/CSDN1344789841/article/details/114902609

posted @ 2022-09-08 19:23  流水江湖  阅读(424)  评论(0编辑  收藏  举报