0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

nRF5 SDK软件架构及softdevice工作原理

jf_14701710 来源:jf_14701710 作者:jf_14701710 2025-06-23 11:08 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

本文将介绍Nordic nRF5 SDK软件架构以及softdevice工作原理,以加深大家对Nordic产品开发的理解,这样开发过程中碰到问题时,大家也知道如何去调试。

如果你刚开始接触nRF5 SDK,建议先看一下这篇文章“Nordic nRF5 SDK和softdevice介绍”,以建立Nordic nRF5 SDK的一些基本知识。

首先说明一下,Nordic nRF5系列产品都是使用Flash存储器的,确切说,是嵌入式可执行代码的Flash存储器,也就是说,代码是可以直接在上面运行的,这个跟很多其他BLE厂商是不一样的(他们使用的是nand Flash,代码是不能直接在nand Flash中运行的,必须先装载到RAM中才能跑,所以你会发现这些厂商的RAM都非常大)。Nordic Flash是带cache机制的,以保证大部分代码执行速度可以达到64MHz,在cache失败的时候,等待周期也只有1个cycle,可以说Flash的执行速度和效率都是非常不错的。另外,Nordic芯片是纯Flash产品,里面没有其他NVM,所有非易失性数据都放在Flash中,包括蓝牙协议栈,这也是为什么Nordic蓝牙协议栈也可以OTA的根本原因所在。

Nordic nRF5 SDK将芯片的存储器划分成如下格局:

wKgZO2hYxSWAJt2sAAFiMpwkKk0969.png

Flash结构图 RAM结构图

从上图可知,Flash存储器最下面放的是softdevice(softdevice就是蓝牙协议栈,图中的MBR也属于softdevice的一部分),中间是application,最上面是bootloader(可选,只有需要OTA的时候,才需要下载bootloader)。这里需要特别指出的是,softdevice是以二进制形式提供给大家的,它占据了Flash的一块固定空间,起始地址为0,结束地址为APP_CODE_BASE。softdevice同时占用了RAM的一块固定空间,起始地址为0x20000000,结束地址为APP_RAM_BASE。Softdevice占用的Flash空间是固定不变的,运行时不可调节,也就是说APP_CODE_BASE是一个固定值,而softdevice占用的RAM空间是动态可调的,跟softdevice配置和蓝牙服务的多少有直接关联,所以APP_RAM_BASE一定要根据应用的实际情况进行调整。

这里说明一下, Softdevice不是以库的形式提供给大家,而是以二进制文件(hex文件)的形式提供给大家,这种方式可以带来很多好处。首先二进制形式可以保证蓝牙BQB认证的版本和发布给客户的版本一模一样(因为库形式的版本每次编译都会产生少许差异!)。其次softdevice不需要跟你的应用一起编译或者链接,大大节省调试时间,更主要的是,Softdevice运行在固定的Flash空间中,使用固定的RAM空间,从而与你的应用完全隔离开,实现了真正的模块分离,从而出现问题时,可以迅速定位是协议栈的问题还是应用的问题。再次二进制形式的 Softdevice开启了保护机制,应用代码是不能对其进行访问的,以保证Softdevice的安全性,防止应用代码误访问或者误擦除某些softdevice区域。最后这种多bin形式使得OTA变得非常灵活,你可以只OTA应用,也可以OTA协议栈和bootloader,或者三者同时OTA。

上面是站在芯片存储器角度来看nRF5 SDK的结构划分。如果站在软件架构角度,nRF5 SDK可以划分成如下结构图:

wKgZPGhYxSWAJqMoAABz86BryhI337.png

由上图可知,最下面是芯片本身,然后是ARM公司的CMSIS库,再往上就是协议栈softdevice和设备驱动,最后就是application和标准的蓝牙service了。softdevice是以二进制文件形式提供给大家的,除此之外,其他所有的SDK代码都是开源的,以方便大家开发。应用程序,包括SDK代码,都是通过softdevice API来与softdevice进行交互的,所有softdevice API都是以sd_打头的,比如:

sd_softdevice_enable(…);

sd_ble_gap_adv_start(…);

sd_flash_write(…);

sd_ppi_channel_assign(…);

Softdevice API有两种类型:

与BLE协议有关的API,比如sd_ble_gap_connect(),sd_ble_gatts_hvx()等。

