⚠️
大家好. .感谢来到论坛。令人兴奋的消息!我们现在正在转移到新的论坛平台的过程中,它将提供更好的功能,并包含在主对话网站。所有的帖子和账号已经迁移。我们现在只接受新论坛的流量-请发布任何新的帖子在//www.xmece.com/support.我们会在接下来的几天修复bug /优化搜索和标记。
11个员额/ 0个新员额
最后发表
michael12344
离线
最后看到:2年3个月前
加入:2019-01-29福音23:17
外围BLE的例子

你好,

我目前正在使用BLE外设示例的一个修改版本来尝试用ADC采样信号。我基本上已经用从ADC而不是计数器读取值的代码替换了adc_adcval1_timer_cb_handler中的代码。我遇到的问题是调用adc处理器函数的时间。我需要采样我的信号在2000Hz或2000采样每秒。当我试图获得计时器在10毫秒或以下时,我得到断开连接和platform_reset_func函数在调用adc处理器几次后被调用。我已经尝试了应用程序简单定时器的例子已经使用,我也尝试了使用timer0回调方法。两者似乎都有同样的问题。我想知道是否有一些限制因素与代码或软件本身的时间,我没有意识到?还有什么类型的事情导致调用platform_reset func?

谢谢!

关键词:
设备:
CYibin
离线
最后看到:11个月3天前
工作人员
加入:2017-12-14 02:48
嗨,迈克尔,

嗨,迈克尔,

你能给我看一下你的源代码吗?

目前我可以确认的是,app_easy_timer API的时间单位是10ms,这在2Khz采样时是不合适的。

Br

CYibin

michael12344
离线
最后看到:2年3个月前
加入:2019-01-29福音23:17
我理解app_easy

我理解app_easy_timer不会让我到达2Khz采样。然而,即使当我使用app easy定时器的最低可能的时间单位10毫秒也不起作用。下面是使用app_easy_timer编辑的部分。当APP_PERIPHERAL_CTRL_TIMER_DELAY设置为2个时间单位时,它工作得很好,但在使用1后不久断开连接。

#define APP_PERIPHERAL_CTRL_TIMER_DELAY (1) void user_svc1_ctrl_wr_ind_handler(ke_msg_id_t const msgid, struct custs1_val_write_ind const *param, ke_task_id_t const dest_id, ke_task_id_t const src_id) {uint8_t val = 0;memcpy (val,参数[0]- >值,参数- >长度);if (val != CUSTS1_CP_ADC_VAL1_DISABLE) {adc_init(GP_ADC_SE, GP_ADC_SIGN, GP_ADC_ATTN3X);adc_usDelay (20);adc_enable_channel (ADC_CHANNEL_P00);timer_used = app_easy_timer (APP_PERIPHERAL_CTRL_TIMER_DELAY app_adcval1_timer_cb_handler);} else {adc_disable();if (timer_used != EASY_TIMER_INVALID_TIMER) {app_easy_timer_cancel(timer_used);timer_used = EASY_TIMER_INVALID_TIMER;}} void app_adcval1_timer_cb_handler() {struct custs1_val_ntf_ind_req *req = KE_MSG_ALLOC_DYN(CUSTS1_VAL_NTF_REQ, prf_get_task_from_id(TASK_ID_CUSTS1), TASK_APP, custs1_val_ntf_ind_req, DEF_SVC1_ADC_VAL_1_CHAR_LEN); // ADC value to be sampled static uint16_t sample __attribute__((section("retention_mem_area0"), zero_init)); sample = adc_get_sample(); //req->conhdl = app_env->conhdl; req->handle = SVC1_IDX_ADC_VAL_1_VAL; req->length = DEF_SVC1_ADC_VAL_1_CHAR_LEN; req->notification = true; memcpy(req->value, &sample, DEF_SVC1_ADC_VAL_1_CHAR_LEN); ke_msg_send(req); if (ke_state_get(TASK_APP) == APP_CONNECTED) { // Set it once again until Stop command is received in Control Characteristic timer_used = app_easy_timer(APP_PERIPHERAL_CTRL_TIMER_DELAY, app_adcval1_timer_cb_handler); } }

