完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
我正在努力解决如何安排任务的问题。 中断1是1ms定时器中断,用于启动CAN上的消息发送 接收到CAN报文后,中断2有效 我还必须在LIDAR单元上通过I2C轮询寄存器,以确保测量完成后再使用I2C读取距离寄存器,下面显示的代码片段 status = CheckLidarStatus(); 我认为我的程序应采取的正确流程如下所示:
|
|
相关推荐
15个回答
|
|
|
CAN总线的速度是多少?CAN总线的1 ms间隔非常快。
|
|
|
|
|
|
500k波特率,从我的计算结果中得出250us Per EXT格式帧的消息给出了750us的开销。什么是更典型的CAN传输更新速率?
|
|
|
|
|
|
100 ms的间隔被认为是快速的。主要标准(例如:j1939)通常指定消息不得在100毫秒内重复。所以是的,也许10毫秒。但是1毫秒,绝对不是在你不控制所有节点的网络中。
|
|
|
|
|
|
好的很棒,谢谢你们的提醒!
|
|
|
|
|
|
10ms非常标准。100ms是垃圾,你不能在机器控制CAN总线中使用那么长的延迟。如果J1939规定间隔为100ms,则J1939不应用于车辆。但既然如此,我不相信100毫秒间隔是强制性的。
|
|
|
|
|
|
是的,这对我来说似乎合情合理。虽然激光雷达外围设备可能忙的最长时间是多少?如果超过1毫秒,那么您可能会错过传输机会。也许繁忙的情况应该只是跳过数据读取而不是循环回来轮询状态。
是的,优先级较低的中断处理程序将在高优先级中断处理程序运行时保持关闭状态。如果优先级较高的定时器中断处理程序运行的时间超过CAN外设接收到足够的消息溢出所需的时间,则会丢失消息。这就是为什么保持中断处理程序简短是一个很好的经验法则。如果所有的定时器中断都设置了标志,那么我怀疑你是否会遇到问题。 另一种考虑这种情况的方法是,当另一个中断处理程序被延迟时,惩罚是什么。当CAN中断被定时器中断延迟时,您会在CAN响应中添加延迟,或者在最坏情况下丢弃消息。当CAN中断延迟定时器中断时,您将向定时器中断添加抖动。最糟糕的情况是下降一毫秒,但CAN中断必须运行超过一毫秒才能实现。那么你的应用程序不太理想,有点滞后还是有点抖动? 令人怀疑的是,任何一个中断都会破坏I2C通信。您可能正在使用I2C控制器外设,它主要独立于CPU发送/接收位。I2C控制器将根据需要继续输入和输出位,而不会受到中断的影响。(如果你对每个位进行位冲击,那么会产生更大的影响,因为单个时钟可能会被一个不相关的中断延长。但是,由于I2C的同步特性,这甚至不一定是个问题。从器件不应该'如果I2C时钟脉冲伸展,请注意。) 轮询激光雷达状态可能是可以接受的。如果CPU没有其他任何功能,那么有什么危害呢?但是如果激光雷达外设有某种“数据就绪”中断,那么你可以启用该中断并等待中断而不是轮询状态。 |
|
|
|
|
|
我会尝试一下,跳过读取距离reg而不是轮询状态。它实际上没有提到如果在状态繁忙时应用读取命令会发生什么,我想它会给我reg值但是在测量完成之前不会更新。
|
|
|
|
|
|
这真的很有帮助谢谢!是的,它是一个外围,它不是我担心的拉伸,它更多的停止和起点之间的差距太大了我担心。例如,要读取,我发送我想要读取的地址,然后停止I2C。然后我再次使用处于读模式的器件地址启动I2C,以接收寄存器中保存的数据。开始和停止之间的差距是我的担忧,因为数据表并没有暗示必须如何快速完成
|
|
|
|
|
|
激光雷达不是通过I2C连接产生中断的能力,并且它不会自动生成I2C通信以指示测量结果。然而,正如我在第一次评论中提到的那样,你让我想到我可以完全跳过检查状态,并接受我可能比实际更新更频繁地阅读距离reg。激光雷达的数据表虽然很简短,但并不表示在忙于进行测量时读取状态而不是状态的代表。我认为它应该没问题!
|
|
|
|
|
|
感谢您的回答非常有帮助,并提高了我对整体的理解!我想你已经给了我足够的时间来完成这个
|
|
|
|
|
|
CAN的本质是,当您尝试发送消息时,您可能会遇到需要接收和处理的优先级较高的消息的冲突。
您的提案显示了极其简单的ISR,它只设置了标志,所有实际工作都在一个后台(非ISR)线程中完成。 我不熟悉STM32的CAN控制器的细节,特别是它的自主性,但是你的提议似乎不足以解决这个问题。 |
|
|
|
|
|
感谢您的回答,只有针对此节点的消息才需要处理器进行任何处理,这需要获取所包含的数据并通过i2c将其应用到激光雷达(设置更改为模块)。你会建议我把这个I2C命令放在ISR中吗?
|
|
|
|
|
|
不是,CAN接收ISR应采取任何必要步骤使CAN接口准备好接收下一条消息,但任何其他工作(例如与LIDAR通信)应推迟到后台线程。
|
|
|
|
|
|
我并没有说清楚。如果您需要从CAN控制器的FIFO中读取数据以使其准备好接收下一条消息,那么您绝对应该在ISR中执行此操作,将数据放入合适的内存缓冲区,然后设置标志或其他任何内容。背景线程。但是,通过I2C接口传输数据需要时间,这不应该在ISR中完成,相反,后台线程应该从内存缓冲区读取数据并以任何所需的速度将其传输到LIDAR。
|
|
|
|
|
|
如果我打算做这样的项目,我会有一个“线程”专门用于管理LIDAR的I2C接口。它将检查来自CAN总线的任何消息并将它们发送到激光雷达; 否则,它会进行距离数据的轮询。这样可以轻松管理I2C接口的两种用途之间的争用。
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
818 浏览 1 评论
994 浏览 0 评论
877 浏览 0 评论
STM32F405驱动DS1302时钟模块,输出时间错乱该怎么排查?
4892 浏览 2 评论
stm32f405rgt6驱动DS1302ZN出现时间错乱问题
3696 浏览 1 评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-12 04:11 , Processed in 2.431081 second(s), Total 104, Slave 85 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
1816