鼠标报告的Hogpd不稳定数据速率

13个帖子/ 0新
最后发表
me9atherion
离线
最后一次露面:2年1个月前
加入:2015-02-24 15:15
鼠标报告的Hogpd不稳定数据速率

我无法获得惯性鼠标/键盘应用程序的稳定HID报告速率。
乌利希期刊指南。:主要主题问题从3d主题信息开始。
http://support.dialog-semicondiondiondum/comment/5942#5942
=======================================================================================

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

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

我发现我可以尝试关闭cfg_prf_spotar。当前设计不需要此功能。代码将存储在外部闪存中,如果需要,将通过Smart Scippet和UART Loader更新。然后我有足够的免费代码内存来实现此algorythm。项目代码似乎以这样的方式编写,即代码中的到处都可以工作,我可以看到#if precompiler条件语句,以打开专用于stota的开/关码部件,也关闭ble_spota_receiver。使用宏定义BLE_SPOTA_RECEIVER == 0代码不应执行SPOTA DB构造,不应打开SPOTA配置文件。实际上它这样做了。代码构建得很好但不起作用。它重新启动(或转到主引导加载程序,并尝试从外部闪存(它为空)的加载代码)。
代码卡在rwip_schedule()上;从这一点来看,只要我从调试器中看到它就会失控。

链接器声称错过了“spotar_patch_area”部分(链接器警告)。我试图填补这一节,因为它是从代码完成(把一些零初始变量到这一节),但它也不起作用。

那么我如何正确地禁用这个特性并释放一些内存呢?请帮助。

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

我会尽力回答自己。
据我所知,我想我找到了解决办法。当CFG_PRF_SPOTAR被注释,因此SPOTAR特性被禁用时,在参考项目中有一个替代数据库堆大小的声明(低值大约400字节)。当我把它更改为默认状态,因为是与SPOTAR功能上的应用程序工作。

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

