对原子的IAP例程中四个栈顶地址检查说明

本文介绍了一种用于确保固件更新和执行安全性的检查方法。通过对比固件存储位置(FLASH或SRAM)的地址特征,进行三次检查,以验证固件的合法性。首次检查确保固件为FLASH固件并准备复制;二次检查确认FLASH固件的执行;最后,检查SRAM固件的执行,同时验证MSP地址的合法性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一个检查

if(((*(vu32*)(0X20001000+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.

更新固件时,检查固件为FLASH固件,后将固件从SRAM复制到FLASH

串口接收过来的数据,是从:0X20001000开始存储的。 第一个4个字节是MSP地址,第二个4个字节,才是复位中断向量的入口地址。 &0xFF000000就是取最高8位。因为FLASH的地址范围是0X0800 0000开始的。这可以一定程度上确保地址范围正常。

第二个检查

执行固件时,检查固件为FLASH固件,并执行

if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.

 

第三个检查

因为接收数据时放在SRAM里,所以不用复制过程,直接执行

执行固件时,检查固件为SRAM固件,并执行

if(((*(vu32*)(0X20001000+4))&0xFF000000)==0x20000000)//判断是否为0X20XXXXXX.

 

第三个检查

检查代码第一个地址,是否为合法的MSP

第二个地址为中断向量表地址

if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000)    //检查栈顶地址是否合法.

### 正点原子 IAP 示例代码解析 对于正点原子提供的IAP(In-Application Programming,在应用编程)例程,通常涉及如何实现在不借助外部烧录工具的情况下完成固件更新的功能。这类功能特别适用于已经部署在现场的应用场景中,允许设备通过网络或其他方式接收新的固件并自行刷新。 #### 跳转至应用程序部分的实现方法 当提到具体实现细节时,可以参考如下C语言编写的跳转逻辑: ```c typedef void (*iapfun)(void); // 定义函数指针用于指向用户程序入口 iapfun jump2app; // 实现跳转到应用程序段的核心过程 void iap_load_app(uint32_t appxaddr) { if (((*(volatile uint32_t *)appxaddr) & 0x2FFE0000) == 0x20000000) { // 验证地址合法性 jump2app = (iapfun)*((volatile uint32_t *)(appxaddr + 4)); // 获取复位向量表中的初始PC值作为程序起点 __set_MSP(*((volatile uint32_t *)appxaddr)); // 设置主堆指针(MSP),即加载新程序运行所需的初始环境 jump2app(); // 执行实际跳转操作 } } ``` 上述代码片段展示了从引导装载程序(BootLoader)切换到用户自定义应用程序的过程[^3]。这里的关键在于验证目标位置处是否存在有效的ARM Cortex-M系列微控制器所期望看到的有效帧结构,并据此决定是否继续执行后续动作。 #### 数据传输机制概述 考虑到在线编程的需求,往往还需要建立稳定可靠的数据通道来传递待写入的新版本二进制映像文件。这可以通过多种途径达成,比如利用串口通信、USB接口或是基于IP协议族下的TCP连接等方式来进行数据交换[^4]。其中每种方案都有各自的特点和适用范围,开发者可以根据实际情况选取最合适的手段实施远程升级流程。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值