你好,
我目前正在使用BLE外设示例的一个修改版本来尝试用ADC采样信号。我基本上已经用从ADC而不是计数器读取值的代码替换了adc_adcval1_timer_cb_handler中的代码。我遇到的问题是调用adc处理器函数的时间。我需要采样我的信号在2000Hz或2000采样每秒。当我试图获得计时器在10毫秒或以下时,我得到断开连接和platform_reset_func函数在调用adc处理器几次后被调用。我已经尝试了应用程序简单定时器的例子已经使用,我也尝试了使用timer0回调方法。两者似乎都有同样的问题。我想知道是否有一些限制因素与代码或软件本身的时间,我没有意识到?还有什么类型的事情导致调用platform_reset func?
谢谢!
关键词:
设备:
嗨,迈克尔,
你能给我看一下你的源代码吗?
目前我可以确认的是,app_easy_timer API的时间单位是10ms,这在2Khz采样时是不合适的。
Br
CYibin
我理解app_easy_timer不会让我到达2Khz采样。然而,即使当我使用app easy定时器的最低可能的时间单位10毫秒也不起作用。下面是使用app_easy_timer编辑的部分。当APP_PERIPHERAL_CTRL_TIMER_DELAY设置为2个时间单位时,它工作得很好,但在使用1后不久断开连接。
这里是使用timer0而不是app_easy_timer编辑的部分,应该能够更快的采样2Khz。然而,当timer0设置为或低于10ms间隔时,我将获得与使用app_easy_timer时相同的断开连接和调用platform_reset_func。在这里,间隔被设置为20毫秒,它工作得很好。但是,如果您将RELOAD更改为1000 (5ms),它将断开连接并调用platform_reset_func。在这两个示例中,user_cust1_implc的其余部分是相同的。
谢谢!
为了避免误解,user_custs_impl文件之外的项目其余部分是SDK中的外围Bluetooth低能耗示例。
嗨michael12344,
导致断开连接的原因是向SDK概要文件发送通知命令的频率太高。
您应该首先存储ADC采样产生的数据,然后以较低的频率发送它们。
Br
CYibin
你好,
有什么办法可以解决这个问题吗?如果数据可以连续输出,而不是收集所有的样本然后发送数据,那将是更理想的。有没有其他更好的发送/接收数据的方法,或者可以按照我的要求频繁或接近频繁地进行?
谢谢
嗨michael12344,
Τhe platform_reset_func()由platform_reset()调用,是一个由ROM代码实现的函数。产生此断言的最可能的原因是内存不足,因为您可能试图分配从未使用过的消息。例如,如果您正在分配通知消息,并且您有一个小的连接间隔,那么消息将被堆起来直到连接事件到达,但是如果连接间隔较大,则在连接事件到达之前就会耗尽内存。您使用的连接间隔是什么?
谢谢,PM_Dialog
你好,
连接间隔是在外围设备还是中心设备上设置的?我在user_peripheral.c和user_config.c中发现了以下内容,它们似乎设置了10ms到20ms的最小和最大连接间隔。
嗨michael12344,
可以把连接间隔(.intv_min和.intv_max)改大一点吗?
谢谢,PM_Dialog
你好,
我尝试将intv_min和intv_max改为更大的值30-45ms和100-160ms。然而,由于仍然调用platform_reset_func(),这个问题似乎仍然存在。还有什么方法可以提高数据吞吐量吗?
嗨michael12344,
在您的应用程序中,可能会在每次连接后出现某种内存泄漏堆积。当wrap_platform_reset()发生时,请确保错误代码是RESET_MEM_ALLOC_FAIL,为了找到它,您必须调试它。此外,检查在ADC读取期间是否发送了任何挂起的消息,并确保正在使用在处理消息时获得的消息,或者正在分配应该释放它们的数据。例如,如果你取样ADC,你分配消息,以便在有一个连接时通过通知发送数据,设备最终将耗尽内存,如果设备耗尽内存,这将导致设备重置。尝试从da1458x_config_advanced定义并增加DB_HEAP_SZ,例如,您可以将值设置为2048。
谢谢,PM_Dialog