Himmik 2023-04-14 21:36 采纳率: 55.6%
浏览 57
已结题

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是一样的。

  • 写回答

3条回答 默认 最新

  • 极客智能体-在线 2023-04-15 01:48
    关注

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

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

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

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

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 4月23日
  • 已采纳回答 4月15日
  • 创建了问题 4月14日

悬赏问题

  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料