简单粗暴:搞定ch32v307的iap功能!

        看了官方的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。

作者写作不易,转载请注明出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值