单片机卡死的几大原因、分析、解决

阅读引言: 本文我想给大家分享一下我在学习过程中遇到的以及了解到的一些导致单片机运行卡死(死锁)的一些常见原因和解决办法, 请注意, 只是列举,并不是全部, 因为导致单片机运行卡死的原因无穷无尽。

目录

一、裸机层面

1.死循环, 条件一直成立

2.中断问题

3.外设的初始化问题

4.堆栈溢出

4.1递归导致栈溢出

4.2访问非法的内存地址

4.3内存泄漏

5.时钟的配置问题

6.程序逻辑问题

二、RTOS层面

三、常见的调试办法

1.printf函数打印

2.使用keil的调试功能

四、学习资料


一、裸机层面


1.死循环, 条件一直成立

/* 伪代码 */
while(一直为真) 
{}

比如按键的检测等待按键释放的操作

2.中断问题

/* 在执行某一个中断服务函数的时候, 没有清除中断标志位 */
void EXTI_IRQHandler(void)
{//没清除中断标志位, 导致cpu一直进入中断, 主逻辑没有执行, 导致程序出现卡死的现象
}

在标准库中, 执行完中断服务函数之后, 需要手动清除中断标志位, 不然会一直进入中断, hal库的大部分的中断服务函数执行完之后, 会自动的清除中断标志位。

3.外设的初始化问题

void main()
{//initialize code//某一个外设初始化失败, 导致程序卡在错误处理的那个函数
}

就会导致单片机看起来卡死了一样。

另一个列子: 

4.堆栈溢出

4.1递归导致栈溢出
void recursion()
{recursion();
}void main()
{recursion();
}

递归函数没有结束条件, 导致栈空间空间溢出。

4.2访问非法的内存地址
int main()
{int arr[10] = {0};arr[10] = 100;        /* 写非法的内存空间 */
}
4.3内存泄漏
void Getmemery()
{char *p = (char *)malloc(10);
}void main()
{for(;;)Getmemery();
}

这里我使用for循环来申请空间, 来模拟我们到处申请堆空间而没有释放导致的内存泄漏, 最后导致程序崩溃。

5.时钟的配置问题

