我正在努力解决如何安排任务的问题。我的设置:STM32F103连接在CAN上。通过I2C使用Lidar V3模块通信进行测量,然后在CAN上分配该测量值中断1是1ms定时器中断,用于启动CAN上的消息发送接收到CAN报文后,中断2有效我还必须在LIDAR单元上通过I2C轮询寄存器,以确保测量完成后再使用I2C读取距离寄存器,下面显示的代码片段 status = CheckLidarStatus();
while ((status & LIDAR_BUSY) == LIDAR_BUSY)
{
status = CheckLidarStatus();
}
我认为我的程序应采取的正确流程如下所示:
我主要担心的是:- 这种流程似乎是一种合乎逻辑的方法吗?
- 如果我优先考虑用于CAN传输的定时器中断(而不是RX int),这是否会对CAN网络产生负面影响,即不能及时处理收到的CAN消息?
- 如果在I2C通信期间任何一个中断处于活动状态,它是否会导致I2C通信“掉线”?
- 坐在一个等待Checklidar状态的while循环中是否可以接受,因为不忙,或者有更好的方法吗?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
是的,优先级较低的中断处理程序将在高优先级中断处理程序运行时保持关闭状态。如果优先级较高的定时器中断处理程序运行的时间超过CAN外设接收到足够的消息溢出所需的时间,则会丢失消息。这就是为什么保持中断处理程序简短是一个很好的经验法则。如果所有的定时器中断都设置了标志,那么我怀疑你是否会遇到问题。
另一种考虑这种情况的方法是,当另一个中断处理程序被延迟时,惩罚是什么。当CAN中断被定时器中断延迟时,您会在CAN响应中添加延迟,或者在最坏情况下丢弃消息。当CAN中断延迟定时器中断时,您将向定时器中断添加抖动。最糟糕的情况是下降一毫秒,但CAN中断必须运行超过一毫秒才能实现。那么你的应用程序不太理想,有点滞后还是有点抖动?
令人怀疑的是,任何一个中断都会破坏I2C通信。您可能正在使用I2C控制器外设,它主要独立于CPU发送/接收位。I2C控制器将根据需要继续输入和输出位,而不会受到中断的影响。(如果你对每个位进行位冲击,那么会产生更大的影响,因为单个时钟可能会被一个不相关的中断延长。但是,由于I2C的同步特性,这甚至不一定是个问题。从器件不应该'如果I2C时钟脉冲伸展,请注意。)
轮询激光雷达状态可能是可以接受的。如果CPU没有其他任何功能,那么有什么危害呢?但是如果激光雷达外设有某种“数据就绪”中断,那么你可以启用该中断并等待中断而不是轮询状态。
一周热门 更多>