嵌入式开发常见的问题解决方法总结

news2025/1/11 8:01:09

本文引自

https://mp.weixin.qq.com/s/IBDnlzl_nFykemPxp7rt5w

一、问题复现

稳定复现问题才能正确的对问题进行定位、解决以及验证。一般来说,越容易复现的问题越容易解决。

(1) 模拟复现条件

有的问题存在于特定的条件下,只需要模拟出现问题的条件即可复现。对于依赖外部输入的条件,如果条件比较复杂难以模拟可以考虑程序里预设直接进入对应状态。

(2)提高相关任务执行频率

例如某个任务长时间运行才出现异常则可以提高该任务的执行频率。

(3) 增大测试样本量

程序长时间运行后出现异常,问题难以复现,可以搭建测试环境多套设备同时进行测试。

二、问题定位

缩小排查范围,确认引入问题的任务、函数、语句。

(1)打印LOG

根据问题的现象,在抱有疑问的代码处增加LOG输出,以此来追踪程序执行流程以及关键变量的值,观察是否与预期相符。

(2)在线调试

在线调试可以起到和打印LOG类似的作用,另外此方法特别适合排查程序崩溃类的BUG,当程序陷入异常中断(HardFault,看门狗中断等)的时候可以直接STOP查看call stack以及内核寄存器的值,快速定位问题点。

(3)版本回退

使用版本管理工具时可以通过不断回退版本并测试验证来定位首次引入该问题的版本,之后可以围绕该版本增改的代码进行排查。

(4)二分注释

二分注释即以类似二分查找法的方式注释掉部分代码,以此判断问题是否由注释掉的这部分代码引起。

具体方法为将与问题不相干的部分代码注释掉一半,看问题是否解决,未解决则注释另一半,如果解决则继续将注释范围缩小一半,以此类推逐渐缩小问题的范围。

(5)保存内核寄存器快照

Cortex M内核陷入异常中断时会将几个内核寄存器的值压入栈中,如下图:
在这里插入图片描述
我们可以在陷入异常中断时将栈上的内核寄存器值写入RAM的一段复位后保留默认值的区域内,执行复位操作后再从RAM将该信息读出并分析,通过PC、LR确认当时执行的函数,通过R0-R3分析当时处理的变量是否异常,通过SP分析是否可能出现栈溢出等。

三、问题分析处理

1.程序继续运行

1.数值异常
(1)软件问题

1、数组越界
写数组时下标超出数组长度,导致对应地址内容被修改。
在这里插入图片描述
此类问题通常需要结合map文件进行分析,通过map文件观察被篡改变量地址附近的数组,查看对该数组的写入操作是否存在如上图所示不安全的代码,将其修改为安全的代码。

2、栈溢出
在这里插入图片描述
如上图,此类问题也需要结合map文件进行分析。假设栈从高地址往低地址增长,如果发生栈溢出,则g_val的值会被栈上的值覆盖。

出现栈溢出时要分析栈的最大使用情况,函数调用层数过多,中断服务函数内进行函数调用,函数内部申明了较大的临时变量等都有可能导致栈溢出。

解决此类问题有以下方法:
(1)在设计阶段应该合理分配内存资源,为栈设置合适的大小;
(2)将函数内较大的临时变量加”static”关键字转化为静态变量,或者使用malloc()动态分配,将其放到堆上;
(3)改变函数调用方式,降低调用层数。

3、判断语句条件写错
判断语句的条件容易把相等运算符“==”写成赋值运算符“=”导致被判断的变量值被更改,该类错误编译期不会报错且总是返回真。
在这里插入图片描述

建议将要判断的变量写到运算符的右边,这样错写为赋值运算符时会在编译期报错。还可以使用一些静态代码检查工具来发现此类问题。

4、同步问题
例如操作队列时,出队操作执行的过程中发生中断(任务切换),并且在中断(切换后的任务)中执行入队操作则可能破坏队列结构,对于这类情况应该操作时关中断(使用互斥锁同步)。

5、优化问题
在这里插入图片描述
如上图程序,本意是等待irq中断之后不再执行foo()函数,但被编译器优化之后,实际运行过程中flg可能被装入寄存器并且每次都判断寄存器内的值而不重新从ram里读取flg的值,导致即使irq中断发生foo()也一直运行,此处需要在flg的申明前加“volatile”关键字,强制每次都从ram里获取flg的值。