但我还有一个关于鼠标HID报告频率的问题。正如我说的,我的参考点是键盘项目,我修改了它的代码,因为这个项目需要某种功能齐全的键盘。我添加了鼠标隐藏报告通道的另一个实例,可以通过请求消息HOGPD_REPORT_UPD_REQ扔鼠标报告到TASK_HOGPD。问题是鼠标包传输速率很低(我想我做错了什么),传输频率不是恒定的。
我做鼠标报告的架构如下:
1)如果应用程序确定L或R鼠标按钮按下事件,它配置timer0与加速计解析频率(我想要100Hz);
2)Timer0 Handler例程从加速度计获得数据,并调用鼠标惯性过滤器更新。然后它收到新的鼠标增量。然后将这些ΔS安全地(饱和)添加到XY Deltas缓冲区中,以累积新的Δ直接下一步传输;
鼠标隐藏报告从app_asynch_trm() (HOOK#1)发送-键盘报告传输也是从那里通过参考设计。只有在有鼠标按钮事件或积累缓冲区中有非零的X或Y增量时,才传输鼠标隐藏报告。在其他情况下,鼠标报告不会发送到内核。

我有调试GPIO引脚,每次生成新报告时都会触发。在鼠标报告函数中使用Hogpd_report_upd_req ke_msg_send(req)之后,将此GPIO触发呼叫放置。我可以在示波器上看到,在运动中,ke_msg_send()称为所需频率。因此,就我了解蓝牙连接的另一边(主机)的操作系统应该以相同的频率获取此报告。豪夫,它不是那么。传输频率不稳定,在100Hz时,我也会突然断开连接。我认为这些断开连接由蓝牙堆栈本身启动,因为我在断开事件回调中获得断点,而不是断开的参考应用程序的例程。70Hz足以保持连接直播,无突然断开,但报告频率稳定性差。

我开发和移植的惯性鼠标滤波算法从测试板与另一个微控制器(也皮质m0)和相同的MEMS芯片。该板适用于惯性鼠标算法的调试。将100Hz频率的鼠标报告数据流通过UART馈送给主机。然后python脚本通过os调用将此流直接转换为鼠标移动。据我所知,100Hz对于舒适的鼠标用户反馈来说已经足够了。Dialog的鼠标引用应用程序也利用了100Hz的鼠标报告率。
那么我需要做些什么来获得稳定的鼠标报告流?

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

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

支持。请。我将非常高兴的任何信息,这可能的情况下,鼠标报告率不稳定的问题。

mt_dialog.
离线
最后一次露面:2个月3天前
工作人员
加入:2015-06-08 11:34
嗨me9atherion,

嗨me9atherion,

确保你不要禁用中断proccessing来自传感器的数据时,没有理由的da断开,也许你proccessing时禁用中断或阅读来自传感器的数据,当祝福发送一个连接的时间间隔不能禁用中断。当缓冲区中有可用数据时,还要确保继续在app_asynch_trm和app_asynch_proc中发送数据,如果有更多数据则返回true,以便召回调度程序。除此之外,鼠标参考设计也是一个很好的例子。

谢谢mt_dialog.

me9atherion
离线
最后一次露面:2年1个月前
加入:2015-02-24 15:15
谢谢你的回应。

谢谢你的回应。
我不禁用中断。然而,大约1.7ms(100Hz所需的Timer0中断处理程序期间的10ms)花费在Timer0 Handlack例程中。
但是,在Timer0初始化例程中有:
nvic_setpriority(swtim_irqn,3);/ *为tim0中断设置优先级,以最低* /
所以定时器有最低的优先级,就我所知,更高级别的BLE堆栈中断不应该受到影响。也许我的假设是错误的?

从挂钩#1发送鼠标报告的代码利用键盘报告查看低级缓冲区:
if(app_kbd_check_conn_status()&& l2cm_get_nb_buffer_available()){
send_mouse_keyreport ()
}

我还在prf_server_send_event(...)中将调试引脚切换例程转到低级OS调用,以查看如何直接请求操作系统以在从更高级别请求到Hogpd配置文件的所有回调后发送通知。这些呼叫的频率是我需要的。

我还尝试使用Linux中使用Wireshark调试蓝牙流。相应地有大型时间Δ捕获输出。通常在2个通知之间存在〜70ms的时间δ。然后,通常在1ms低于1ms,然后再次〜70ms间隙中遵循1-2个概念。我在PDF中附加了帧速率图。Grafh显示Avg。向主机30Hz报告频率,看起来像是真的。

me9atherion
离线
最后一次露面:2年1个月前
加入:2015-02-24 15:15
好。我收集

好。我在Timer0中断例程中删除了MEMS芯片的收集数据。现在Timer0 ISR执行时间非常短 - 4.5microseconds。看起来像平均数据包率现在根据Wireshark捕获统计信息(现在我有80Hz通知率和Wireshark统计信息,向我展示每秒80个报文),但报告速率是不稳定的。
在这些软件修改之后,通知数据包之间有许多非常短的时间Δ,在延迟和延迟〜70ms的延迟〜70ms之间。通知数据包应每10毫秒到达。
OS例程在DA14580应用程序中。调用发送通知分组以所需和稳定的频率执行。它可以在示波器上看到。将GattC_Send_evt_cmd发送到OS内核后,我放置了调试引脚切换例程。也许我错过的BLE堆叠中有一些同步例程?

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

为了测试目的,我试图删除所有传感器过滤。我现在只有Timer0,它产生100Hz的中断和更改全局标志。从HOOK#1 (app_async_trm())调用鼠标报告发送例程,它从Timer0中断检查标志并发送零鼠标报告,之前检查BLE缓冲区中的空闲空间和关键报告的连接状态。
然后我在调试输出时有100Hz(从低电平Gatt通知发送例程)。经过Hogpd Profile App_Asynch_trm()通过Hogpd Profile App_Asynch_Trm()返回“true”,因此再次调用Rwip_schedule()后。
Wireshark输出在一秒钟内显示大约100Hz的数据包率。但竞争不稳定。我仍然在具有非常低的Timedeltas(小于1ms,实际600-700ms)之间的数据包爆发之间获得了一个大的差距〜70ms。

mt_dialog.
离线
最后一次露面:2个月3天前
工作人员
加入:2015-06-08 11:34
嗨me9atherion,

嗨me9atherion,

您的假设是正确的,您不允许任何中断通过将低优先级设置为定时器中断,但也许在您的通信界面中有一些关键点,可以禁用您的中断,请您检查一下。还要确保在传感器中有数据时保持活动状态,这意味着需要开始阅读传感器时,您应该禁用睡眠。辅助请检查您的连接间隔,我假设您将间隔设置为小但确保主机接受此间隔,并且不会忽略您的设置。

谢谢mt_dialog.

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

感谢您的答复。

我根本不禁用项目中的中断。转动MEMS芯片I呼叫Force_WakeUp功能后。禁用睡眠模式,直到禁用计时器的鼠标报告。我甚至在App_init中使用睡眠迟到,以用于调试目的。连接间隔最小和最大值为7.5ms(6 * 1.25),如键盘参考项目。
我如何检查主机是否接受我的间隔?

me9atherion
离线
最后一次露面:2年1个月前
加入:2015-02-24 15:15
好。一个小更新。

好。一个小更新。
您已经指出检查由主机接受的延迟参数。据我所知,设备发送它的首选连接参数,但主机可能拒绝他们,并发送自己的连接参数。我启用了调试消息,现在我可以在linux主机的UART终端中看到这个:
Gap_le_create_conn_req_cmp_evt_handler () (56, 0, 42, 1)

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

正如我所理解的App_connection_func()随后通过主机在连接后更新连接参数,并且它的调试输出显示新的连接参数:
dbg_printf(dbg_all,“gap_le_create_conn_req_cmp_evt_handler()(%d,%d,%d,%d)\ r \ n”,
(int)param-> con_interval,
(int)param-> con_latency,
(int)param-> sup_to,
(int)param-> clk_aguracy
);

所以56 * 1.25 = 70ms -这是我在Wireshark捕获中看到的低延迟数据包之间的延迟。
主机是否根据调试输出拒绝我的连接延迟参数?

me9atherion
离线
最后一次露面:2年1个月前
加入:2015-02-24 15:15
我已经找到了解决办法。

我已经找到了解决办法。
这是我的错。在搜索代码内存减少解决方案时,我注释掉了USE_PREF_CONN_PARAMS_ON,并且不允许它返回。所以设备甚至没有发送它自己的更好的连接参数。
我还有一个关于连接参数更新超时的问题。有没有原因在40秒到主机以后更新它们?ichangeed此值为5秒,因为使用1second延迟Wireshark捕获,因此连接后不再交换更新参数报文。

mt_dialog.
离线
最后一次露面:2个月3天前
工作人员
加入:2015-06-08 11:34
嗨me9atherion,

嗨me9atherion,

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

谢谢mt_dialog.