鼠标报告的HOGPD不稳定数据率

13个帖子 / 0新
最后一篇文章
me9atherion
离线
最后一次露面:3年2个月前
加入:2015-02-24 15:15
鼠标报告的HOGPD不稳定数据率

我无法获得惯性鼠标/键盘应用程序的稳定HID报告率。
UPD。:主要主题问题从3-D主题消息开始。
http://support.dialog-spoomendonductor.com/comment/5942#Comment-5942
===============================================================================

你好。我正在用DA14580在单个设备中实现键盘 +鼠标。
鼠标是通过加速度计/陀螺仪实现的,所有处理必须在船上进行。设备必须表示为通用键盘 +鼠标复合HID设备。最初,我的参考点是您的键盘参考项目,我已经准备好实施了自定义HID报告,并能够发送键盘和鼠标报告。

但是目前,我遇到了可用的免费内存问题,以放置运动融合过滤器。我已经检查了此算法的速度,并且知道处理器速度足以实时处理过滤。但这只有32千洛生物的内存可用。我的一切都关闭了(多键合,调试消息等)。但是我仍然大约有1kb适合我的算法。

我发现我可以尝试关闭CFG_PRF_SPOTAR。当前设计不需要此功能。代码将存储在外部闪存中,如果需要,将通过智能摘要和UART加载程序进行更新。然后,我有足够的免费代码内存来实现此算法。项目代码似乎以这样的方式编写,因为代码中的任何地方都可以看到#IF预编译器条件语句以打开/关闭代码零件专用于Spota,这也关闭了BLE_SPOTA_RECEIVER。使用宏定义ble_spota_receiver == 0代码不应执行Spota DB构造,也不应打开Sotaa配置文件。实际上是这样做的。代码构建良好,但行不通。它重新启动(或转到主引导加载程序,并尝试从外部闪存(为空)加载代码)。
代码卡在rwip_schedule()上;从这一点开始,就我从调试器所看到的而言,它失控了。

Linker声称缺少“ Spotar_Patch_Area”部分(链接器警告)。我试图填写本节,因为它是从代码完成的(将一些零init变量放在本节中),但也不起作用。

那么如何正确禁用此功能并释放一些内存?请帮忙。

设备:
me9atherion
离线
最后一次露面:3年2个月前
加入:2015-02-24 15:15
我会尝试回答自己。

我会尝试回答自己。
据我了解,我想我找到了解决方案。当对CFG_PRF_SPOTAR评论并禁用了Sopotar功能时,在参考项目中宣布了替代DB堆大小(大约降低400 botes)的替代DB堆大小(大约降低400 bot的值)。当我将其更改为默认状态时,就像Spotar Featere在应用程序上一样。

me9atherion
离线
最后一次露面:3年2个月前
加入:2015-02-24 15:15
但是我还有另一个