(2)硬件问题

1、芯片BUG
芯片本身存在BUG,在某些特定情况下给单片机返回一个错误的值,需要程序对读回的值进行判断,过滤异常值。

2、通信时序错误
在这里插入图片描述
例如电源管理芯片Isl78600,假设现在两片级联,当同时读取两片的电压采样数据时,高端芯片会以固定周期通过菊花链将数据传送到低端芯片,而低端芯片上只有一个缓存区.

如果单片机不在规定时间内将低端芯片上的数据读走那么新的数据到来时将会覆盖当前数据,导致数据丢失。此类问题需要仔细分析芯片的数据手册,严格满足芯片通信的时序要求。

2. 动作异常
(1)软件问题

1、设计问题

设计中存在错误或者疏漏,需要重新评审设计文档。

2、实现与设计不符

代码的实现与设计文档不相符需要增加单元测试覆盖所有条件分支,进行代码交叉review。

3、状态变量异常

例如记录状态机当前状态的变量被篡改,分析该类问题的方法同前文数值异常部分。

(2)硬件问题

1、硬件失效
目标IC失效,接收控制指令后不动作,需要排查硬件。

2、通信异常
与目标IC通信错误,无法正确执行控制命令,需要使用示波器或逻辑分析仪去观察通信时序,分析是否发出的信号不对或者受到外部干扰。

2.程序崩溃

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1100131.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

外卖大数据案例

一、环境要求 HadoopHiveSparkHBase 开发环境。 二、数据描述 meituan_waimai_meishi.csv 是某外卖平台的部分外卖 SPU(Standard Product Unit , 标准产品单元)数据,包含了外卖平台某地区一时间的外卖信息。具体字段说明如下&am…

文件内容相关

1.查看文件 cat /etc/passwd 2.编辑文件 echo "i like dog" > qun.txt 标准输出重定向 echo "i like best cat" >> qun.txt 标准输出追加重定向 cat >> qun.txt cat >>qun.txt<< ene vim编辑 进入编辑模式 i 光标所在…

在unity中给游戏物体一个标记

标记 方便识别&#xff01; 标签&#xff08;Tag&#xff09; 引擎内部会对物体的标签建立了索引。通过标签查找物体&#xff0c;要比通过名字查找物体快得多。标签最多只能有 32个。前几个是常用标签&#xff0c;具有特定含义&#xff0c;例如玩家( Player)、主摄摄像机 (Mai…

【RTOS学习】优先级 | Tick | 任务状态 | 空闲任务 | 任务调度

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《RTOS学习》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 优先级 | Tick | 任务状态 | 空闲任务 | 任务调度 &#x1f3c0;优先级⚽任务管理 &#x1f3c0;T…

PostMan使用csv/json进行数据参数化

创建csv文件 或者创建json文件 [{"name": "zhangsan","age": 18},{"name": "lisi","age": 20} ] 运行集合脚本的时候选择data文件 在请求接口中输入全局变量 {{user}}的方式进行传递 在Tests中要使用断言&…

C# Winform编程(4)多文档窗口(MDI)

多文档窗口&#xff08;MDI&#xff09; 添加菜单&#xff0c;IsMdiContainer设为True: From窗口添加菜单 Form1.cs using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using S…

华为鸿蒙系统安装第三方软件 - 注意事项

华为鸿蒙系统安装第三方软件 - 注意事项 前言关闭增强防护关闭应用检测发现恶意软件解除软件管控 前言 华为鸿蒙系统默认开启纯净模式&#xff0c;仅支持安装经过华为应用市场检测的应用&#xff0c;并禁止运行病毒和风险应用。但此功能是可以关闭的&#xff0c;下文介绍如何安…

Qtday01(qt简介、简单窗口组件)

今日任务 仿qq登录界面&#xff0c;QT实现 代码&#xff1a; 头文件&#xff1a; #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <QLineEdit> #include <QLabel> #include <QPushButton> #include <QtDebug> #…

session认证

