一世have searched these forums for as much information as I could gather and I have looked through the吞吐量_eval.andsps系统源代码和我有点熟悉他们和理解他们的程度。它们对我来说确实有些不透明。。。也许你们都能在这里取笑我。
我不需要超高的吞吐量。。。>3k字节/秒。我有一个中断,每2ms发生一次,产生6个字节。但是我无法使用标准的GATT通知机制来实现这一点(如果我每4ms生成一个中断,我就开始丢失数据)。所以我的第一个问题是,有人觉得这不对吗?我保留了一个由20字节数据包组成的队列,以便通过GATT通知发送。我检查GATTC\u CMP\u EVT消息之后的队列,并安排发送下一个数据包(如果有)。系统跟不上,在大约100个数据包之后就失败了(如果我把队列调大的话会更多,如果我以2ms的中断周期计时的话会更少)。
So, assuming the above won't work, I looked at the吞吐量_eval.项目。它看起来像它使用多个特点stics (the data appears to be written to all of them in parallel) and l2cap. It's hard for me to see what the client receiving the data is doing here as there is no example. Does the client have to interact with l2cap as well? Unfortunately, my Windows PC doesn't do anything but GATT so I'm not sure how to reconcile this.
SPS做了我认为你做不到的事。特征(SPS\u SERVER\u TX)的大小为128个字符。我认为你不能通知这么大的物体(当我尝试时,它不起作用)。也许我在这里遗漏了一些关键的方面,但是我也不知道这里的最大吞吐量应该是多少。
来自画廊的任何建议都会有所帮助。
Thanks,
马可
你好,马可德,
致敬,是系统中启用的睡眠吗?您应该能够使用这种速率发送数据,如果启用睡眠,您可能会在禁用中断时丢失数据,您还可以处理这些数据吗?你说系统失败了,它是否进入了硬盘处理程序?您如何发送通知?您在中断处理程序中填充队列并更新数据库中的值?
没有客户端不必与L2CAP进行交互。
DSPS项目发送MTU Exchange命令(如果他接受它,则允许主机,以接收更大的MTU),如果您愿意,可以尝试,但我认为这是您的问题。
谢谢mt_dialog.
谢谢你的回复。睡眠模式未启用。没有数据处理。中断将填充队列,如果在放入队列时队列为空,则会向流任务发送初始消息,以发送队列中的下一项。。流任务在正常过程中处理此消息(通过将数据放入数据库并发送通知)。当GATTC\u NOTIFY消息出现时,它检查是否有更多的数据包要发送,如果有,则向自己发送一条消息以发送队列中的下一个项目。这就是无穷大。填充一个数据包需要3次中断(18字节+2字节的状态)。在8ms(125Hz,24ms/包)的中断周期内,一切正常。事实上,队列中放入的项目永远不会超过1个。中断时间为4ms(12ms/包),队列将填满。我在客户端收到大约100个有效数据包。我完全承认我可能把这台机器搞砸了,但如果我搞砸了,我不知道在哪里。。。没那么复杂。
(注意:数据包从GATTC\ U NOTIFY上的队列中删除,以防止多个消息/数据包循环。一开始我遇到了这个问题,导致排队的人都空了。。。谢天谢地,没有人或宠物在随后的灾难中受到伤害。)
连接间隔是默认值(我认为7.5或8ms IIRC)。
谢谢,
马可
你好,马可德,
Can you try and set just a flag from the ISR....then check the flag in the app_asynch_trm and if the flag is set then send the message to the streaming task. Perhaps the message sending from the ISR to the streaming task causes the probelm you are facing. Can you upload a Smart Snippers image while you are connected and sending data (when it fails and when it doesn't)?
谢谢mt_dialog.
将标志从ISR设置并作为主循环的一部分发送消息似乎没有帮助。我挂钩了一个范围并翻了一个gpio bit。当我将中断率设置为足够低(<180 Hz,每16.7ms时)数据包发送时的时间以及当我获得gattc_notify时(如果可用,我可以发送下一条消息)是大约800us,偶尔闪烁高达1.2ms。那里很稳定。当速度超过195Hz以上的东西时,在范围上,我能够衡量数据包之间的时间,并且在许多实例中发送了Gattc_notify> 55ms。当这些长时间的足够的时候,队列填满了。我将在获取智能代码段图像(我还没有使用那个软件)。
(Edit: Something appears to be amiss with SmartSnippets as it can't find the ftd2xx.dll. I do have Windows 10... )
你好,马可德
来自智能代码片段的图像会有所帮助,您是否通过等待上一个GATTC\u NOTIFY completetion事件来触发下一个数据包的发送?
Can you try sending the messages without waiting ?
谢谢mt_dialog.
谢谢你的回复。我需要一些关于“聪明片段”的指导。我有SmartSnippets启动(下载了驱动程序),可以下载代码并让它运行。但在那之后,我真的不知道该怎么办。我在右下角看到一个“数据速率监视器”,但按下按钮似乎没有效果。我应该注意,我使用的是PAN1740模块。
在其他新闻中,我尝试从23到87增加MTU大小,认为如果我可以发送它将工作的数据包更少。虽然它确实允许我增加频率(高达约240hz),但它仍然以相同的方式失败。在发送数据包和GattC_Notify之间的时间非常长,在这种情况下大约60ms,这比所需的分组频率长。
如果我不等待GATTC\u通知并在数据包准备好时发送数据包,比如说,每52.8ms发送一个与87字节MTU相对应的数据包(我需要每32ms发送一个数据包),数据包就会在源位置丢弃。我发送的数据包中有一个序列号。这些值是不连续的。通常只有一个包被丢弃,但我已经看到多达两个。
我正在继续检查代码,以确保我没有弄错。
还是没什么好运气。我试过了using l2cc (like the throughput_eval project) but at higher throughput rates, around where it was failing with GATT, the device would go into reset. At higher interrupt rates, the GATTC_NOTIFY message takes too long get sent, filling up the queue. If I don't wait for the message packets get dropped, even when they are only coming at around 1 packet per 50ms (87 byte MTU). I've tried varying the size of the MTU but that doesn't seem to help except that larger packets do marginally better.
我更改了代码,以便在ISR本身中没有发生实际处理。KELMEL消息作为APP_ASYNCH_TRM()函数的一部分发送。
GATTCèu NOTIFY需要这么长的时间这一事实是个谜,因为在较低的中断率下,发送/等待过程只需要几毫秒。
你好,马奇,
Can you send us some Smart Snippets activity, maybe we can have a look and find something out.
谢谢mt_dialog.
我无法获得智能片段工作。该设备是松下1740.我有定义的CFG_StreamData以及度量标准。我可以将代码下载到设备(jlink),但数据箱监视器只支持COM端口。通常,“开始外设”按钮没有效果,其余时间显示错误。
我想我发现了这个问题。使用Wireshark我能够跟踪客户端(运行Windows 10的PC)的对话。每个L2CAP片段后,我可以看到通过空的PMU数据包在响应的PC响应。有时,响应需要太长,强制数据以备份我的设备。我不是一个专家,所以你可以确认客户端(以空的PMU形式)需要在下次传输的数据包之前发生吗?
谢谢
马可
你好,马可德,
我们无法从你上传的日志中看出什么(在你的另一篇文章中,我假设你正在检查同一个案例),因为有些数据包似乎丢失了。通常,主机在每个连接间隔内都会使用空pmu或数据包(如果需要发送某些内容)轮询设备。通过这些数据包,主机能够确认设备发送的前一个数据包已被接收,并执行某种流控制。如果数据包未被确认,则必须重新发送。换句话说,如果主机显式地不确认一个数据包,那么设备就不能发送另一个数据包,直到这个数据包最终被主机确认。这样主机就可以阻止设备发送更多的数据包。无论如何,主机总是轮询设备!因此,您所报告的主机在发送空的轮询数据包时暂停是一个问题,如果它确实发生并且不是由嗅探器生成的(嗅探器看起来不太可靠)。
谢谢mt_dialog.