本人学习rtthread时间不久,练习中发现在定时器中断函数中使用了HAL_Delay函数之后程序就直接卡死了,用线程的方式就不会,后面查阅文档才发现定时器初始化的时候默认是硬件定时器,要是使用软件定时器就不会卡死,原因可能是因为硬件定时器优先级高于系统滴答的优先级(本菜鸡猜测,但是不清楚希望有大神解惑),但是我设置了系统滴答的优先级为最高还是不行
HAL_NVIC_SetPriority(SysTick_IRQn,0,0);
下面是官方文档内的介绍
HARD_TIMER 模式的定时器超时函数在中断上下文环境中执行,可以在初始化 / 创建定时器时使用参数 RT_TIMER_FLAG_HARD_TIMER 来指定。在中断上下文环境中执行时,对于超时函数的要求与中断服务例程的要求相同:执行时间应该尽量短,执行时不应导致当前上下文挂起、等待。例如在中断上下文中执行的超时函数它不应该试图去申请动态内存、释放动态内存等。
RT-Thread 定时器默认的方式是 HARD_TIMER 模式,即定时器超时后,超时函数是在系统时钟中断的上下文环境中运行的。在中断上下文中的执行方式决定了定时器的超时函数不应该调用任何会让当前上下文挂起的系统函数;也不能够执行非常长的时间,否则会导致其他中断的响应时间加长或抢占了其他线程执行的时间。
我是在定时器中断函数内使用了mpu6050的dmp库,里面有一个复位fifo的函数有用到HAL_Delay(50)的指令,本以为50ms应该问题不大,但是不行,后面初始化定时器的时候加入了使用软件定时器的宏定义RT_TIMER_FLAG_SOFT_TIMER,一切就没问题了
rt_timer_init(&tim_1ms, "tim_1ms", TIM_1ms, RT_NULL, 1, RT_TIMER_FLAG_PERIODIC|RT_TIMER_FLAG_SOFT_TIMER);
在中断中不能使用任何延时函数的。
https://mp.weixin.qq.com/s/zNNLmpsRhfthey0oBFmytA 可以看下这篇文章,RT-Thread MPU6050姿态解算的
@flashman2002 我查了一下说是延时的时间超过定时器中断的溢出时间系统就不行了,应该是上一次的延时还没完成又进去一次中断服务函数里面,然后又一直在延时延时了,所以程序卡死了😂
@Enthusiasm 好的谢谢,我也是用的dmp库,就是库里面有一个用到了HAL_Delay
中断服务程序讲究简洁,快进快出,不要放延时函数或耗时比较长的函数