CAN网络上数据采集的嵌入式系统任务调度

2019-07-14 17:39发布

我正在努力解决如何安排任务的问题。我的设置:STM32F103连接在CAN上。通过I2C使用Lidar V3模块通信进行测量,然后在CAN上分配该测量值中断1是1ms定时器中断,用于启动CAN上的消息发送接收到CAN报文后,中断2有效我还必须在LIDAR单元上通过I2C轮询寄存器,以确保测量完成后再使用I2C读取距离寄存器,下面显示的代码片段
status = CheckLidarStatus();

        while ((status & LIDAR_BUSY) == LIDAR_BUSY)
        {
            status = CheckLidarStatus();
        }
我认为我的程序应采取的正确流程如下所示: 1.png 我主要担心的是:
  • 这种流程似乎是一种合乎逻辑的方法吗?
  • 如果我优先考虑用于CAN传输的定时器中断(而不是RX int),这是否会对CAN网络产生负面影响,即不能及时处理收到的CAN消息?
  • 如果在I2C通信期间任何一个中断处于活动状态,它是否会导致I2C通信“掉线”?
  • 坐在一个等待Checklidar状态的while循环中是否可以接受,因为不忙,或者有更好的方法吗?

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
14条回答
wenminglang
1楼-- · 2019-07-15 00:44
500k波特率,从我的计算结果中得出250us Per EXT格式帧的消息给出了750us的开销。什么是更典型的CAN传输更新速率?
xiaolu511
2楼-- · 2019-07-15 01:12
100 ms的间隔被认为是快速的。主要标准(例如:j1939)通常指定消息不得在100毫秒内重复。所以是的,也许10毫秒。但是1毫秒,绝对不是在你不控制所有节点的网络中。
wenminglang
3楼-- · 2019-07-15 05:34
好的很棒,谢谢你们的提醒!
gvjhvbc
4楼-- · 2019-07-15 11:13
 精彩回答 2  元偷偷看……
青上也
5楼-- · 2019-07-15 13:35
是的,这对我来说似乎合情合理。虽然激光雷达外围设备可能忙的最长时间是多少?如果超过1毫秒,那么您可能会错过传输机会。也许繁忙的情况应该只是跳过数据读取而不是循环回来轮询状态。
是的,优先级较低的中断处理程序将在高优先级中断处理程序运行时保持关闭状态。如果优先级较高的定时器中断处理程序运行的时间超过CAN外设接收到足够的消息溢出所需的时间,则会丢失消息。这就是为什么保持中断处理程序简短是一个很好的经验法则。如果所有的定时器中断都设置了标志,那么我怀疑你是否会遇到问题。
另一种考虑这种情况的方法是,当另一个中断处理程序被延迟时,惩罚是什么。当CAN中断被定时器中断延迟时,您会在CAN响应中添加延迟,或者在最坏情况下丢弃消息。当CAN中断延迟定时器中断时,您将向定时器中断添加抖动。最糟糕的情况是下降一毫秒,但CAN中断必须运行超过一毫秒才能实现。那么你的应用程序不太理想,有点滞后还是有点抖动?
令人怀疑的是,任何一个中断都会破坏I2C通信。您可能正在使用I2C控制器外设,它主要独立于CPU发送/接收位。I2C控制器将根据需要继续输入和输出位,而不会受到中断的影响。(如果你对每个位进行位冲击,那么会产生更大的影响,因为单个时钟可能会被一个不相关的中断延长。但是,由于I2C的同步特性,这甚至不一定是个问题。从器件不应该'如果I2C时钟脉冲伸展,请注意。)
轮询激光雷达状态可能是可以接受的。如果CPU没有其他任何功能,那么有什么危害呢?但是如果激光雷达外设有某种“数据就绪”中断,那么你可以启用该中断并等待中断而不是轮询状态。
wenminglang
6楼-- · 2019-07-15 14:27
我会尝试一下,跳过读取距离reg而不是轮询状态。它实际上没有提到如果在状态繁忙时应用读取命令会发生什么,我想它会给我reg值但是在测量完成之前不会更新。

一周热门 更多>