新手上路
- 积分
- 21
- 金钱
- 21
- 注册时间
- 2020-5-27
- 在线时间
- 6 小时
|
1金钱
本帖最后由 robinhoodhobby 于 2020-6-13 09:53 编辑
想知道程序所占大小的目的是想自己把FLASH里已有的APP程序,发送出来或转移(只针对APP,bootloader和数据均不动)。
或者是程序结尾地址或程序结尾标识符,不知道有没有这种标识符。
比如,假设FALSH空间为1M(0x0010 0000)里面程序和数据有:Bootloader(假设0x0800 0000开始, 占用空间 0x0000 1000),
APP1 (假设0x0800 5000开始,占用空间(不确定,后面问题详细说明)),
数据 (假设0x0808 0000开始,占用空间 0x0000 1234),起始地址和空间大小可能会随APP变。
假设APP1程序版本及大小分别为A1=100K, A2=200K, A3=128K;
情况分析
A1由SWD下载进FLASH,那么A1所占用的空间是从 0x0800 5000开始后的100K空间所占用的扇区(假设占用扇区x1,x2,x3,x4)。因为是SWD下载,所以无法将程序长度写到特定地方(比如X)保存(编译后才得知长度,不可能提前写入程序代码)。
A2由IAP更新,那么A2会根据自身大小,先清掉200K所占用的扇区,然后开始更新,所占用的空间是从 0x0800 5000开始后的200K空间所占用的扇区(假设占用扇区x1,x2,x3,x4,x5)。因为是IAP更新,所以可以在IAP程序里算出程序长度,写到特定地方保存(比如X)。
A3由SWD下载进FLASH,那么A3会根据自身大小,先清掉128K所占用的扇区,然后开始更新,所占用的空间是从 0x0800 5000开始后的200K空间所占用的扇区(假设占用扇区x1,x2,x3,x4)。因为是IAP更新,所以可以在IAP程序里算出程序长度,写到特定地方保存(比如X)。 此时扇区x5可能任然存在数据(这里是根据下载bootloader后再下载APP后,bootloader程序并不会丢失,推测SWD下载时并不会全片数据清除,如不是这样的机制,请大佬解答一下)。
思路1:从FALSH 0x0808 0000开始,反向查找第一个非0xFFFF FFFF数据来判断程序结尾。 困惑点或难题点:如果是遇见A3这种情况,那不是找到的是假的程序结尾处了么。
思路2:以APP的0x0800 5000为CODE数据开始点,以数据的 0x0808 0000为CODE数据结束点。 困惑点或难点:如果这样,因为APP的大小不确定,那事先就要规划好一大片区域,不能比最终APP小,但是最终APP有可能很大,有可能很小,如果最终APP很大,那还好说,至少都用上了,如果最终APP很小,那不就浪费很多空间了么。
思路3:不知道SWD下载或者编译器编译好后,会自动把大小放在某个位置,然后可以通过 MDK或IAR设置,在SWD下载时自动将此数据放到FLASH固定地址位。
思路4:STM32编译器编译出最终程序 是否有固定的程序结尾标识符,通过搜索此结尾标识符,达到找到程序结尾处目的。
|
最佳答案
查看完整内容[请看2#楼]
可以把生成的hex或者bin文件的结尾加上自定义数据,应该没有影响的,bin文件我加过,hex没实验过,不过应该也可以
|