当前位置: 首页 > news >正文

OTA升级时软件异常复位问题分析

背景:
最近半年陆陆续续压测OTA,OTA升级总有概率失败,一直未找到失败的根本原因。

实验:
最近的压测发现新板子升级没有问题,老板子压测会出现较多的失败。
失败时能看到34服务异常:
主节点:
10 10 0B 34 00 44 00 01
10 21 00 00 00 03 00 00
从节点:
10 03 7F 34 7F FF FF FF
分析:
擦除的时候出现异常,查询芯片手册发现芯片的最大次数为1000次,超过会有未预期的行为发生且擦除的时间为12ms-130ms,130ms的时间明显超过窗口狗的最大时间128ms。
APP的大小为192KB左右,擦除的最小单元为2K,擦除的时间远超过窗口狗的时间。因此原先的设计是把擦除的区域切片,擦除固定大小的区域后去喂狗。
但是随着擦除的次数增加,单位大小的区域擦除时间增加,极大概率导致喂狗超时。
优化:
采用flash driver支持的回调函数去实现喂狗。擦除的行为实际上是一个硬件行为,软件会一直等硬件的状态标志位,在软件等待的1oop中一直执行时钟寄存器的检查,通过寄存器的值去判断是否需要喂狗,喂狗后重置寄存器值。
后记:
调试过程中遇到的几个问题分享:
1.在寄存器未初始化的时候读取寄存器的值会导致软件复位
2.在Erase的过程中一般都禁止flash的读取操作:
Erase的操作后等待硬件状态字的那段代码中有除法(库函数,属于flash区)和函数(flash代码)都需要避免。如果是函数建议采用__ramfunc关键字去修饰。
补充说明:__ramfunc 关键字
该关键字是一个编译器指令,用于指示编译器将函数放置在RAM中,而不是闪存中。这对于需要快速执行的函数非常有用,因为RAM访问通常比闪存访问更快。对于需要在运行时修改的函数也非常有用,因为闪存通常是只读的。
但是,需要注意的是,将函数放置在RAM中会增加程序使用的RAM里。RAM是一种宝贵的资源,尤其是在嵌入式系统中,因此务必谨慎使用__ramfunc,并且仅用于RAM执行的益处大于增加RAM 使用成本的函数。外,使用__ramfunc时,您需要确保在执行函数之前将其从闪存复制到RAM。这通常在程序的初始化阶段完成。

http://www.hskmm.com/?act=detail&tid=16211

相关文章:

  • Atcoder Educational DP Contest 做题记录
  • 20250924
  • 跨端边云时序数据管理新范式:Apache IoTDB 的 DB+AI 融合之道 - 实践
  • 《Real-Time Rendering》第二章 图形渲染管线
  • 放弃Unity后,我为什么选择了Unigine?
  • PHP 与 Java 的终极对比:2025年,开发者该如何选择? - 详解
  • 题单63——流程控制
  • 银行同业存单的信用等级
  • 软件技术基础第一次作业
  • 2025XDOJ个人题解——写在前面
  • 适合电子纸屏幕的简易象棋打谱程序
  • 0924
  • java_string比较中的细节
  • 扫描线学习笔记
  • go-reids
  • AI完美声音克隆及情绪控制,与真人无异,Lark下载介绍
  • WSL,适用于 Linux 的 Windows 子系统
  • 9-24
  • 代码随想录算法训练营第八天 |344.反转字符串、541. 反转字符串II、LCR 122. 路径加密
  • 9/24
  • 安装与卸载JDK8
  • mysql慢sql配置
  • Linux zdb -C (zfs Debugger调试器)
  • 从零开始实现简易版Netty(八) MyNetty 实现Small规格的池化内存分配
  • 测试脚本
  • 自动化测试脚本
  • 解题报告-字符串(str.*)
  • Linux 系统中的 /dev/disk/by-id/目录作用详解
  • glTF/glb:您需要知道的一切,怎么免费获取下载
  • keepalived服务器