CH579的bootloader问题

请问一下,在eeworld上有2篇文章ch579的bootloader方式文章,我有2个疑问请教一下官方,

  1. 方式一,网址:http://bbs.eeworld.com.cn/thread-1154663-1-1.html,这个里面如果在ImageA里升级ImageB,然后把ImageB的中断向量表拷贝到ImageA的前面,那么此时正在运行的ImageA还能正常运行吗??按我的理解,没拷贝之前应该是ImageA的中断向量表,一拷贝,变成了ImageB的中断向量表,还怎么正常运行呢?


  2. 方式二,网址:http://bbs.eeworld.com.cn/thread-1155595-1-1.html,在这个代码里,当App跳转到Bootloader的时候,没有重设置中断向量表,那Bootloader怎么能正常工作呢??

谢谢!

问题1,

在在ota结束,会根据固件的标志位进行来执行关闭全局中断

然后直接跳转还是搬中断向量表

这里如果当前运行的是固件A,是直接跳转到固件B的

		/* 编程结束 */
		case CMD_IAP_END:
		{
			PRINT("IAP_END \r\n");
			
			/* 当前的是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("%s\n",VER_LIB);
	ReadImageFlag();
	ImageVectorsCopy();  //   <<-----------------------------------------------------
	CH57X_BLEInit( );
	HAL_Init( );
	GAPRole_PeripheralInit( );
	Peripheral_Init( ); 
	while(1){

问题2,

WCH的ble 协议栈可以无中断运行.


谢谢答复,关于问题2,我测试下来,BLE还是需要一个LLE_IRQHandler的(该中断猜测是为BLE协议栈服务),如果单程序(无OTA),把这个注释了,蓝牙无法运行,但是在方式2里,经过测试,发现即使把OTA里的LLE_IRQHandler注释依然可以正常运行(在跳转到OTA后),此处我想可能是因为跳转到OTA后,前面的中断向量表依然指向APP的中断向量表(尚未被擦除),所以依然能正确执行LLE_IRQHandler,但是一旦执行擦除,OTA首要任务是将自身的中断向量表拷贝到0地址的前512字节,才能保证OTA程序继续正常运行。


只有登录才能回复,可以选择微信账号登录