看了官方的iap实现方法,也看了好多大神的例子,感觉还是不够简单易用,所以设计了本方法,不废话,直接上干货。
Link.ld 文件修改:
flash区域划分部分:
/*
FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 288K
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 32K
*/
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 64K
FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 128K
MYFLASH (rx) : ORIGIN = 0x00020000, LENGTH = 128K /* 保存高层逻辑代码,及所有 RODATA */
section 定义部分修改:
.text :
{
. = ALIGN(4);
*(.text)
*(.text.*)
/* 把 rodata 从此处移除
*(.rodata)
*(.rodata*)
*/
*(.gnu.linkonce.t.*)
. = ALIGN(4);
} >FLASH AT>FLASH
.myrodata :
{
. = ALIGN(4); /*4字节对齐*/
. = ORIGIN(MYFLASH); /*ORIGIN(FLASH)为 MEMORY定义的FLASH的起始地址*/
KEEP(*(SORT_NONE(.myrodata))) /*链接时*KEEP()可以使得被标记段的内容不被清除*/
*(.rodata) /* 把 rodata 移到此处 */
*(.rodata*) /* 把 rodata 移到此处 */
. = ALIGN(4);
} >MYFLASH AT>MYFLASH
经过以上修改,再编译后,查看hex文件,会发现,所有 rodata 部分的内容,都转移到了 myrodata里了,如下所示,生成的 hex 文件:
:020000022000DC
:10000000EF020E9F3D45EF00EEC909ED91653D45BC
:10001000938585A9EF002ECA370502001305050652
:10002000EF10FEB53945EF00EEC701ED39459305F8
第一行 :020000022000DC 就是把地址移动到了 0200 0000处,后边就是一些字符串。
那么代码如何定位到此处区域呢?还是参考官方以及前辈大神的例子:
// 高层逻辑处理入口
__attribute__((section(".myrodata"))) void doLogic(void) {
while (1){
test();
}
}
就这样,这个函数有了 前缀:__attribute__((section(".myrodata"))) 后,链接时就存储在 0x0200 0000区域内了。
那么我们如果想把所有高层代码都定义在此区域内,就需要在所有想要定位的函数前边,加上这个前缀。
至于ymodem协议的ipa 底层功能,在此就不再赘述,请参考相关大神的例子。
综上所述,这个简单粗暴的 ipa功能就实现了,经作者测试,可以实现在安卓手机上,使用蓝牙接口,通过专门的app,升级所需要改动的高层逻辑代码,当然也可以实现网络远程 iap。
作者写作不易,转载请注明出处。