nrf connect sdk(v2.3.0)在含定时器的BLE开发中出现的notify卡死问题

假如你所开发的BLE项目出现了用nrf connect这个app来连接nordic蓝牙,read方法可以读取,但是notify出现了:

   在使用工作队列的情况下:

        1.第一次点击notify enable按钮只能读取1-2个数据

        2.第二次点击notify enable按钮可以读到几秒到几十秒数据(随蓝牙信号强度而变化),然后卡死

    在只用定时器的情况下:

        KERNEL报错,自动reset

那么,很有可能,你是遇到了本问题.

问题出现的原因是nrf connect sdk自身的bt_gatt_notify_cb()函数有bug,

该函数底层调用了bt_conn_tx()函数,使得它在conn层发送的时候,调用了下面的函数:

	return k_fifo_get(&free_tx, K_FOREVER);

这个函数会在free_tx这个FIFO里以阻塞方式(K_FOREVER)读取数据.你的定时器可能会在其读数据前打断,并塞入新数据.

请注意,问题根源并不在于有些人所说的线程死锁,而是FIFO本身存储空间太小,要发送的包只能存储三个(BT_CONN_TX_MAX默认设置为3),导致您:

1.第一次要发的包过多,FIFO只能存储前三个,k_fifo_get()函数想要读取FIFO超过三次来发送,而导致阻塞.

2.后面有几次发包被定时器打断,导致送给FIFO存储的包大于三个,但是FIFO只能存三个,k_fifo_get()函数想要读取FIFO超过三次来发送,导致阻塞.

在只有定时器的情况下(即中断处理时运行),则会导致崩溃.

解决方法:

方法1:设置CONFIG_BT_CONN_TX_MAX=255[力大砖飞]

方法2:多线程,在另一个线程中进行bt_gatt_notify_cb()[不建议,线程lock与resume需要时间]

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
截至到目前的最新sdk版本v2.3.0 nRF24lu1+与nRF24le+示例代码目录如下: D:. ├─Docs ├─precompiled_hex │ └─keil └─source_code ├─compiler │ ├─c51 │ ├─common │ └─icc8051 ├─gazell │ ├─common │ ├─nrf24le1 │ └─nrf24lu1 ├─hal │ ├─nrf24l01p │ ├─nrf24le1 │ └─nrf24lu1p ├─lib │ ├─adns7530 │ ├─assertions │ ├─crypt │ ├─display │ ├─eeprom │ ├─eeprom255 │ └─rf_test ├─lint └─projects └─nrfgo_sdk ├─adc_examples │ ├─adc_continuous_mode │ │ └─keil │ └─adc_single_step_mode │ └─keil ├─bootloader_32k │ ├─firmware │ │ └─keil │ └─host_applications │ └─bootlu1p_linux ├─display_joystick_example │ └─keil │ ├─build │ └─lst ├─enhanced_shockburst_examples │ ├─prx │ │ └─Keil │ │ ├─nRF24le1 │ │ └─nRF24lu1p │ └─ptx │ └─Keil │ ├─nRF24le1 │ └─nRF24lu1p ├─gazell_configuration_tool │ └─keil ├─gazell_examples │ ├─gzll_device │ │ └─keil │ │ ├─nRF24le1 │ │ └─nRF24lu1p │ ├─gzll_device_ack_payload │ │ └─keil │ │ └─nRF24le1 │ ├─gzll_device_w_dynamic_pairing │ │ └─keil │ ├─gzll_device_w_power_management │ │ └─keil │ ├─gzll_host │ │ └─keil │ │ ├─nRF24le1 │ │ └─nRF24lu1p │ │ ├─build │ │ └─lst │ ├─gzll_host_ack_payload │ │ └─keil │ │ └─nRF24le1 │ ├─gzll_host_w_dynamic_pairing │ │ └─keil │ │ ├─nRF24le

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值