嵌入式 IAP 升级功能(#06)差分还原 hpatchlite 移植
最近发现了一个优秀的差分还原算法:hdiff & hpatch,它通过数据流的思想把 O(n) 的空间复杂度转嫁给了硬盘,使得内存的开销极低,非常适合应用于嵌入式领域。
最近发现了一个优秀的差分还原算法:hdiff & hpatch,它通过数据流的思想把 O(n) 的空间复杂度转嫁给了硬盘,使得内存的开销极低,非常适合应用于嵌入式领域。
全量升级由于要传输新版程序的完整镜像,因此升级时间通常较长,升级失败的概率也更大。那么能不能只传送差异数据呢?答案是可以。这种技术被称作增量升级/差量升级/差分升级。
常见的方案有:
不过 bsdiff + quicklz 方案的内存开销太大,因此不建议使用。
增量升级确实降低了传输过程中的数据量,但也带来了版本管理复杂的问题,所以说不能因为有了增量升级,全量升级就不用了。
以往我们做全量升级的时候没有引入压缩技术,在移植 hdiff/hpatchlite 的时候我发现,hdiff 生成的差异文件不比原文件小多少,但是其可压缩性非常高,这样就得把解压算法也移植进来。既然解压算法都已经有了,不把增量升级也压缩一下,那岂不是很浪费?
全量升级 | 未经压缩的新版程序 | (✘) |
经过压缩的新版程序 | (✔) | |
增量升级 | 未经压缩的差异文件 | (✘) |
经过压缩的差异文件 | (✔) |
分散加载、中断向量表重定向
➀ 修改 main.sct 分散加载文件。
➁ 修改 ConfigMCU 中大小程序的起始地址及空间大小。
➂ 修改 iap: system_mcumodel.c 中 VECT_TAB_OFFSET 的值(等于小程序的起始地址)。
➃ 修改 app: system_mcumodel.c 中 VECT_TAB_OFFSET 的值(等于大程序的起始地址)。
- module_select_pattern |
flowchart TB %%{init: { "flowchart": { "curve": "basis" } } }%% A1(引导程序之流程)-->B1(......)-->C1(跳转至应用程序) A2(应用程序之流程)-->B2(......)-->C2(跳转至引导程序)
flowchart LR %%{init: { "flowchart": { "curve": "basis" } } }%% A(在引导程序中集成通信协议栈与解压还原算法)~~~B(在应用程序中集成通信协议栈与解压还原算法)
flowchart LR %%{init: { "flowchart": { "curve": "basis" } } }%% A(先取下芯片)--->B(再烧录程序)--->C(后装回板卡)
flowchart LR %%{init: { "flowchart": { "curve": "basis" } } }%% A("在电路编程<br>(ICP)")--->B("在系统编程<br>(ISP)")--->C("在应用编程<br>(IAP)")
最近在使用电压比较器时发现硬件滤波电路会出现失效的情况,经分析是其采样频率过高所致。
参考手册中绘制的是理想条件下的波形,真实情况并非如此,INP 在逼近 INM 时会伴随着噪声/抖动。我们可以使用硬件滤波电路来消除这种抖动,图中绿色线段表示各采样点,其频率即为采样频率。
采样频率较低时,滤波电路可以正常工作,但是随着采样频率的升高,其可靠性反而会降低。
通过调试发现每次运行至 M4_SYSREG->PWR_PWRC2
赋值时程序就会跑飞😶
en_result_t PWC_HS2LS(void) |
瞅了一眼《参考手册 Rev1.2.1》好像也没啥问题,又看了《参考手册 Rev1.3》后,我得发…🙄!
两版手册竟然不一样!