我自己实现了一个iap程序(iap不使用蓝牙协议栈),在跳转不使用蓝牙协议栈的app程序中可以正常工作,但跳转到使用了蓝牙协议栈的app程序就无法运行。
请问蓝牙协议栈需要做什么操作?或者如何使程序正常运行?
另外,蓝牙iap例程中的跳转指令(
#definejumpApp ((void (*)(void))((int *)(IMAGE_A_START_ADD-0x08000000)))
jumpApp();
)为何不能使用?
我自己实现了一个iap程序(iap不使用蓝牙协议栈),在跳转不使用蓝牙协议栈的app程序中可以正常工作,但跳转到使用了蓝牙协议栈的app程序就无法运行。
请问蓝牙协议栈需要做什么操作?或者如何使程序正常运行?
另外,蓝牙iap例程中的跳转指令(
#definejumpApp ((void (*)(void))((int *)(IMAGE_A_START_ADD-0x08000000)))
jumpApp();
)为何不能使用?
“跳转到使用了蓝牙协议栈的app程序就无法运行”使用到的蓝牙协议栈是与APP层代码一同编译的吗?还是使用了wchble_rom.hex固定库。
若是前者,注意jumpApp();跳转到的地址与APP层代码.ld文件中配置的起始地址一致即可。
若是后者,另外要注意.s文件中添加跳转到固定库的代码。烧录时需要将IAP、APP层代码、固定库hex文件合并烧录。可以参考博客:V208实现OnlyUpdate方式的OTA - JayWell - 博客园 (cnblogs.com)
目前在APP中蓝牙协议栈是一同编译的,这时执行跳转还需如何操作?
另外,能否提供更详细的使用固定库的方法?
IAP用不到蓝牙,flash使用大小会超过16K,那么APP层的起始地址至少要放在20K。BLE的OTA方案中,IAP代码占用小于16K,APP层代码是在16K地址处起始的。
注意点①起始地址和APP层代码.ld的起始地址保持一致;②IAP中的中断,在跳转到APP层代码前,全部关闭,总中断和独立的中断标志都要关闭。③.s文件中进入机器模式权限再跳转到其他层代码,或者在中断服务函数中跳转到其他层。
使用固定库是什么方面有疑问呢。总的来讲就是配置各种宏定义来配置APP层代码从固定库中调用协议栈接口。
CH573 CH582 CH579 固定LIB OTA - debugdabiaoge - 博客园 (cnblogs.com)
目前app程序中包含了协议栈,每次升级数据包太大了,如果分离了蓝牙协议栈,每次仅升级代码部分则可减少内存占用和降低升级所用的时间。