外设操作API,比如sd_flash_write(),sd_power_gpregret_set()等。由于softdevice会使用到某些外设,应用程序也需要访问这些外设时,不能通过普通的外设驱动API去访问,必须通过softdevice API去访问。

如前所述,softdevice是以二进制文件形式提供给大家的,那么应用是如何做到可以成功调用softdevice API的?其实,softdevice是通过SVC中断和软中断来实现与应用程序交互的。每一个softdevice API对应一个SVC异常号(softdevice API是非阻塞的),也就是说,每当应用程序调用softdevice API,其实是产生一个SVC异常,然后进入到softdevice协议栈,由softdevice的SVC handler进行相应处理。示例代码如下所示:

wKgZO2hYxSaALgLwAADAj_7QTpE611.png

Softdevice API调用流程如下所示:

wKgZPGhYxSeAG11_AAEzD4gFasc956.png

每当softdevice完成相关重要操作,都会以事件形式通知应用程序的,比如与手机连接成功,softdevice就会把BLE_GAP_EVT_CONNECTED事件告知应用程序,那softdevice是如何把相关事件告知给应用程序的?这个是通过软中断来实现的。每当softdevice完成相关操作,就会把对应的事件放入一个队列中,然后触发一个软中断,以重新回到应用程序环境中,应用程序在相关软中断handler中查询该队列,一旦发现有事件在里面,就回调相关函数,比如ble_evt_handler,从而达到通知应用程序相关事件的目的。事件通知流程如下所示:

wKgZO2hYxSiAGYgOAAEt15-FhBc203.png

为了达到各个软件模块松耦合的目的,每个软件模块,比如广播模块,可以单独注册自己的BLE事件回调处理函数,然后在自己的事件回调处理函数里面只处理跟本模块有关的事件,与本模块无关的事件不进行处理而直接返回。这里需要注意两点:一虽然每个BLE事件回调处理函数只处理跟本模块有关的事件,但是它是可以捕获所有BLE事件的,你可以让整个应用程序只有一个BLE事件回调处理函数,但这样会让各个模块紧密地耦合在一起,因此Nordic SDK没有这么做,尤其是SDK14以后,各个模块都自己注册自己的蓝牙事件回调处理函数,完全跟用户代码切割开,同样如果用户代码需要捕获BLE事件的话,只需注册自己的BLE事件回调处理函数即可。二BLE事件是异步的,所以有时BLE事件回调处理函数会同时收到多个BLE事件,也就是BLE事件回调处理函数有可能在很短的时间内被调用多次(BLE事件回调处理函数每次只处理一个事件case,然后返回,所以短时间内会被调用多次),这个在开发的时候需要注意一下。

从上面nRF5 SDK软件架构的讲解过程中,我们可以看到,当我们开发Nordic平台的BLE应用时,主要需要做两件事:

第1件事:初始化。为了简化初始化工作,Nordic SDK所有模块初始化时,只需要将相应API输入结构体参数清0即可完成初始化工作,也就是说,只要你保证初始化参数为0,蓝牙协议栈就可以工作起来,这对很多Nordic初学者来说,大大减轻了开发工作量。