这里是使用timer0而不是app_easy_timer编辑的部分,应该能够更快的采样2Khz。然而,当timer0设置为或低于10ms间隔时,我将获得与使用app_easy_timer时相同的断开连接和调用platform_reset_func。在这里,间隔被设置为20毫秒,它工作得很好。但是,如果您将RELOAD更改为1000 (5ms),它将断开连接并调用platform_reset_func。在这两个示例中,user_cust1_implc的其余部分是相同的。

#定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义;定义:MSCPY(&val,&val,&val,&val,&val,&val,&val,&P,&参数值值,&参数值,&参数值,&参数值值值值,写写写写写写。写写写。写。写写。写写。写写。写。写。写。写。写。写。写。写。写。写。写。写。写。写。写。写。写。写。写。写。写。写。写。写N3X)(20)adc(20)adc(20)adc(20)adc(20)adc(20)adc(20)adc(20)adc(20)adc(20)adc(20)adc(20)adc(8)adc(8)adc(8)adc(8)adc(8)adc(8)adc(8)adc(0)时钟停止)计时器(0)注册)回调(回调)计时器(回调)时间0(注册)回调(回调)时钟(回调)时钟)回调(回调(10(10)时钟)回调)回调(回调(10)回调(应用程序)计时器(app)计时器(1(1)计时器)计时器)计时器(1)计时器(1)定时器)计时器(计时器)的回调)的回调)的回调(定时器)的回调(1。回调)的回调)计时器(1。定时器)计时器的回调(1。定时器)计时器的回调)计时器(1。定时器的回调)计时器的回调)的回调)的回调(1。计时器K_div_BY_10)timer0_set_pwm_on_counter(RELOAD)//Enable SWTIM_IRQn irq timer0_Enable_irq()//Start timer0 timer0_Start()}否则{set_tmr_Enable(CLK_PER_REG_tmr_DISABLED);adc_disable()}void app adcval1_timer_cb处理器(){struct custs1_vall_ntf ntf ind req*req=KE_MSG_ALLOC_vall(从custid任务中获取custid(,TASK_APP,custs1_val_ntf_ind_req,DEF_SVC1_ADC_val_1_CHAR_LEN)//待采样的ADC值静态uint16_t sample_属性_uuu((节(“保留区”),zero_init));sample=ADC_get_sample()//req->conhdl=APP env->conhdl->conhdl->conhdl->conhdl->handle ADC=SVC1_IDX_val_val_val_val_val\u val;req长度=ADC_1_CHAR真正通知(请求->值与样本,定义值与字符;发送消息(请求)}

谢谢!

michael12344
离线
最后看到:2年3个月前
加入:2019-01-29福音23:17
为了避免

为了避免误解,user_custs_impl文件之外的项目其余部分是SDK中的外围Bluetooth低能耗示例。

CYibin
离线
最后看到:11个月3天前
工作人员
加入:2017-12-14 02:48
嗨michael12344,

嗨michael12344,

导致断开连接的原因是向SDK概要文件发送通知命令的频率太高。

您应该首先存储ADC采样产生的数据,然后以较低的频率发送它们。

Br

CYibin

michael12344
离线
最后看到:2年3个月前
加入:2019-01-29福音23:17
你好,

你好,

有什么办法可以解决这个问题吗?如果数据可以连续输出,而不是收集所有的样本然后发送数据,那将是更理想的。有没有其他更好的发送/接收数据的方法,或者可以按照我的要求频繁或接近频繁地进行?

谢谢

PM_Dialog
离线
最后看到:1周4天前
工作人员
加入:2018-02-08 11:03
嗨michael12344,

嗨michael12344,

