STM32
直播中

贾永世

7年用户 1725经验值
私信 关注
[问答]

相同的代码,不同的工程出现定时器抢占的现象怎么解决?

如题,相同的代码,不同的工程出现定时器抢占的现象,事情是这样的
​项目功能描述:emwin作为人机交互,根据界面的输入值,8个tiM依次输出驱动电机,驱动方式为定时器中断翻转IO电平的方式。

​工程1:使用开发板自带的EMWIN例子修改,加入界面和定时器代码运行正常
​工程2:使用CUBEMX新建工程,加入以上代码后出现,电机转动的时候卡顿严重,目测是被抢占了优先级或其他原因

​目前尝试的方法有:修改两个优先级一致,未能解决问题
​                               加大堆栈大小,也未能解决问题。
​目前陷入迷茫状态。


回帖(1)

张华

2024-5-15 17:02:19
在您描述的情况下,出现定时器抢占现象可能是由于不同工程之间的配置差异导致的。以下是一些建议来解决这个问题:

1. **检查中断优先级**:确保两个工程中的定时器中断优先级设置相同。在HAL库中,可以使用`HAL_NVIC_SetPriority()`函数设置中断优先级。

2. **检查时钟配置**:确保两个工程的时钟配置相同,特别是与定时器相关的时钟。在CUBEMX中,可以在时钟配置页面检查和修改时钟设置。

3. **检查定时器配置**:确保两个工程的定时器配置相同,包括预分频器、自动重载寄存器等。在CUBEMX中,可以在定时器配置页面检查和修改这些设置。

4. **减少中断服务例程(ISR)的执行时间**:尽量简化定时器中断服务例程中的代码,减少执行时间,以降低抢占的可能性。

5. **使用DMA**:如果可能,可以考虑使用DMA(直接内存访问)来控制定时器,以减少CPU的负载。

6. **优化代码**:检查代码中是否有不必要的循环、函数调用等,尽量优化代码以减少执行时间。

7. **使用操作系统**:如果问题仍然存在,可以考虑使用实时操作系统(RTOS)来管理任务调度,以确保各个任务的优先级得到正确处理。

8. **调试和分析**:使用调试工具(如Keil MDK-ARM、STM32CubeIDE等)来分析程序的运行情况,找出可能的性能瓶颈。

9. **硬件检查**:检查硬件连接是否正确,确保没有硬件故障导致的问题。

10. **固件升级**:确保使用的固件库(如HAL库)是最新版本,以避免可能的已知问题。

通过以上步骤,您应该能够找到并解决定时器抢占的问题。如果问题仍然存在,建议详细分析程序的运行情况,查找可能的原因,并尝试其他解决方案。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分