我无法获得稳定的HID报告率为惯性鼠标/键盘应用。
upd.:主题问题从3-D主题消息开始。
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”部分(链接器警告)。我试图填写此部分,因为它从代码(将一些零init变量放到本节中),但它也不是工作。
那么我如何正确禁用此功能并释放一些内存?请帮忙。
我将试着自己回答。
据我所知,我想我找到了解决方案。在评论CFG_PRF_Spotar时,参考项目中有备用DB堆大小(大约400bytes较低的值)声明,因此禁用Spotar功能。当我将其更改为默认状态时,使用Spotar Featerne on - 应用程序工作。
但我还有关于鼠标HID报告频率的另一个问题。正如我所说,我的参考点是键盘项目,我修改了它的代码,因为这个项目需要某种齐全的键盘。我添加了另一个鼠标HID报告通道实例,并可以通过请求消息Hogpd_report_upd_req将鼠标报告抛出到task_hogpd。问题是,鼠标包传输速率低(我认为我做错了什么),传输频率不是恒定的。
我要做鼠标报告的架构如下:
1)如果App确定L或R鼠标按钮按事件,它会使用加速度计解析频率(我想要100Hz)配置Timer0;
2) Timer0处理程序从加速度计获取数据并调用鼠标惯性滤波器更新。然后它接收到新的鼠标增量。这些增量然后安全地(饱和)添加到XY增量缓冲区,以积累新的增量,直到下一次传输;
3)鼠标HID报告从App_Asynch_trm()(挂钩#1)发送 - 键盘报告传输也来自参考设计。仅当有鼠标按钮事件时才会传输鼠标HID报告,或者累计缓冲区中是否存在非零x或y delta。在其他情况下,鼠标报告不会发送到内核。
我有调试GPIO引脚,每次生成新报告时都会触发。在鼠标报告函数中使用Hogpd_report_upd_req ke_msg_send(req)之后,将此GPIO触发呼叫放置。我可以在示波器上看到,在运动中,ke_msg_send()称为所需频率。因此,就我了解蓝牙连接的另一边(主机)的操作系统应该以相同的频率获取此报告。豪夫,它不是那么。传输频率不稳定,在100Hz时,我也会突然断开连接。我认为这些断开连接由蓝牙堆栈本身启动,因为我在断开事件回调中获得断点,而不是断开的参考应用程序的例程。70Hz足以保持连接直播,无突然断开,但报告频率稳定性差。
我通过使用另一个微控制器(也是Cortex-M0)和相同的MEMS芯片,从测试板开发并移植了惯性鼠标过滤算法。该板非常适合调试惯性鼠标藻类术。具有100Hz频率的鼠标报告数据流被uart馈送到主计算机。然后,Python脚本将此流直接转换为OS调用的鼠标运动。据我所知,100Hz是足够的频率,以便舒适的鼠标用户反馈。对话框的鼠标参考应用程序还利用了100Hz的鼠标报告速率。
那么我需要做什么来得到稳定的鼠标报告流?
拜托,我需要一些帮助来解决这个问题。
支持。请。我对任何关于这种不稳定鼠标报告率的可能案例的信息都非常高兴。
嗨me9atherion,
确保在从传感器中处理数据时不禁用中断,没有原因刚刚断开连接,也许您正在禁用中断或从传感器读取数据时,并且当它为BLE发送时间来发送时由于禁用中断而导致的连接间隔失败。还要确保在缓冲区中的数据可用时,请在App_Asynch_trm和app_asynch_proc中继续发送数据,并且如果有更多的数据以调用调度程序,则返回true。除了鼠标ref设计之外是一个相当偏好的榜样。
谢谢mt_dialog.
谢谢你的回复。
我不禁用中断。然而,大约1.7ms(100Hz所需的Timer0中断处理程序期间的10ms)花费在Timer0 Handlack例程中。
但是,在Timer0初始化例程中有:
NVIC_SetPriority (SWTIM_IRQn 3);/* set Priority for TIM0 Interrupt to the lowest */设置TIM0中断优先级为最低*/
因此,据我所知,而定时器具有最低优先级,并且不应影响更高级别的BLE堆栈中断。可能是我做错了假设吗?
从HOOK#1发送鼠标报告的代码利用了检查低级缓冲区,就像键盘报告一样:
if(app_kbd_check_conn_status()&& l2cm_get_nb_buffer_available()){
send_mouse_keyreport()
}
我还在prf_server_send_event(...)中将调试引脚切换例程转到低级OS调用,以查看如何直接请求操作系统以在从更高级别请求到Hogpd配置文件的所有回调后发送通知。这些呼叫的频率是我需要的。
我也尝试调试蓝牙流与wireshark在linux。wireshark捕获输出会有较大的时间增量。两个通知之间通常有70毫秒的时间差值。然后通常有1-2个通知,时间增量低于1ms,然后又有~70ms的差距。我附上了PDF格式的帧率图表。图形显示平均报告频率主机30Hz,看起来像真的。
好。我在Timer0中断例程中删除了从mems芯片收集数据。现在Timer0 ISR的执行时间非常短- 4.5微秒。看起来平均包速率现在是根据wireshark捕获统计(现在我有80Hz通知速率和wireshark统计显示我大约80包每秒),但报告速率是不稳定的。
在这些软件修改后,通知包之间有许多非常短的时间差值,小于1ms,每个5-6包之间有延迟~70ms的间隔。通知包应每10毫秒送达。
DA14580 app.中发送通知报文调用的操作系统例程以期望的稳定频率执行。可以在示波器上看到。我放置调试引脚切换例程后发送gattc_send_evt_cmd操作系统内核。也许有一些同步例程在BLE堆栈,我错过了?
有关测试目的,我试图删除所有传感器过滤。我现在只有Timer0,它会产生100Hz中断并更改全局标志。鼠标报告发送例程从挂钩#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。
嗨me9atherion,
您的假设是正确的,您不允许任何中断通过将低优先级设置为定时器中断,但也许在您的通信界面中有一些关键点,可以禁用您的中断,请您检查一下。还要确保在传感器中有数据时保持活动状态,这意味着需要开始阅读传感器时,您应该禁用睡眠。辅助请检查您的连接间隔,我假设您将间隔设置为小但确保主机接受此间隔,并且不会忽略您的设置。
谢谢mt_dialog.
谢谢你的回复。
我根本不禁用项目中的中断。转动MEMS芯片I呼叫Force_WakeUp功能后。禁用睡眠模式,直到禁用计时器的鼠标报告。我甚至在App_init中使用睡眠迟到,以用于调试目的。连接间隔最小和最大值为7.5ms(6 * 1.25),如键盘参考项目。
如何检查主机是否接受我的间隔?
好。一点更新。
您已经指出,检查主机的延迟参数接受。据我所知,设备发送它的优先连接参数,但主机可以彻底泄露它们并发送自己的连接参数。我启用了调试消息,现在我可以在UART终端中查看Linux主机:
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()用于在连接后通过Host更新连接参数,它的调试输出显示新的连接参数:
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)参数- > sup_to,
(int)参数- > clk_accuracy
);
所以56 * 1.25 = 70ms - 这是我在Wirshark在非常低延迟数据包之间突发之间看到的延迟。
主机恢复我的连接延迟参数是否正确以调试输出?
我找到了解决方案。
这是我的错误。我正在评论使用_pref_conn_params_on,而我正在搜索代码内存递减解决方案,并且不允许它。所以设备甚至没有发送它自己的预处理参数。
我还有一个关于连接参数更新超时的问题。有什么理由在连接到主机40秒后更新它们吗?icchanged这个值为5秒,因为1秒延迟Wireshark捕获显示没有更新参数的数据包在连接后交换。
嗨me9atherion,
很高兴您发现了这个问题,延迟连接参数的原因是为了确保主机已经完成了参数的发送,并为安全起见。
谢谢mt_dialog.