嗨,对话支持。
我对DA14580设备使用SDK 5.0.3。该设备在中央扫描模式下工作,应该报告所有广告消息。该设备始终处于运行模式,不进入任何睡眠模式。
一段时间后,应用程序停止接收广告报告。
我对每个报告使用IO切换来确定这种情况。我并没有成功地找到故障的原因,因为任何断点或调试暂停都会导致恢复正常运行。
此问题的重要原因是当前任务的缺勤中断。
当我使用带空手柄的计时器时,这会修复问题。
我发现了同样的东西,我想:
https://support.dialog-semiconductor.com/forums/post/dialog-smartbond-bl...
你能帮我了解一下情况吗?
报告功能是:
无效应用程序adv报告ind func(结构gapm adv报告ind const*参数)
{
GPIO_设置激活(橙色LED_端口、橙色LED_引脚);
__nop();
__nop();
__nop();
__nop();
GPIO_设置不活动(橙色LED_端口、橙色LED_引脚);
回来
}
扫描参数为:
静态常量结构扫描\配置用户\扫描\配置={
///操作代码。
.code=GAPM\u扫描\u被动,
///拥有设备的BD地址源
.addr\u src=GAPM\u PUBLIC\u addr,
//扫描间隔
.interval=应用程序扫描时间窗口毫秒,
//扫描窗口大小
.window=应用程序扫描时间窗口毫秒,
///扫描方式
.mode=间隙\观察者\模式,
///扫描筛选策略
.filt\u policy=SCAN\u ALLOW\u ADV\u ALL,
///扫描重复筛选策略
.filter\u duplic=扫描\u FILT\u duplic\u DIS
};
设备:
嗨,瓦迪姆,
首先,您不必从无效函数返回,因为您在观察者模式下扫描,除非您取消操作,否则扫描不会停止(因此请检查您是否在某个点取消扫描)。如果您收到或没有收到广告报告,您是否决定检查led开关?我这样问是因为眨眼的速度太快,看不到任何东西,不过,你可以通过打印指示来检查你是否得到广告指示(请确保它非常短,因为打印太多数据可能会由于内存分配过多而导致重置,因为您也在打印时禁用了重复项过滤器),此外,如果您有专业开发工具包,您可以检查设备是否正在扫描,并且可以放置arch_set_pxact_gpio()函数在.app_on_adv_report_ind回调中运行,并检查光标是否出现在power profiler上。另外,请确保您尝试跟踪的任何设备都确实是广告。
我不知道你用了什么样的定时器,问题已经解决了,如果你能提供一些额外的细节,也许我能理解发生了什么。
谢谢你的对话
您好,亲爱的支持。
1.根据《虚空归来》:你是绝对正确的。它仍然来自真实的项目代码,并且不应该干扰函数的执行。
2.根据LED闪烁,你也完全正确。我不使用真正的LED,但使用连接到pin的示波器。如果你注意到,我不会抱怨它根本不工作。
3.我没有专业开发工具包。
4.我的空间中至少有5-10台BLE设备,每100毫秒做一次广告。
5.我没有看到我使用GAPM\U RESET\U CMD或GAPM\U CANCEL\U CMD。添加计时器后,设备不会停止运行。
6.我用的是空着身子的计时器。通过定时器,设备不会停止接收广告报告。
我还注意到,当接收挂起时,我在UART中询问了一些问题(在实际项目中,我使用UART通信,例如keepalive命令),设备将恢复正常运行。在代码中添加任何断点也会使设备恢复正常运行-这是调试非常困难的原因,我使用IO来理解发生了什么。
我用的是空着身子的计时器。当我使用定时器时,设备不会停止接收广告报告。
使用的计时器:
int app_led_指示_处理器(ke_msg_id_t const msgid,
const struct app_led_indication_evt*param,
KEU task\u id\u t const dest\u id,
ke_任务id_t常量src_id)
{
KEU定时器设置(应用程序LED指示灯定时器,任务应用程序,1000);
返回(已消耗的热量);
}
你好,瓦迪姆。
此外,我错误地按了网站按钮“接受此答案。如果您觉得答案有用,请单击此链接”。
现在,我无法取消这个操作。通常,有办法取消操作或确认问题。
谢谢
嗨,瓦迪姆,
抱歉,无法撤消接受答案。
关于你的问题,我找不到你的计时器是空的这一事实与阻止设备停止报告被扫描的广告字符串之间的任何关系,这似乎有点奇怪,即使设备在某个点停止扫描,并且计时器在点击时将其唤醒,它应该触发一个功能,以便启动设备再次启动扫描,您是否有其他设备要测试?至少在我这方面,我可以测试观察者模式,但我看不到它停止(当您看到设备不再报告时,是否有时间限制?例如,特定的秒数、分钟数甚至小时数?)。如果你看到fw停止报告广告字符串,我会怀疑该设备出于某种原因停止扫描,因为你没有用于附加智能代码段的pro工具包(这对调试类似的东西会有很大帮助),我会检查该设备是否正在扫描,为了做到这一点,您可以在每次接收中断时切换GPIO,因此通过应用以下代码段,您将能够跟踪BLE扫描的每个结束:
uint8应用程序最后一次可执行事件;
枚举arch\u main\u loop\u callback\u ret user\u on\u ble\u powered(无效)
{
uint8临时最后一次事件;
temp_last_ble_event=arch_last_rwble_evt_get();
if(应用程序最后一次可执行事件!=临时最后一次可执行事件)
{
app_last_ble_event=temp_last_ble_event;
如果(应用程序最后一次可执行事件==可执行事件结束)
arch_set_pxact_gpio();
}
返回GOTO_睡眠;
}
还可以在扫描整个回调时跟踪应用程序,并检查它是否在某个时候被调用。
谢谢你的对话