电子产业一站式赋能平台

PCB联盟网

搜索
查看: 585|回复: 0
收起左侧

【笔记】单片机卡死的八大原因和解决方法

[复制链接]

397

主题

397

帖子

2461

积分

三级会员

Rank: 3Rank: 3

积分
2461
发表于 2023-11-4 21:00:00 | 显示全部楼层 |阅读模式

0bqdzzjn4zu64011389634.png

0bqdzzjn4zu64011389634.png
0 l& S: |% }+ z' z% T
在微控制器上,程序卡住(即停止执行)可能有多种原因。下面我将列举一些常见的原因,并提供一些可能导致程序卡住的示例情况。请注意,这里只是一些示例,并不能穷尽所有可能的情况。
! U8 ^3 T2 Q4 h. D+ ]* a1. 死循环(Infinite Loop):在程序中存在无法跳出的循环结构,导致程序无法继续执行。例如:
  • while(1){    // 执行某些操作}如果该循环没有跳出条件,或者跳出条件永远不满足,程序将永远停留在这个循环中。& ]; H5 o2 s: J5 \" l. p
    2. 中断问题:某个中断服务程序(ISR)出现错误,导致无法正确返回主程序。例如:  f! D9 e0 c( a2 d
  • void EXTI_IRQHandler(void){    // 处理外部中断事件
    % W$ _' ?$ p* M  b    // 没有正确清除中断标志,导致一直触发中断}如果中断服务程序没有正确处理中断标志,将导致中断一直触发,从而导致程序卡住。
    , t; a' _& Z: f. {) A
    - g9 H$ ?; W8 P1 x) z% [3. 资源争用(Resource Conflict):多个任务或中断竞争同一个资源,导致死锁或资源无法释放。例如:
    $ g6 n" U7 s* w& ?- K, j' G0 F
  • void Task1(void){    while(1)    {        // 任务1使用某个共享资源. U( L$ x, W0 d$ d2 n4 Q
            // 没有正确释放资源,导致其他任务无法访问    }}
    8 K+ O% G+ S* M$ e& Ivoid Task2(void){    while(1)    {        // 任务2使用相同的共享资源    }}如果任务1没有正确释放共享资源,任务2将无法获得该资源,从而导致程序卡住。
    0 t& M! X. c: R2 I5 E. x/ c4. 初始化问题:某些硬件或外设没有正确初始化,导致程序无法正常运行。例如:8 M  ^+ J. M2 @
  • int main(void){    // 初始化代码9 C) A. P+ K5 E4 G% g" w! K
        // 某个外设初始化失败,导致无法继续执行3 v, [1 H: v; I) ^0 S% G. a$ \! m
        while(1)    {        // 此处可能添加错误处理或调试代码    }}如果某个外设初始化失败,可能会导致程序卡住在错误处理或调试代码处。
    8 ]& F2 b7 e5 t9 f9 K5. 堆栈溢出(Stack Overflow):程序使用的堆栈空间超出了预分配的大小,导致程序无法继续正常执行。例如:! U- `) }1 j0 f- ?, X
  • void RecursiveFunction(void){    // 递归调用函数,没有递归出口条件: c' N- \/ M+ S% r
        RecursiveFunction();}' `6 t" a! ~: L9 e0 ]2 e+ D
    int main(void){    RecursiveFunction();3 v1 G; z6 \* q8 N9 l0 C+ U
        while(1)    {        // 无法到达这里,程序卡住    }}在递归函数中,如果没有递归出口条件,将导致堆栈溢出,程序卡住。5 _( {* D7 \4 ^  l% _& G+ \
    6. 时钟问题:某些外设或模块需要正确的时钟配置才能正常工作。如果时钟配置错误或时钟源不正确,可能导致程序停止执行。例如:
    # Z! l6 k6 R, y- Q: n1 n
  • int main(void){      // 时钟配置错误,外设无法正常工作         while(1)         {                 // 无法到达这里,程序卡住         }}如果时钟配置错误,例如外设使用了错误的时钟源或时钟分频配置,将导致外设无法正常工作,从而导致程序卡住。
    2 U1 C$ T! T4 X5 }, J: b) }& E1 X9 [5 E  I
    7. 外设等待问题:某些外设需要等待一些特定条件的发生才能继续执行。如果这些条件无法满足,程序将无法继续执行。例如:
    + h; W8 ^. ~, V6 |1 V3 c7 t" x) L
  • int main(void){    // 某个外设等待某个事件发生2 K/ @3 X  \- |9 B/ w0 \9 }; R( f
        while(1)    {        // 无法到达这里,程序卡住    }}如果外设等待的事件没有发生,例如等待一个数据传输完成或一个标志位的设置,程序将无法继续执行。
    , e' @+ A! f, M2 `' c" h  q( {1 d9 w- O$ @$ ^$ O# q
    8. 外部设备问题:与外部设备通信时,如果设备未正确响应或数据传输中断,可能导致程序停止执行。例如:
    ( j8 u5 \/ u3 i! l: w% x( n
  • int main(void){    // 与外部设备进行通信
    - K7 ]5 y/ ]" J; d3 a+ I0 \' O' k" v    // 设备未正确响应或数据传输中断$ a6 v  C, U5 O! J- v
        while(1)    {        // 无法到达这里,程序卡住    }}如果外部设备未正确响应或数据传输中断,程序将停止执行,因为没有处理该情况的代码。8 l; O# l  c. b# K2 Z
    总之,程序卡住的原因有很多,包括死循环、中断问题、资源争用、初始化问题、堆栈溢出、时钟问题、外设等待问题和外部设备问题等。在调试时,可以通过使用调试器、日志输出、错误处理机制和逐步执行等方法来定位和解决这些问题。每个具体的情况可能需要根据具体的硬件平台、软件配置和应用需求进行调试和排查。
    & a" |3 N1 l& w3 o7 d" C==========
    . D( |& k5 _+ [- w, h4 _2 U3 g  z( R9 h往期回顾:【PID专题】MATLAB如何实现PID?
    + I( H( W0 o& e* f5 ?/ r- a【PID专题】控制算法PID之微分控制(D)的原理和示例代码4 g( Y  I  a  p( P- P+ \
    【PID专题】控制算法PID之积分控制(I)的原理和示例代码
    & i6 l' U5 H$ C; v: ?1 P【PID专题】控制算法PID之比例控制(P)的原理和示例代码
    7 ]2 G1 \2 |' s( x  o==========
    $ Q" |0 L& d8 b4 @

    1tqvtwielxe64011389734.png

    1tqvtwielxe64011389734.png
    . @+ Y/ \: H" W) E. ^

    9 V, i/ ~2 v6 [  Z* `: R# a5 c

    syfrsjy43xn64011389835.png

    syfrsjy43xn64011389835.png
  • 回复

    使用道具 举报

    发表回复

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则


    联系客服 关注微信 下载APP 返回顶部 返回列表