6295|0

51

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

BlueNRG-1/2 Flash 操作需要与BLE事件互斥问题 [复制链接]

 

      当使用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

点赞(2) 关注
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表