基本概念: hex文件带地址信息,bin文件不带地址信息。 BlueNRG系列MCU,程序地址在编译时是强绑定的,比方说编译的程序地址是从0x10050000,直接直接下载该程序的bin文件到0x10040000是无法运行起来的。 不同编译平台,对应的linker设置位置不同 Keil -----> Option for target 'xxxx' ---> Linker-----> Misc controls IAR -----> Options ---> Linker ---> Configuration file symbol definitaions True studio ---> xxxx---> xxxxx // 此处我暂时也没有找到对应的地方 **A类OTA(升级服务存在于应用端)**Flash分布 +-----------------------+ 0x10080000 | | | NVM(4K) | +-----------------------+ 0x1007E800 | | | Higher app (124K) | +-----------------------+ 0x1005F800 | | | Lower app (124K) | +-----------------------| 0x10040800 | Reset Manager (2K) | +-----------------------+ 0x10040000 // 上述A类OTA(升级服务存在于应用端)Flash 布局 // 如果没有定义RESET_MANAGER_SIZE 则默认为2K if( !isdefinedsymbol( RESET_MANAGER_SIZE) ) { define symbol RESET_MANAGER_SIZE = 0x800; }// 计算应用程序可用大小 define symbol MEMORY_FLASH_APP_SIZE = (((_MEMORY_FLASH_SIZE_ - RESET_MANAGER_SIZE - FLASH_NVM_DATASIZE)/2)/2048)*2048;// 计算应用程序偏移 define symbol MEMORY_FLASH_APP_OFFSET = RESET_MANAGER_SIZE; // or /* define symbol MEMORY_FLASH_APP_OFFSET = RESET_MANAGER_SIZE + MEMORY_FLASH_APP_SIZE; */ST_OTA_HIGHER_APPLICATION: Flash高地址部分的应用(上图Higher app ),当使能这个宏,编译应用程序到Flash的高地址,此方式支持OTA备份。 ST_OTA_LOWER_APPLICATION: Flash低地址部分的应用(上图 Lower app ),当使能这个宏,编译应用程序到Flash的低地址,此方式支持OTA备份。 RESET_MANAGER_SIZE: 影响MEMORY_FLASH_APP_SIZE 和MEMORY_FLASH_APP_OFFSET的数值。如果使用A类静态协议栈方式OTA,这个数值一般在应用程序的linker处重新定义(协议栈和这部分融合在一块了)。 **B类OTA(升级服务存在于应用端)**Flash分布+-----------------------+ 0x10080000| || NVM(4K) |+-----------------------+ 0x1007F000| || User app (182K) |+-----------------------+ 0x10051800| OTA Service || Manager (70K) |+-----------------------+ 0x10040000// 上述B类OTA(升级服务存在于boot端)Flash 布局if( !isdefinedsymbol( SERVICE_MANAGER_SIZE) ) { define symbol SERVICE_MANAGER_SIZE = 0x11800; /* Including OTA firmware upgrade service manager application */}// 计算应用程序sizedefine symbol MEMORY_FLASH_APP_SIZE = _MEMORY_FLASH_SIZE_ - SERVICE_MANAGER_SIZE - FLASH_NVM_DATASIZE;// 计算应用程序偏移define symbol MEMORY_FLASH_APP_OFFSET = SERVICE_MANAGER_SIZE; ST_USE_OTA_SERVICE_MANAGER_APPLICATION: 如果定义了此宏,使用上述方式B(升级服务存在于boot端, BLE_OTA_ServiceManager + application)内存方式 SERVICE_MANAGER_SIZE: 影响MEMORY_FLASH_APP_SIZE 和MEMORY_FLASH_APP_OFFSET的数值。如果使用B类静态协议栈方式OTA,这个数值一般在应用程序端的linker处需重新定义。 C类非OTA类程序Flash分布 +-----------------------+ 0x10080000 | | | NVM(4K) | +-----------------------+ 0x1007F000 | | | User app (252K) | +-----------------------+ 0x10040000 // 如果没有定义MEMORY_FLASH_APP_OFFSET 则默认0偏移 if( !isdefinedsymbol( MEMORY_FLASH_APP_OFFSET) ) { define symbol MEMORY_FLASH_APP_OFFSET = 0; } // 如果没有定义MEMORY_FLASH_APP_SIZE, 则默认Flash size -NVM区域可用 if( !isdefinedsymbol( MEMORY_FLASH_APP_SIZE) ) { define symbol MEMORY_FLASH_APP_SIZE = _MEMORY_FLASH_SIZE_ - FLASH_NVM_DATASIZE - MEMORY_FLASH_APP_OFFSET; }
|