void main()
{//外设的时钟配置不对, 导致程序卡死//无法执行到这里while(1) {//code    }}

6.程序逻辑问题

假设你设计的程序需要等待每一个外设接收到数据, 或者发送数据才往下执行, 这个时候就需要你自己找到你自己的代码的每一句是在干嘛。

二、RTOS层面


当你的单片机上了实时操作相同, 或者mpu装linux操作系统, 面临死锁的常见原因如下:

在单片机系统中,死锁是指多个任务或线程由于彼此之间的资源竞争而陷入永久阻塞的状态。死锁可能发生在多任务或多线程系统中,其中每个任务或线程都在等待其他任务或线程释放它们占用的资源。 导致单片机死锁的情况通常与资源竞争和资源分配有关。以下是一些可能导致死锁的情况:

1. 互斥资源:多个任务或线程同时竞争同一个互斥资源,例如共享内存区域或硬件寄存器。如果没有适当地管理和同步资源的访问,就可能导致死锁。

2. 循环等待:多个任务或线程形成了一个循环等待资源的环路。每个任务都在等待下一个任务释放资源,但所有任务都被其他任务所占用,导致死锁。

3. 延迟分配:某个任务占用资源后,未能及时释放资源。其他任务需要该资源来继续运行,但由于该资源一直被占用,导致死锁。

为了避免单片机死锁的发生,可以采取以下策略:

1. 使用合适的同步机制:使用互斥锁、信号量或其他适当的同步机制来管理共享资源的访问,确保资源在同一时间只能被一个任务或线程使用。

2. 避免循环等待:设计任务或线程的执行顺序,避免出现循环等待资源的情况。

3. 及时释放资源:确保任务或线程在使用完资源后,及时释放资源,以便其他任务或线程可以继续执行。

4. 调整系统资源分配:合理规划系统资源的分配和调度,避免资源的过度分配或容量不足。 5. 使用死锁检测与恢复机制:实施死锁检测算法,当检测到死锁的发生,通过中断或其他手段恢复系统正常运行。

  • mutex

什么是死锁:线程1和线程2 都获得了自己的锁, 线程1的锁为锁1, 线程2的锁为锁2, 这是如果线程1或者线程2 想去获得对方的锁或资源就无法获得, 造成死锁.导致二者都拿不到锁, 导致任务阻塞。

任务或者线程在访问完临界资源后记得释放锁。

三、常见的调试办法


1.printf函数打印

将单片机的uart配置好之后, 重写fputc函数, 勾选上微小C库, 随时随地的打印。

printf函数的用途: 

查看函数有没有运行到, 定位出问题的地方

查看变量的值

打印调试的信息

生成单片机运行的日志信息

2.使用keil的调试功能

不太好用, 除非是真的真的特变需要知道每一个寄存器, 或者内存的值才使用这个模式, 个人觉得用这个调试程序怪怪的, 可能是不太熟练吧。

四、学习资料


链接
提取码:1234 

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

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

相关文章

Qt-QPainter drawText方法不同重载之间的区别

QPainter类的drawText方法有如下重载: void drawText(const QPointF &position, const QString &text) void drawText(const QPoint &position, const QString &text) void drawText(int x, int y, const QString &text) void drawText(co…

APP在应用商店该如何做好节日营销

38妇女节刚刚过去,不少商家吃上了一波节日红利。 你有没有注意到很多App在应用商店里改头换面,开展了很多以“三八节”为主题的营销活动,并且取得了不错的成绩。 可见季节性营销策划对产品的下载量和用户留存率还是很重要的。 那么我们如何…

16.【CPP】详解继承

继承方式 如图 注意点 1.基类private成员在派生类中无论以什么方式继承都是不可见的。这里的不可见是指基类的私有成员还是被继承到了派生类对象中,但是语法上限制派生类对象不管在类里面还是类外面都不能去访问它 2.基类private成员在派生类中是不能被访问&#x…

电力物联网采集终端

电力物联网采集终端,通过采集设备数据,并将其传输到云端,实现精细管理和优化。 一、工作原理 电力物联网采集终端主要数据采集模块、通信模块等组成。采集设备的各项数据,如温度、湿度、电流等;数据采集模块将采集到的数据进行处理并存储;通…

索尼ILME-FX3摄像机RSV文件无法播放的修复方法

索尼摄像机rsv文件修复案例处理了很多,rsv是索尼mp4或者mxf文件封装失败时生成的临时文件,一般是由于断电或者摄像机意外重启导致的,下边来看下遇到rsv文件无法播放时的修复方法。 故障文件: 29.56G/rsv文件 故障现象: 摄像机型号为索尼IL…

【大模型API调用初尝试一】智谱AI 通义千问

大模型API调用初尝试一 调用大模型API能干什么智谱AI大模型API调用的过程获取API_KEYGLM_4同步调用GLM_4异步调用文生图大模型API调用 阿里云通义千问API调用过程单轮会话多轮会话 调用大模型API能干什么 大模型的参数非常庞大,功能非常强大,但是训练成…

node:internal/crypto/hash:69 this[kHandle] = new _Hash(algorithm, xofLen);

npm 打包报错 原因就是npm版本太高了,用的18版本,切换成16版本就好了。

UI 学习 二 可访问性 模式

教程:Accessibility – Material Design 3 一 颜色对比 颜色和对比度可以用来帮助用户看到和理解应用程序的内容,与正确的元素交互,并理解操作。 颜色可以帮助传达情绪、语气和关键信息。可以选择主色、辅助色和强调色来支持可用性。元素之…

H5 流光分割个人主页源码

源码名称:流光分割个人主页源码 源码介绍:一款流光分割特效个人主页源码,源码带大量跳转个人联系方式按钮和朋友按钮。同时带有个人介绍。 需求环境:H5 下载地址: https://www.changyouzuhao.cn/10241.html

电机参数辨识算法(2)——基于高频注入的磁链辨识策略

电机参数辨识算法(1)——基于高频注入的电感辨识策略-CSDN博客https://blog.csdn.net/m0_46903653/article/details/136722750?spm1001.2014.3001.5501上一期已经讲过了电感辨识方法。 今天这是参数辨识的第二期,今天来简单看看磁链的辨识。…

【数学建模】熵权法

之前我们学了层次分析法和topsis法,但是主观性十分强,有没有科学的方法得出权重呢?今天,我们来学习熵权法! 基本概念: 熵权法,物理学名词,按照信息论基本原理的解释,信息…

SpringBoot+vue3打造企业级一体化SaaS系统

SpringBootvue3打造企业级一体化SaaS系统 简介:    全面提升前后端技术水平,独立完成全栈项目开发能力,快速进击全栈工程师,最终在面试中脱颖而出。整合后端主流技术(Spring Boot、物理数据库隔离、加载动态权限、多…

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:Flex)

以弹性方式布局子组件的容器组件。 说明: 该组件从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。Flex组件在渲染时存在二次布局过程,因此在对性能有严格要求的场景下建议使用Column、Row代替。Flex组…

Vue3基础笔记(1)模版语法 属性绑定 渲染

Vue全称Vue.js是一种渐进式的JavaScript框架,采用自底向上增量开发的设计,核心库只关注视图层。性能丰富,完全有能力驱动采用单文件组件和Vue生态系统支持的库开发的复杂单页应用,适用于场景丰富的web前端框架。灵活性和可逐步集成…

149.乐理基础-七和弦的第一转位、第二转位、第三转位

内容参考于:三分钟音乐社 上一个内容:148.常用的7个七和弦结构与简称 上一个内容里练习的答案: 前置内容:必须看过 140.音程的转位 和 146.三和弦的第一转位、第二转位这两个 现在还是狭义上、理论上的转位,下面用C…

高校实验室科研仪器开放共享存在的问题及对策建议

随着科技的迅速发展和高校科研水平的提高,高校实验室科研仪器的开放共享已经成为推动科研进步和创新发展的重要手段。然而,在实际操作中,我们也面临着诸多问题和挑战。本文将分析高校实验室科研仪器开放共享存在的问题,并提出相应…

杂七杂八111

MQ 用处 一、异步。可提高性能和吞吐量 二、解耦 三、削峰 四、可靠。常用消息队列可以保证消息不丢失、不重复消费、消息顺序、消息幂等 选型 一Kafak:吞吐量最大,性能最好,集群高可用。缺点:会丢数据,功能较单一。 二Ra…

javaEE7

1. <% page pageEncoding"UTF-8"%><% page import"java.io.*"%> <% page import"java.util.*"%> <% page import"java.math.*"%> <html> <head><title>网站计数器</title></head&…

【软件测试基础篇】第二节.黑盒测试中常见方法

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言⼀、等价类法&#xff08;解决穷举问题&#xff09;二、边界值法&#xff08;解决边界限制问题&#xff09;三、正交表法&#xff08;解决多条件依赖问题&#…

媒体发稿:澳门媒体发稿7个流程

推广平台澳门是一个重要的度假旅游娱乐终点&#xff0c;都是媒体领域热议的话题。对于澳门的媒体发稿营销推广要求&#xff0c;大家提供了一个简单易用的套餐系统软件&#xff0c;帮助大家在澳门媒体上发表推广文章。下面我们就根据7个阶段&#xff0c;详解构建这一套餐推广平台…