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

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 Stata链式中介效应代码修改
  • ¥15 latex投稿显示click download
  • ¥15 请问读取环境变量文件失败是什么原因?
  • ¥15 在若依框架下实现人脸识别
  • ¥15 添加组件无法加载页面,某块加载卡住
  • ¥15 网络科学导论,网络控制
  • ¥15 利用Sentinel-2和Landsat8做一个水库的长时序NDVI的对比,为什么Snetinel-2计算的结果最小值特别小,而Lansat8就很平均
  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错