社区导航

 

搜索
查看: 1770|回复: 0

[BLE(低功耗蓝牙)] BlueNRG-1/2 Flash 操作需要与BLE事件互斥问题

[复制链接]

28

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2020-4-9 12:08 | 显示全部楼层 |阅读模式

      当使用BlueNRG-1/2本身的 Flash 存储数据应用数据时,可能遇到蓝牙没有信号,或者是死机了等问题。

因为在擦除一页的过程中,中断会被关掉大概 20 ms,在擦除期间,radio 中断是被关掉了的,整个 radio 的状态被延时或者整个 RF 部分的状态被破坏。ST SDK 虽然提供了访问 Flash Demo(BLE_Beacon_FlashManagement),但是当多个 Flash 操作时,与蓝牙事件互斥就比较难处理了,特别是对于一些应用多连接或者同时用了主从,多种蓝牙事件的场景,互斥就显得更麻烦了。

为了优化这个问题, 方便用户操作 Flash,不让应用考虑互斥蓝牙事件,下面是我的做法,供参考:

 

       使用一个双向链表来管理 Flash 操作(Flash 擦除或者是 Flash 写,Flash 读无需和 BLE 相关事件互斥),和使用一个双向链表来管理空余时间状态。在空余的时间执行 Flash 操作。 datasheet 可以知道,操作 Flash,特别是擦除时,会占用比较多的时间。为了避免操作 Flash 占用过多的时间片,把每次写或 者擦除 Flash,用一个列表来管理,每次写或者擦除操作,插入Flash 操作链表的最后。 在主循环中检测是否有足够的时间写,如果当前空闲的时间,如果空闲的时间足够,取出 Flash 操作链表中最前的一个节点,执行 Flash 操作,然后将节点移除。


      对于如何检测空闲时刻,也用一个链表来管理空闲时刻。首先,初始化时需要设置 radio active 事件抛到应用
      aci_hal_set_radio_activity_mask(0x0001|0x0002|0x0004|0x0008|0x0010|0x0020);
      设置之后,重写函数 aci_hal_end_of_radio_activity_event,当有事件触发时,就会进入这个函数,然后在这个函数里面管理空闲链表。

      对于何时写Flash, 主循环中有个 Flash 操作的调度函数,不停的调度是否有数据需要写入。 Flash 操作的调度函数中,主要做两件事情,一个是把空闲时间计算出来给到底层的 Flash 操作链表调度中。另一个是移除过期的节点。如果空闲时间足够,就从需要操作的Flash任务链表中取出一个任务执行。

实际代码可以参考GitHub工程:https://github.com/wallekuang/BlueNRG_Demo



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

关闭

站长推荐上一条 1/8 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2020-5-29 10:59 , Processed in 0.094236 second(s), 20 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表