但是我也有另一个有关鼠标隐藏报告频率的问题。正如我所说的,我的参考点是键盘项目,我修改了它的代码,因为该项目需要某种完整的键盘。我添加了鼠标HID报告频道的另一个实例,并可以通过请求消息HOGPD_REPORT_UPD_REQ扔鼠标报告到task_hogpd。问题在于,鼠标数据包传输速率很低(我认为我做错了什么),并且传输频率不是恒定的。
我要进行鼠标报告的体系结构如下:
1)如果应用程序确定L或R鼠标按钮按事件,它将配置具有加速度计解析频率的Timer0(我想要100Hz);
2)Timer0处理程序例程从加速度计获得数据,并调用鼠标惯性过滤器更新。然后它收到新的鼠标三角洲。然后将这些三角洲安全(饱和)安全地添加到XY增量缓冲区中,以累积新的三角洲,直到下一个传输。
3)鼠标HID报告是从app_asynch_trm()(挂钩#1)发送的 - 键盘报告传输也是通过参考设计从那里进行的。鼠标HID报告仅在有鼠标按钮事件或累积缓冲区中可用的X或Y Delta时才传输。在其他情况下,鼠标报告未发送到内核。

我在船上进行了调试GPIO PIN,每次生成新报告时都会触发。此GPIO触发调用是在鼠标报告功能中使用hogpd_report_upd_req的ke_msg_send(req)放置的。我可以在示波器上看到,在运动中,ke_msg_send()以所需的频率调用。因此,据我了解,蓝牙连接(主机)另一侧的操作系统应以相同的频率获得此报告。HOWEWER,​​事实并非如此。传输频率不稳定,在100Hz时,我也会突然断开连接。我认为这些断开连接是由蓝牙堆栈本身启动的,因为我在断开事件回调中得到断点,而不是在参考应用程序的断开程序中。70Hz足以使连接保持活力,而不会突然断开连接,但是报告频率稳定性不佳。

我使用另一个微控制器(也是Cortex-M0)和相同的MEMS芯片从测试板上开发并移植了惯性小鼠过滤算法。该板适合调试惯性鼠标算法。带有100Hz频率的鼠标报告的数据流通过UART供应托管计算机。然后,Python脚本通过OS调用将此流直接转换为鼠标运动。据我所知,100Hz足够频率,可以舒适的鼠标用户反馈。对话框的鼠标参考应用程序还使用了100Hz的鼠标报告率。
那么,我需要做什么才能获得稳定的鼠标报告流?

请,我需要一些帮助来解决这个问题。

me9atherion
离线
最后一次露面:3年2个月前
加入:2015-02-24 15:15
支持。请。我会

支持。请。对于可能存在的不稳定鼠标报告率的问题的任何信息,我感到非常高兴。

mt_dialog
离线
最后一次露面:1年3个月前
职员
加入:2015-06-08 11:34
嗨,Me9atherion,

嗨,Me9atherion,

确保在从传感器中采取数据时不会禁用中断,没有理由只是断开连接的理由,也许您在procecess或读取传感器的数据以及BLE的时间时会禁用中断连接间隔由于残疾人中断而失败。另外,请确保在缓冲区中可用数据时,请继续在app_asynch_trm和app_asynch_proc中发送数据,如果有更多数据以召回调度程序,则返回true。除此之外,鼠标裁判设计是一个相当不错的例子。

谢谢mt_dialog

me9atherion
离线
最后一次露面:3年2个月前
加入:2015-02-24 15:15
感谢您的回复。

感谢您的回复。
我不会禁用中断。然而,大约1.7ms(100Hz所需的timer0中断处理程序周期为10ms)在timer0处理程序回调例程中花费。
但是,在timer0初始化例程中,有:
NVIC_SETPRIORITY(SWTIM_IRQN,3);/ *将TIM0中断的优先级设置为最低 */
因此,据我所知,计时器的优先级最低,并且不应影响更高级别的BLE堆栈中断。我可能是错误的假设?

从Hook#1发送鼠标报告的代码使用检查低级缓冲区,就像键盘报告一样:
if(app_kbd_check_conn_status()&& l2cm_get_nb_buffer_available()){
send_mouse_keyreport()
}

我还将Debug Pin将例程切换到PRF_SERVER_SEND_EVENT(...)中的低级别OS调用,以查看如何直接请求OS在所有高级请求中的所有回调后向HOGPD配置文件发送通知。这些呼叫的频率是我需要的。

我还试图在Linux中使用Wireshark调试蓝牙流。相应地,有大量时间来捕获输出。通常在2个通知之间有〜70毫秒的时间三角洲。然后遵循通常的1-2个标准蛋白,其时间甲甲素的时间低于1ms,然后再次〜70毫秒的间隙。我将帧速率图附加在PDF中。Grafh显示AVG。报告频率是主机30Hz,看起来像是真实的。

附件:
me9atherion
离线
最后一次露面:3年2个月前
加入:2015-02-24 15:15
出色地。我删除了聚会

出色地。我从timer0中断例程中的mems芯片中删除了收集数据。现在,timer0 ISR执行时间很短-4.5microseconds。看来平均数据包率现在需要适应Wireshark捕获统计数据(现在我有80Hz通知率,Wireshark统计数据显示我每秒约80个数据包),但报告率不稳定。
在这些软件修改之后,每5-6个数据包少于1ms和差距,差距少于1ms和间隙之间的通知数据包之间有很多很短的时间三角洲。通知数据包应每10毫秒到达每10ms。
DA14580应用中的OS例程。被要求发送通知数据包的频率是稳定频率。可以在示波器上看到。在将GATTC_SEND_EVT_CMD发送到OS内核之后,我将调试引脚切换例程。也许我想念的BLE堆栈中有一些同步例程?

me9atherion
离线
最后一次露面:3年2个月前
加入:2015-02-24 15:15
出于测试目的,我尝试了

为了进行测试,我尝试删除所有传感器过滤。现在,我只有Timer0会生成100Hz中断并更改全局标志。鼠标报告发送例程是从Hook#1(App_async_trm())调用的,它检查了TIMER0中断中的标志,并发送零鼠标报告以前在BLE缓冲区中检查可用空间和连接状态,以及关键报告。
然后,我在调试输出上有100Hz(来自低级别的GATT通知发送例程)。在实际分配内存并通过HOGPD配置文件App_asynch_trm()返回“ true”之后,再次调用rwip_schedule()。
Wireshark输出在一秒钟内显示了大约100Hz数据包的速率。但是框架是不稳定的。我仍然获得了很大的差距约70毫秒,这些数据包爆发非常低(少于1ms,实际上是600-700ms)。

mt_dialog
离线
最后一次露面:1年3个月前
职员
加入:2015-06-08 11:34
嗨,Me9atherion,

嗨,Me9atherion,

您的假设是正确的,您不允许通过将低优先级设置为计时器中断来干扰您的BLE中断,但是交流接口中可能存在一些关键点,可以禁用您的中断,您可以检查一下。另外,请确保在传感器的数据中保持活跃,这意味着当需要开始阅读传感器时,您应该禁用睡眠。额外的内容请检查您的连接间隔,我想您将间隔设置为较小,但请确保主机接受此间隔,并且不会忽略您的设置。

谢谢mt_dialog

me9atherion
离线
最后一次露面:3年2个月前
加入:2015-02-24 15:15
感谢您的答复。

感谢您的答复。

我根本不会禁用项目的互相互换。转动mems芯片后,我调用force_wakeup函数。睡眠模式被禁用,直到计时器禁用鼠标报告为止。我什至在App_Init中不使用睡眠otion进行调试目的。对于键盘参考项目,连接间隔最小值和最大为7.5ms(6*1.25)。
如何检查主机是否接受我的间隔?

me9atherion
离线
最后一次露面:3年2个月前
加入:2015-02-24 15:15
出色地。一点更新。

出色地。一点更新。
您已经指出了通过主机检查潜伏参数的接受。据我了解,设备发送了其预基的连接参数,但是主机可以对其进行重新装置并发送其自己的连接参数。我启用了调试消息,现在可以在Linux主机的UART终端中看到此内容:
gap_le_create_conn_req_cmp_evt_handler()(56,0,42,1)

这是对Android主机的响应:
gap_le_create_conn_req_cmp_evt_handler()(39,0,700,5)

据我了解,app_connection_func()停留在连接后通过主机更新连接参数,并且它的调试输出显示新的连接参数:
dbg_printf(dbg_all,“ gap_le_create_conn_req_req_cmp_evt_handler()(%d,%d,%d,%d,%d,%d)\ r \ n”,
(int)param-> con_interval,
(int)param-> con_latency,
(int)param-> sup_to,
(int)param-> clk_accuracy
);

因此,56 * 1.25 = 70ms-这是我在Wireshark中看到的延迟,在非常低的延迟数据包突发之间。
主机相应地将我的连接延迟参数置于调试输出是真的吗?

me9atherion
离线
最后一次露面:3年2个月前
加入:2015-02-24 15:15
我找到了解决方案。

我找到了解决方案。
这是我的错误。我在搜索代码内存降低解决方案时评论了use_pref_conn_params_on,但不允许它退回。因此,设备甚至没有发送其自己的可预约连接参数。
我还有一个有关连接参数更新超时的问题。是否有一些理由在连接到主机的40秒后更新它们?将此值添加到5秒钟,因为有1秒延迟Wireshark捕获显示,连接后没有交换更新参数数据包。

mt_dialog
离线
最后一次露面:1年3个月前
职员
加入:2015-06-08 11:34
嗨,Me9atherion,

嗨,Me9atherion,

很高兴您找到了它,延迟连接参数的原因是确保主机已经完成了他的参数并在安全方面。

谢谢mt_dialog