问题1,
在在ota结束,会根据固件的标志位进行来执行关闭全局中断
然后直接跳转还是搬中断向量表
这里如果当前运行的是固件A,是直接跳转到固件B的,
/* 编程结束 */
case CMD_IAP_END:
{
PRINT("IAP_END rn");
/* 当前的是ImageA */
if(CurrImageFlag == IMAGE_A_FLAG)
{
/* 修改DataFlash,切换至ImageB */
SwitchImageFlag(IMAGE_B_FLAG);
/* 关闭当前所有使用中断,或者方便一点直接全部关闭 */
DisableAllIRQ();
/* 保证打印结束 */
DelayMs( 10 );
/* 跳入ImageB运行 */
GotoResetVector(IMAGE_B_ENTRY_ADD);
}
/* 当前的是ImageB */
else
{
/* 修改DataFlash,切换至ImageA */
SwitchImageFlag(IMAGE_A_FLAG);
/* 关闭当前所有使用中断,或者方便一点直接全部关闭 */
DisableAllIRQ();
/* 编程ImageA第一块 */
FlashBlockErase(IMAGE_A_START_ADD);
FlashWriteBuf(IMAGE_A_START_ADD, (PUINT32) vectors_block_buf, FLASH_BLOCK_SIZE);
/* 保证打印结束 */
DelayMs( 10 );
/* 跳入ImageA运行 */
GotoResetVector(IMAGE_A_ENTRY_ADD);
}
break;
}
B的程序起始地址是在后面, 在程序一开始的时候会进行判断,然后拷贝中断想向量表,这时候因为全局中断关掉了,所以没问题,
int main( void )
{
GPIOA_ModeCfg( GPIO_Pin_All, GPIO_ModeIN_PU );
GPIOB_ModeCfg( GPIO_Pin_All&(~(GPIO_Pin_11|GPIO_Pin_10)), GPIO_ModeIN_PU );
#ifdef DEBUG
GPIOA_SetBits(bTXD1);
GPIOA_ModeCfg(bTXD1, GPIO_ModeOut_PP_5mA);
UART1_DefInit( );
#endif
PRINT("%sn",VER_LIB);
ReadImageFlag();
ImageVectorsCopy(); // <<-----------------------------------------------------
CH57X_BLEInit( );
HAL_Init( );
GAPRole_PeripheralInit( );
Peripheral_Init( );
while(1){
问题2,
WCH的ble 协议栈可以无中断运行.