第2件事:写蓝牙事件回调处理函数。一般来说,你的应用逻辑都是放在蓝牙事件回调处理函数中,所以写好回调处理函数代码,你的开发工作就完成了大半了。

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • nRF5 SDK
    +关注

    关注

    0

    文章

    3

    浏览量

    2110
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    nRF Connect SDK(NCS)/Zephyr固件升级详解 – 重点讲述MCUboot和蓝牙空中升级

    编码如何解读?NCS可不可以进行单bank升级?可不可以把一个nRF5 SDK应用升级到NCS应用?MCUboot拷贝操作中的swap和overwrite有什么区别?为什么说MCUboot升级永远都不
    的头像 发表于 05-09 14:14 3010次阅读
    <b class='flag-5'>nRF</b> Connect <b class='flag-5'>SDK</b>(NCS)/Zephyr固件升级详解 – 重点讲述MCUboot和蓝牙空中升级

    Nordic nRF5 SDKsoftdevice介绍

    里?Softdevice帮助文档在哪里?如何选择某个SDK例子 (example) 以开始我们的BLE开发之旅?本文将对以上问题进行解答。 Nordic目前有2套完全独立的SDKnRF5
    的头像 发表于 08-20 09:54 2627次阅读
    Nordic <b class='flag-5'>nRF5</b> <b class='flag-5'>SDK</b>和<b class='flag-5'>softdevice</b>介绍

    如何调试nRF5 SDK

    本文将讲述Nordic nRF5 SDK的主要调试手段,以帮助大家快速定位问题,并解决问题。一般来说,你可以通过打log方式,IDE的debug模式,SDK自带的app_error_check函数
    发表于 04-26 23:13

    蓝牙空中升级(OTA)原理

    应用程序,以建立Nordic nRF5 SDK的一些基本知识,然后再往下看以下章节。 2. Nordic nRF5 SDK DFU工作原理
    发表于 07-21 14:50

    深度技术解析低功耗蓝牙厂商nordic的nRF Connect SDK裸机选项方案

    相同的通用工具链。对于仍在使用nRF5 SDK的开发者而言,由于两套SDK在API、架构工作流程上大同小异,裸机选项能够帮助开发者在无需重
    发表于 10-29 21:17

    深度技术解析nRF Connect SDK裸机选项方案

    nRF Connect SDK的裸机选项基于经过市场验证的SoftDevice,这是预构建的低功耗蓝牙协议堆栈,该协议堆栈为大多数nRF5 SD
    发表于 10-31 23:11

    nRF5芯片外设GPIO和GPIOTE介绍

    ,别的IO产生的port event就会被忽略。为此,在处理port event中断的时候,nRF5 SDK app_button模块将每个port event的极性设为toggle,也就是每进入一次
    发表于 02-22 16:38

    nRF5 SDK软件架构softdevice工作原理

    本文将介绍Nordic nRF5 SDK软件架构以及softdevice工作原理,以加深大家对N
    发表于 03-07 11:40

    nRF51822如何开发

    。S110_SoftDevice_Specification_v1.2.pdf (2.04 MB )nrf51_sdk_v5_2_0_39364.msi (26.39 MB )s110_nrf51822_6.0.0.zip (2
    发表于 05-21 04:35

    使用RTT-STUDIO开发​Nordic nRF5x系列MCU说明

    的,sTm32的架构架构如有相关的北欧开发板,欢迎添加北欧的芯片的bsp。Nordic nRF5x系列BSP目前支持的情况如下:主要支持功能支持官方softdevice的示例:ble_app_uart
    发表于 07-25 13:00

    怎么解决studio编译nrf52832 bsp示例程序启动softdevice错误的问题呢?

    /../../../../arm-none-eabi/bin/ld.exe: ./packages/nrf5x_sdk-v16.1.0/components/softdevice/common/nrf_sdh.o:D:\\SJ
    发表于 01-10 16:56

    怎么解决studio编译nrf52832 bsp示例程序启动softdevice错误的问题呢?

    /../../../../arm-none-eabi/bin/ld.exe: ./packages/nrf5x_sdk-v16.1.0/components/softdevice/common/nrf_sdh.o:D:\\SJ
    发表于 01-10 16:56

    Nordic Semiconductor最新nRF5 SDK推出安全的签名空中固件升级功能

    Nordic Semiconductor宣布其最新发布的nRF5 SDK v12.0支持安全的签名空中设备固件升级(OTA-DFU),可增强应用升级的安全性,通过使用安全的签名,在给定设备上确保使用经过验证的可信任来源进行应用更新,以防止可能有恶意的设备升级攻击。
    发表于 09-05 10:19 1779次阅读

    讲述Nordic nRF5 SDK的主要调试手段,以帮助大家快速定位问题

    nRF5 SDK日志打印功能是通过nRF_Log模块实现的(上面展示的日志都是通过nRF_Log打印出来的),SDK包含的大部分例子都自带打
    的头像 发表于 04-15 15:38 1.4w次阅读
    讲述Nordic <b class='flag-5'>nRF5</b> <b class='flag-5'>SDK</b>的主要调试手段,以帮助大家快速定位问题

    如何调试nRF5 SDK

    本文将讲述Nordic nRF5 SDK的主要调试手段,以帮助大家快速定位问题,并解决问题。一般来说,你可以通过打log方式,IDE的debug模式,SDK自带的app_error_check函数
    的头像 发表于 06-24 08:59 525次阅读
    如何调试<b class='flag-5'>nRF5</b> <b class='flag-5'>SDK</b>