全量升级由于要传输新版程序的完整镜像,因此升级时间通常较长,升级失败的概率也更大。那么能不能只传送差异数据呢?答案是可以。这种技术被称作增量升级/差量升级/差分升级。

常见的方案有:

  • bsdiff/bspatch + quicklz
  • hdifflite/hpatchlite + tinyuz

不过 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
- *
- *.o
- .ANY

- module_select_pattern (input_section_selector)
- module_select_pattern (input_section_selector, input_section_selector, ...)
- +input_section_attr
- * (+RO-CODE)
- * (+RO-DATA)
- * (+RO)
- * (+RW-DATA)
- * (+RW-CODE)
- * (+RW)
- * (+XO)
- * (+ZI)
- * (+ENTRY)
-
- * (+CODE)
- * (+CONST)
- * (+TEXT)
- * (+DATA)
- * (+BSS)
-
- * (+FIRST)
- * (+LAST)
- input_section_pattern
- * (*app_info)
- input_symbol_pattern
- section_properties

传统编程方式
flowchart LR
%%{init: { "flowchart": { "curve": "basis" } } }%%
A(先取下芯片)--->B(再烧录程序)--->C(后装回板卡)
现代编程方式
flowchart LR
%%{init: { "flowchart": { "curve": "basis" } } }%%
A("在电路编程<br>(ICP)")--->B("在系统编程<br>(ISP)")--->C("在应用编程<br>(IAP)")
« 閱讀全文 »


嵌入式 IAP 升级功能(#01)基础概念
嵌入式 IAP 升级功能(#02)升级方案
嵌入式 IAP 升级功能(#03)流程设计
嵌入式 IAP 升级功能(#04)技术细节
嵌入式 IAP 升级功能(#05)增量升级
嵌入式 IAP 升级功能(#06)差分还原 hpatchlite 移植
嵌入式 IAP 升级功能(#07)压缩解压 tinyuztool 移植
嵌入式 IAP 升级功能(#08)引导程序 bootloader 升级


« 閱讀全文 »

最近在使用电压比较器时发现硬件滤波电路会出现失效的情况,经分析是其采样频率过高所致。

参考手册中绘制的是理想条件下的波形,真实情况并非如此,INP 在逼近 INM 时会伴随着噪声/抖动。我们可以使用硬件滤波电路来消除这种抖动,图中绿色线段表示各采样点,其频率即为采样频率。

采样频率较低时,滤波电路可以正常工作,但是随着采样频率的升高,其可靠性反而会降低。

« 閱讀全文 »

现象描述

  • 从高速/超高速模式向超低速模式切换时 mcu 异常死机

基础信息

  • 当前使用华大 2.2.0 版驱动程序
  • 当前使用华大 1.2.1 版参考手册

原因分析

通过调试发现每次运行至 M4_SYSREG->PWR_PWRC2 赋值时程序就会跑飞😶

电源模式控制寄存器 2

hc32f460_pwc.c
en_result_t PWC_HS2LS(void)
{
...

M4_SYSREG->PWR_PWRC2 = 0xE1U;
M4_SYSREG->PWR_MDSWCR = 0x10U;

...
}

en_result_t PWC_HP2LS(void)
{
...

M4_SYSREG->PWR_PWRC2 = 0xD1U;
M4_SYSREG->PWR_MDSWCR = 0x10U;

...
}

瞅了一眼《参考手册 Rev1.2.1》好像也没啥问题,又看了《参考手册 Rev1.3》后,我得发…🙄!

两版手册竟然不一样!

« 閱讀全文 »