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

这篇具有很好参考价值的文章主要介绍了单片机卡死的几大原因、分析、解决。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

板卡老化导致程序跑死,物联网,单片机,嵌入式硬件,物联网操作系统

目录

一、裸机层面

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 文章来源地址https://www.toymoban.com/news/detail-844038.html

到了这里,关于单片机卡死的几大原因、分析、解决的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言-单片机:STM32程序烧录的几种方法

    STM32微控制器提供了多种程序烧录(也称为编程或固件更新)方式,这些方法允许用户将编译后的程序代码(通常为HEX或BIN格式)下载到MCU的闪存中。以下是几种常见的STM32程序烧录方式: ST-LINK : ST-LINK/V2 : 这是最常用的官方开发工具之一,可以直接通过USB接口与PC连接。S

    2024年04月26日
    浏览(21)
  • GD32单片机和STM32单片机的对比分析

    GD32单片机和STM32单片机都是基于Arm Cortex-M3/M4内核的32位通用微控制器,广泛应用于各种嵌入式系统和物联网领域。两者之间有很多相似之处,但也有一些不同之处,本文将从以下几个方面对比分析两者的特点、优势和开发成本。 GD32单片机采用的是二代的M3/M4内核,而STM32单片

    2024年02月16日
    浏览(30)
  • 单片机复位电路分析

       来分析一下这个电路: 首先这里面有电容,所以是一个动态电路。哈哈哈 假设左上角的电压源是5V的代号为VOLT。 可以知道电容capacitor C1左边的电压也是+5V,电容中间隔着一个绝缘体,所以不导电, 这个时候电流无法通过C1,但是因为C1左边聚集了正电荷,所以因为静电作

    2024年02月14日
    浏览(23)
  • 没有禁用硬件图形加速的情况下解决visio卡死的问题

    这两天在使用visio的时候,总是会发生死机问题。出现问题的特点如下: 在使用鼠标滚轮进行缩放时,一定会发生卡死 打开任务管理器,发现CPU和内存占用率全满 电脑的其他界面无法操作,前台应用全部卡死 主要的解决办法是关闭visio的硬件图形加速功能,其位置在: vis

    2024年02月06日
    浏览(72)
  • 解决虚拟机VMware一段时间不动,就卡死的问题

    虚拟机总是一段时间不移动鼠标,就会无响应,每次都要重启两次才能继续维持一段时间,我一开始以为是内存和处理器或者硬盘太小的问题,但是我调大了之后还是一样,下面是我分配的虚拟机性能  针对虚拟机卡死,列出以下改善性能的方式,大家可以尝试一下: 因为虚

    2024年02月06日
    浏览(34)
  • 单片机程序死机问题分析

    关于硬件: 经验一:重视墨菲定理,不要忽略细节,保持敏感性! 经验二:异常死机,先查硬件。 经验三:电源!时钟!复位! (1)重视墨菲定理,不要忽略细节,保持敏感性! 产品研发中如果出现异常,请不要忽略掉。要相信墨菲定理。疫情期间由于封控,设计的产品在

    2024年02月06日
    浏览(18)
  • 【虚幻引擎UE】UE5 模型导入卡死的解决思路

    1.数据分类,命名规范 2.尽量不用布尔工具 3.布线拓扑检查,检查重复面破面 4.模型坐标偏移不可以太大(否则大概率出错) 5.材质共用,不用vray材质工具 6.检查平滑组 7.检查模型分组 8.切三角面(尽量不要出现四边形) 方法一:将max文件拆分为多个fbx文件分别导入,每次及

    2023年04月08日
    浏览(158)
  • 定量分析计算51单片机复位电路工作原理 怎么计算单片机复位电容和电阻大小

    下面画出等效电路图  可以知道单片机内必然有一个电阻RX,为了简化分析,我们假设他是线性电阻(不带电容,电感的支路) 还有一个基础知识: 电容器的充电放电曲线: 还需要知道电容电压的变化是连续的,(高数知识)无法跳变。 一个很大的误区就是认为电容一上电

    2024年02月12日
    浏览(26)
  • 【STM32】单片机启动文件分析 01

    启动文件由汇编语言写成,时单片机上电之后执行的第一个文件。 也就是从上电到mian函数中间的一段过程。 bootloader也可以叫 启动文件 ,每种MCU都有对应的启动文件。 但开发环境往往自动完整地提供了这个启动文件 ,不需要开发人员再行干预启动过程,只需要从main函数开

    2024年01月18日
    浏览(20)
  • 【【51单片机AD/DA的分析】】

    模数转换 与 数模转换 运算放大器 DA的转换就是利用运算放大器实现的 输出电压v0=-(D7~D0)/256 x (VrefxRfb)/R D7~D0 就是我们控制的按键看输入多少 然后再划分256份 Vref是我们设置的一个基准电压 PWM 这种类型的方波 完全可以看成是一个交流和直流叠加而成的 回忆一下数电的东西

    2024年02月15日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包