delay里systick->crtl卡死奇怪问题

img


图一是我自己写的逆运动学函数,可以看到有三条算式pypxpz。现在的状态是运行不了的,会卡死在函数里面的一个Delay_ms里面(卡死在systick->crtl这一步),如下图。但是当我删除pz,py,px任意一条算式,或者删除for循环,函数都能正常运行(Delay_ms不会卡死)。下图是delay函数。

img


这些函数我在几个小时前测试过,全部都是能用的,但是后来我加入了蓝牙模块,将这些函数放进串口接收函数的中断函数里调用,但是调用不成功,也是在delay那里卡死(systick->crtl那里死循环)。然后当我去掉串口,拔掉蓝牙后,就发生了上的情况,连独立调用都不成功了,然后换过板子试过,也是如此,可以排除板子问题。唯一解决问题的办法是改掉delay的时钟源。但是改完之后只有上述的函数运行速度快了1000倍,所以要在函数里加Delay_ms(100000)才能正常使用(同样的,如果去掉某算式,或者去掉循环,函数恢复正常速度)。总结问题如下:

img

时钟源改成FCLK后的Delay_ms:

img


目标是不需要去除任何代码也能成功运行。猜测是算力不足?或者代码量过大?嵌套过多导致?板子是合泰公司的ht32f52352,基本逻辑架构和stm32f1是一样的。

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
首先,卡死问题可能与以下因素有关:

  1. 时钟源设置不正确或时钟频率过高,导致systick定时中断无法正常触发。
  2. 嵌套循环或计算量过大,导致systick定时中断中的延时函数无法正常执行。
  3. 可能存在某些变量或指针未初始化或指向错误的内存地址,导致程序出现意外错误。

针对这些问题,建议你按照以下步骤逐个排查:

  1. 确认时钟源设置是否正确,可以通过查看时钟频率是否与预期一致来判断。如果时钟频率过高,可以尝试将其降低,或者使用硬件定时器来代替systick定时中断实现延时功能。
  2. 如果嵌套循环和计算量过大,可以尝试优化代码,如将计算结果缓存起来以减少重复计算,或者将循环中的计算分解成多个步骤,以便在每次systick定时中断中执行部分计算。
  3. 通过逐个检查变量和指针的初始化情况,可以排除这种可能性。另外,建议在代码中加入断言(assert)等调试手段,以确保程序正确性。

同时,建议你提供更详细的代码、调用堆栈和硬件平台信息,以便更准确地定位问题。
如果我的回答解决了您的问题,请采纳!

以下内容引用CHATGPT:

根据问题描述,可能存在以下几种问题:

  1. 延时函数 Delay_ms() 实现不正确,导致死循环。
  2. 嵌套过多导致栈溢出,出现未知错误。
  3. 代码中存在潜在的 bug,导致程序异常。

针对以上问题,可以尝试以下解决方案:

  1. 修改 Delay_ms() 函数的实现方式,采用硬件定时器实现延时,避免卡死现象。例如:

    void Delay_ms(uint32_t ms)
    {
        uint32_t tickstart = HAL_GetTick();
        uint32_t wait = ms;
    
        while ((HAL_GetTick() - tickstart) < wait)
        {
            // do nothing
        }
    }
    
  2. 检查代码中是否存在嵌套过多的情况,可以采用宏定义和函数封装的方式来简化代码。例如:

    #define MAX_COUNT 1000
    void delay(uint32_t count)
    {
        for (uint32_t i = 0; i < count; i++)
        {
            // do nothing
            if (i > MAX_COUNT)
            {
                break;
            }
        }
    }
    
  3. 对代码进行逐行调试,发现问题所在,并进行修复。例如:

    void inverse_kinematics(float x, float y, float z)
    {
        float px, py, pz;
        float a, b, c, d, e, f, g, h, i;
        float cosb;
    
        // do something
    
        for (uint8_t j = 0; j < 4; j++)
        {
            // do something
        }
    
        // do something
    
        delay(1000); // 延时 1000 微秒
    
        // do something
    }
    

总之,针对这个问题,需要仔细分析代码,找到问题所在,然后采取适当的解决方案。

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^