Τhe platform_reset_func()由platform_reset()调用,是一个由ROM代码实现的函数。产生此断言的最可能的原因是内存不足,因为您可能试图分配从未使用过的消息。例如,如果您正在分配通知消息,并且您有一个小的连接间隔,那么消息将被堆起来直到连接事件到达,但是如果连接间隔较大,则在连接事件到达之前就会耗尽内存。您使用的连接间隔是什么?

谢谢,PM_Dialog

michael12344
离线
最后看到:2年3个月前
加入:2019-01-29福音23:17
你好,

你好,

连接间隔是在外围设备还是中心设备上设置的?我在user_peripheral.c和user_config.c中发现了以下内容,它们似乎设置了10ms到20ms的最小和最大连接间隔。

Void user_app_connection(uint8_t connection_idx, struct gapc_connection_req_ind const *param) {if (app_env[connection_idx]. conf);conidx != GAP_INVALID_CONIDX) {app_connection_idx = connection_idx;//停止广告数据更新定时器app_easy_timer_cancel(app_adv_data_update_timer_used); //停止广告数据更新定时器app_easy_timer_cancel(app_adv_data_update_timer_used);//检查已建立连接的参数是否为首选参数。//如果没有,则调度一个连接参数更新请求。如果((param - > con_interval < user_connection_param_conf.intv_min) | | (param - > con_interval > user_connection_param_conf.intv_max) | | (param - > con_latency ! = user_connection_param_conf.latency) | | (param - > sup_to ! = user_connection_param_conf.time_out)){/ /连接参数都不是这些,我们预计app_param_update_request_timer_used =app_easy_timer (APP_PARAM_UPDATE_REQUEST_TO param_update_request_timer_cb);}} else{//未建立连接,重新启动广告user_app_adv_start();} default_app_on_connection (connection_idx参数);}
static const struct connection_param_configuration user_connection_param_conf ={///双槽最小连接间隔(1.25ms) ///使用宏MS_TO_DOUBLESLOTS从毫秒(ms)转换为双槽。intv_min = MS_TO_DOUBLESLOTS(10),///使用宏MS_TO_DOUBLESLOTS从毫秒(ms)转换为双槽。intv_max = MS_TO_DOUBLESLOTS(20), ///连接事件测量的延迟。Latency = 0,//使用宏MS_TO_TIMERUNITS将监控超时时间从毫秒(ms)转换为计时器单位。///使用宏MS_TO_DOUBLESLOTS从毫秒(ms)转换为双槽。ce_len_min = MS_TO_DOUBLESLOTS(0),//使用宏MS_TO_DOUBLESLOTS从毫秒(ms)转换为双槽的最大连接事件持续时间。ce_len_max = MS_TO_DOUBLESLOTS(0),};

PM_Dialog
离线
最后看到:1周4天前
工作人员
加入:2018-02-08 11:03
嗨michael12344,

嗨michael12344,

可以把连接间隔(.intv_min和.intv_max)改大一点吗?

谢谢,PM_Dialog

michael12344
离线
最后看到:2年3个月前
加入:2019-01-29福音23:17
你好,

你好,

我尝试将intv_min和intv_max改为更大的值30-45ms和100-160ms。然而,由于仍然调用platform_reset_func(),这个问题似乎仍然存在。还有什么方法可以提高数据吞吐量吗?

PM_Dialog
离线
最后看到:1周4天前
工作人员
加入:2018-02-08 11:03
嗨michael12344,

嗨michael12344,

在您的应用程序中,可能会在每次连接后出现某种内存泄漏堆积。当wrap_platform_reset()发生时,请确保错误代码是RESET_MEM_ALLOC_FAIL,为了找到它,您必须调试它。此外,检查在ADC读取期间是否发送了任何挂起的消息,并确保正在使用在处理消息时获得的消息,或者正在分配应该释放它们的数据。例如,如果你取样ADC,你分配消息,以便在有一个连接时通过通知发送数据,设备最终将耗尽内存,如果设备耗尽内存,这将导致设备重置。尝试从da1458x_config_advanced定义并增加DB_HEAP_SZ,例如,您可以将值设置为2048。

谢谢,PM_Dialog