求助原子哥关于IAP代码的问题

2019-07-20 11:09发布

官方的IAP跳转如下
else
  {
    /* Test if user code is programmed starting from address "APPLICATION_ADDRESS" */
    if (((*(__IO uint32_t*)APPLICATION_ADDRESS) & 0x2FFE0000 ) == 0x20000000)
    {
      /* Jump to user application */
      JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4);
      Jump_To_Application = (pFunction) JumpAddress;
      /* Initialize user application's Stack Pointer */
      __set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);
      Jump_To_Application();
    }
  }


原子哥的如下
if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
                        {         
                                iap_load_app(FLASH_APP1_ADDR);//执行FLASH APP代码
                        }

求助大家红体部分 0x2FFE0000 ) == 0x20000000)    0xFF000000)==0x08000000)
这有什么区别,还有APP地址后面+4是为了向量表吗?谢谢


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
8条回答
lzq12
2019-07-20 23:29
这两个的区别是0x20000000是跳转到RAM去运行,0x08000000是跳转到FLASH去运行,至于是0x20000000还是0x08000000这个就是我们跳转的APP的bin文件设置的,也就是说这个APP程序在编写的时候,在option for Target里面IROM1设置的地址。原子哥的跳转是把bin文件的内容拷贝到指定的RAM,然后在跳转运行的,所以是判断0x20000000,如果你要跳转的程序是在FLASH里面运行,那就是0x08000000。需要注意的是原子哥的跳转,由于RAM的大小有限,所以对bin文件有大小限制,在100K左右。+4我看了好像就是向量表的地址偏移。

一周热门 更多>