Update README.md
This commit is contained in:
@@ -169,121 +169,6 @@ uint32_t SecureService_Call(uint32_t service_id, uint32_t param1, uint32_t param
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### 🔹 OTA(Over-the-Air)升级机制
|
|
||||||
|
|
||||||
> 支持远程更新嵌入式系统的固件版本
|
|
||||||
1. 双分区升级架构
|
|
||||||
|
|
||||||
```plaintext
|
|
||||||
Flash布局:
|
|
||||||
+-------------------+ 0x08000000
|
|
||||||
| Bootloader |
|
|
||||||
+-------------------+ 0x08010000
|
|
||||||
| Application Slot A|
|
|
||||||
+-------------------+ 0x08040000
|
|
||||||
| Application Slot B|
|
|
||||||
+-------------------+ 0x08070000
|
|
||||||
| Configuration Area|
|
|
||||||
+-------------------+
|
|
||||||
```
|
|
||||||
|
|
||||||
2. 升级状态机实现
|
|
||||||
|
|
||||||
```c
|
|
||||||
typedef enum {
|
|
||||||
OTA_IDLE, // 空闲状态
|
|
||||||
OTA_CHECKING, // 检查更新
|
|
||||||
OTA_DOWNLOADING, // 下载中
|
|
||||||
OTA_VERIFYING, // 校验中
|
|
||||||
OTA_READY, // 准备重启
|
|
||||||
OTA_UPGRADING, // 升级中
|
|
||||||
OTA_FAILED // 升级失败
|
|
||||||
} OTA_State_t;
|
|
||||||
|
|
||||||
// OTA状态机处理函数
|
|
||||||
void OTA_Process(void) {
|
|
||||||
switch (ota_state) {
|
|
||||||
case OTA_IDLE:
|
|
||||||
if (check_update_flag) {
|
|
||||||
ota_state = OTA_CHECKING;
|
|
||||||
vCheckForUpdate();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case OTA_DOWNLOADING:
|
|
||||||
if (download_complete) {
|
|
||||||
ota_state = OTA_VERIFYING;
|
|
||||||
vVerifyFirmware();
|
|
||||||
} else if (download_error) {
|
|
||||||
ota_state = OTA_FAILED;
|
|
||||||
vHandleError(DOWNLOAD_ERROR);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
// 其他状态处理...
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
3. 失败回滚机制
|
|
||||||
|
|
||||||
```c
|
|
||||||
// 启动时验证应用完整性
|
|
||||||
bool ValidateApplication(uint32_t start_address) {
|
|
||||||
// 检查向量表签名
|
|
||||||
uint32_t *vector_table = (uint32_t *)start_address;
|
|
||||||
if (vector_table[0] == 0xFFFFFFFF) { // 检查栈顶指针是否有效
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 计算应用哈希并验证
|
|
||||||
uint8_t calculated_hash[32];
|
|
||||||
SHA256((uint8_t *)start_address, APPLICATION_SIZE, calculated_hash);
|
|
||||||
|
|
||||||
// 从配置区获取预期哈希
|
|
||||||
uint8_t *expected_hash = GetExpectedHash();
|
|
||||||
return (memcmp(calculated_hash, expected_hash, 32) == 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 主程序
|
|
||||||
int main(void) {
|
|
||||||
// 初始化硬件
|
|
||||||
HAL_Init();
|
|
||||||
SystemClock_Config();
|
|
||||||
|
|
||||||
// 检查主应用是否有效
|
|
||||||
if (ValidateApplication(APPLICATION_SLOT_A_ADDRESS)) {
|
|
||||||
// 跳转到主应用
|
|
||||||
JumpToApplication(APPLICATION_SLOT_A_ADDRESS);
|
|
||||||
} else if (ValidateApplication(APPLICATION_SLOT_B_ADDRESS)) {
|
|
||||||
// 主应用无效,尝试从备份应用启动
|
|
||||||
JumpToApplication(APPLICATION_SLOT_B_ADDRESS);
|
|
||||||
} else {
|
|
||||||
// 两个应用都无效,进入恢复模式
|
|
||||||
EnterRecoveryMode();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
#### ✅ OTA 流程核心步骤
|
|
||||||
|
|
||||||
1. 检查版本更新(HTTP/MQTT 下载 manifest)
|
|
||||||
2. 下载固件(二进制)
|
|
||||||
3. 存储到备份区(Backup Slot)
|
|
||||||
4. 校验 CRC/Hash / 签名
|
|
||||||
5. 设置 Bootloader 标志位并重启
|
|
||||||
6. Bootloader 引导进入新固件
|
|
||||||
7. 若失败则回滚(Fail-safe 机制)
|
|
||||||
|
|
||||||
#### ✅ 常用升级协议
|
|
||||||
|
|
||||||
- HTTP / HTTPS
|
|
||||||
- MQTT + Base64 二进制块传输
|
|
||||||
- CoAP(轻量级)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 🔹 Bootloader 开发建议
|
### 🔹 Bootloader 开发建议
|
||||||
|
|
||||||
- 通用功能:下载、校验、重启、回滚
|
- 通用功能:下载、校验、重启、回滚
|
||||||
|
|||||||
Reference in New Issue
Block a user