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 17:30
这真的很有帮助谢谢!是的,它是一个外围,它不是我担心的拉伸,它更多的停止和起点之间的差距太大了我担心。例如,要读取,我发送我想要读取的地址,然后停止I2C。然后我再次使用处于读模式的器件地址启动I2C,以接收寄存器中保存的数据。开始和停止之间的差距是我的担忧,因为数据表并没有暗示必须如何快速完成
wenminglang
2楼-- · 2019-07-15 17:33
激光雷达不是通过I2C连接产生中断的能力,并且它不会自动生成I2C通信以指示测量结果。然而,正如我在第一次评论中提到的那样,你让我想到我可以完全跳过检查状态,并接受我可能比实际更新更频繁地阅读距离reg。激光雷达的数据表虽然很简短,但并不表示在忙于进行测量时读取状态而不是状态的代表。我认为它应该没问题!
wenminglang
3楼-- · 2019-07-15 17:45
 精彩回答 2  元偷偷看……
lingjianghui
4楼-- · 2019-07-15 18:25
CAN的本质是,当您尝试发送消息时,您可能会遇到需要接收和处理的优先级较高的消息的冲突。
您的提案显示了极其简单的ISR,它只设置了标志,所有实际工作都在一个后台(非ISR)线程中完成。
我不熟悉STM32的CAN控制器的细节,特别是它的自主性,但是你的提议似乎不足以解决这个问题。
wenminglang
5楼-- · 2019-07-15 22:33
感谢您的回答,只有针对此节点的消息才需要处理器进行任何处理,这需要获取所包含的数据并通过i2c将其应用到激光雷达(设置更改为模块)。你会建议我把这个I2C命令放在ISR中吗?
lingjianghui
6楼-- · 2019-07-16 04:11
不是,CAN接收ISR应采取任何必要步骤使CAN接口准备好接收下一条消息,但任何其他工作(例如与LIDAR通信)应推迟到后台线程。

一周热门 更多>