目录 前言 http协议的无状态性 session的工作原理 在express中使用session认证 在session中存数据 在session中取数据 清空session 结尾 前言 session是一种记录客户状态的机制&#xff0c;客户端浏览器法访问服务器的时候&#xff0c;服务器把客户端信息以某种形式记录…

基于闪电连接过程优化的BP神经网络(分类应用) - 附代码

基于闪电连接过程优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于闪电连接过程优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.闪电连接过程优化BP神经网络3.1 BP神经网络参数设置3.2 闪电连接过程算…

互联网Java工程师面试题·Java 总结篇·第四弹

目录 31、String s new String(“xyz”);创建了几个字符串对象&#xff1f; 32、接口是否可继承&#xff08;extends&#xff09;接口&#xff1f;抽象类是否可实现&#xff08;implements&#xff09;接口&#xff1f;抽象类是否可继承具体类&#xff08;concrete class&am…

【Qt控件之QToolButton】概述及示例

简介 QToolButton 类提供了一个快速访问命令或选项的按钮&#xff0c;通常在 QToolBar 内部使用。 工具按钮是一种特殊的按钮&#xff0c;用于快速访问特定的命令或选项。与普通的命令按钮相反&#xff0c;工具按钮通常不显示文本标签&#xff0c;而是显示一个图标。 通常情…

文件夹加密后,忘记文件夹密码怎么办?

文件夹加密是保护文件夹数据安全的重要手段&#xff0c;没有正确的密码将无法访问文件夹。那么&#xff0c;如果我们忘记了文件夹密码该怎么办呢&#xff1f;下面我们就一起来了解一下。 忘记文件夹密码怎么办&#xff1f; 以夏冰加密软件的产品为例&#xff0c;能够为文件夹设…

Groovy语法Gradle配置学习笔记

第一部分&#xff1a;Groovy语法 变量的类型和定义 Groovy所有类型都是对象类型&#xff1a; int x 10 println x.class double y 3.14 println y.classdef 定义变量&#xff1a; def str "dddd" println str.class字符串 字符串&#xff1a; // 单引号 双引号…

【环境配置】Windows10上的OpenFace安装与使用

&#xff08;小乱&#xff0c;待整理&#xff0c;先将就用&#xff09; github下载&#xff0c;安装必要的依赖&#xff0c;参考自&#xff1a; 缺东西的到这里看&#xff0c;缺啥安装啥 pip install opencv-pythonpip install CMakepip install Boostpip install dlib这些我…

去中心遇见混币器

区块链的去中心化交易所在保护隐私和安全性上有着无可比拟的优势&#xff0c;用户甚至不需要提供注册资料&#xff0c;只要有web3钱包即可跟智能合约交易。在uniswap上可兑换绝大多数加密币&#xff0c;新推出的衍生品交易所ununx已经可以交易美股&#xff0c;期货和外汇,一个全…

Babel 在Powershell 上无法查看版本

ES6 模块语法不能应用在ES5环境中 (ES6模块化语法不能在node.js中执行)&#xff0c;此时需要Babel进行转码 通过npm install -g babel-cli 安装好后&#xff0c;想通过 babel --version产看版本。但是无法查看 首先&#xff0c;我们要以管理员方式运行PowerShell&#xff0c;&…

网工记背配置基础命令总结(4)---DHCP配置

目录 1.DHCP相关配置 2.基于不同网段内DHCP服务器和DHCP中继 3.VRRP组网下同网段内配置基于全局地址池的DHCP服务器 4.配置DHCP客户端 5.DHCP snooping(网关防假冒)配置 6.IPSG(IPMAC绑定)配置 1.配置IPSG防止主机私自更改IP地址&#xff08;静态绑定&#xff09; 2.配…

Springboot整合WebSocket实现浏览器和服务器交互

Websocket定义 代码实现 引入maven依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency>配置类 import org.springframework.context.annotation.Bean;i…

Supervisor监控Go程序

目的&#xff1a; 线上服务有时候会由于一些bug导致painc&#xff0c;程序终止&#xff0c;这个时候需要自动重启项目&#xff0c;让项目能继续提供服务。 容器启动Golang项目 vscode安装golang插件,让vscode可以运行go代码 提示没有go环境&#xff0c;服务器本地确实是没有…