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

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

3天内不再提示

简谈BlueNRG-LP和-LPS的代码空间优化

STM32单片机 来源:STM32单片机 2023-11-15 14:08 次阅读

01

引言

客户在使用 BlueNRG-LP/LPS 芯片时,增加 OTA 服务后常常反馈说,编译代码区域超空间了,需要帮忙优化一下。后文主要通过下列步骤进行分析和优化 BlueNRG-LP/LPS 的代码空间:

a. 通过分析 BlueNRG-LP/LPS 的 OTA 方式,让客户可以选择合适的方式;

b. 通过整体分析 BlueNRG-LP/LPS 的链接文件(*.icf/*.sct/*.ld)了解默认工程的存储分布;

c. 通过裁剪协议栈,选择合适的协议栈功能,优化 BlueNRG-LP/LPS 的代码空间;

d. 通过使用静态协议栈,进一步优化 BlueNRG-LP/LPS 的代码空间;

e. 其他方案;

总的来说通过两个维度来节省空间:一个是协议栈的裁剪维度:主要是通过修改宏配置实现编译对应应用需要的协议栈。另一个是 OTA 和静态协议栈的维度:OTA 和静态协议栈的选择流程图如下图所示

072e98dc-837d-11ee-939d-92fbcf53809c.jpg

02

BlueNRG-LP/BlueNRG-LPS的OTA

2.1 OTA 的框架

手机或者电脑做 GATT Client,给带 OTA 服务的设备升级。

07420b7e-837d-11ee-939d-92fbcf53809c.jpg

2.2 官方提供的 OTA 方式

默认提供的 OTA 应用和协议栈编译在一个固件上。

a. 不带备份的(右图中的右半部分)

升级服务程序在 Boot 端(OTA Service manager)。

省空间(存放了 2 份协议栈,1 份应用)

管理简单(只需管理一份应用)

b. 带备份的(右图中的左半部分)

升级服务程序在应用端

更消耗空间(存放了 2 份协议栈,2 份应用)

管理稍微麻烦(需要管理两份应用,Lower 区域应用不能放置 Higher 区域运行)

更安全

0753a3ac-837d-11ee-939d-92fbcf53809c.jpg

a. 不带备份的方式由以下组件构成:

BLE_OTA_ServiceManager+ application

b. 带备份的由以下组件构成:

BLE_OTA_ResetManager +Lower Application (with BLE OTA service) orBLE_OTA_ResetManager + Higher Application (with BLE OTA service)

对应在 SDK 中工程和配置如下图所示:

a.BLE_OTA_ServiceManager 配合 BLE_SerialPort 中的 Sever_Use_OTA_serviceManager

b.BLE_OTA_ResetManger 配合 BLE_SerialPort 中的 Service_LowerApp_OTA 或者Service_LowerApp_OTA 使用

07651858-837d-11ee-939d-92fbcf53809c.jpg

2.3 使用带备份类型 OTA 升级错误变砖头问题

编译器编译的 Higher Application 如果放置在 Lower Application 的位置,程序无法运行。APP 程序可以知晓当前运行的固件是 Lower 还是 Higher APP。可以在编译固件 Higher Application 和 Lower Application 中加入一些标记,用于给升级工具识别,当前需要下载的是Higher Application 还是 Lower Application 或者是否混用。建议每次发布时两个应用程序都编译生成,不要人为来管理固件,否则容易造成混乱,应该让升级 app 自动选择对应的来升级。

076c54ba-837d-11ee-939d-92fbcf53809c.jpg

03

BlueNRG-LP/LPS的存储分析

3.1 linker 中宏定义作用范围

Linker 中可定义一些宏、用于指定链接脚本文件所需的配置。这些宏定义不作用于.c文件或者.h文件,只作用于链接文件(.icf 或者.sct 或者 *.ld)。

3.2 链接脚本文件分析(代码区域)

不同的 IDE 所使用的链接脚本文件的格式不同。比如,Keil 使用“*.sct”文件,IAR 使用“*.icf”文件,而 TrueStudio 使用 “*.ld”文件。

下面分析BlueNRG-LP最新SDK中BLE_SerialPort项目IAR工程目录下的BlueNRG_LP.icf文件, 其他IDE一样,可以进行类比。由于Flash的擦除必须是整页操作的,写Flash之前必须将对应的页擦除,所以Flash的划分需要2KB对齐。就算只使用到0.9KB,也需要划分2KB区域。

默认SDK中提供了4种程序的链接配置:

CONFIG_OTA_HIGHER

CONFIG_OTA_LOWER

CONFIG_OTA_USE_SERVICE_MANAGER

其他

078179f8-837d-11ee-939d-92fbcf53809c.jpg

对于这四种链接配置编译后,代码区域放置在如下地址。BLE_OTA_ServiceManager 工程使用的是非 OTA 程序,而 BLE_SerialPort 中的 Sever_Use_OTA_serviceManager 工程使用的是CONFIG_OTA_USE_SERVICE_MANAGER。

078f2a9e-837d-11ee-939d-92fbcf53809c.jpg

上述4种程序的链接配置由以下宏定义来指定:MEMORY_FLASH_APP_SIZE: 定义程序使用Flash的大小。以工程BLE_OTA_ServiceManager为例子,在linker中定义了MEMORY_FLASH_APP_SIZE = 0x3000, 则表明BLE_OTA_ServiceManager的大小不能超过0x3000(12*1024) 字节。BLE_OTA_ServiceManager是一个带OTA服务的启动程序,宏定义MEMORY_FLASH_APP_SIZE限制这个工程编译的程序空间大小不能超过这个范围。

如果在linker中没有定义MEMORY_FLASH_APP_SIZE,则对应的4种配置分别是:

07a3b0cc-837d-11ee-939d-92fbcf53809c.jpg

MEMORY_FLASH_APP_OFFSET: 定义程序编译链接地址的偏移(非OTA程序)。如果在linker中没有定义MEMORY_FLASH_APP_OFFSET,则对应的4种配置分别是:

07b49144-837d-11ee-939d-92fbcf53809c.jpg

前面提到默认SDK中提供了4种程序的链接配置,本质上只是计算MEMORY_FLASH_APP_OFFSET和MEMORY_FLASH_APP_SIZE的方式不同而已,如果应用需要,也可以改动这个链接脚本文件。

04

通过协议栈的初步裁剪与自定义优化空间

SDK 中默认提供了 4 种默认配置的协议栈加一种自定义的协议栈配置(BLE_STACK_CUSTOM_CONF),如下图所示。

07c5ce50-837d-11ee-939d-92fbcf53809c.jpg

上述 5 种不同协议栈的配置,本质上就是通过使用宏控制不同的特性功能是否打开。只是前面 4种提供了默认便捷的设置,而最后一种可以进行细粒度更细的自定义的协议栈。

可以在 Preprocesor Symbols 中定义相关的宏来配置使用哪种协议栈配置。

07cd245c-837d-11ee-939d-92fbcf53809c.jpg

如果选用细粒度更细的 BLE_STACK_CUSTOM_CONF 协议栈配置,则在 其中在头文件“custom_ble_stack_config.h”中开关不同功能特性,大致占用的代码如下图所示。

07e25b56-837d-11ee-939d-92fbcf53809c.jpg

05

协议栈的进一步裁剪:使用静态协议栈

5.1 静态协议栈工程的 4 种默认的配置

ST 官方 SDK 中已经提供了静态协议栈的 Demo,分为协议栈工程和应用工程两部分,路径为:C:Usersuser nameSTBlueNRG-LP DK 1.x.xProjectsBLE_ExamplesBLE_StaticStack 静态协议栈工程默认提供了 4 种配置:

• Release

• Basic

• OTA_BTL_ResetManager

• OTA_BTL_ResetManager_Basic

C:Usersuser nameSTBlueNRG-LP DK 1.x.0ProjectsBLE_ExamplesBLE_SensorDemo_StaticStack

• Release

• LowerApp_OTA

• HigherApp_OTA

07eeb090-837d-11ee-939d-92fbcf53809c.jpg

那它们有什么区别呢?它们可以分为两组。

Release 和 Basic 是一组:它们运行时都是由协议栈程序直接跳转到一个固定的应用上;

Release 和 Basic 的区别:Basic 的协议栈配置是 BLE_STACK_BASIC_CONF, 而 Release的协议栈配置是 BLE_STACK_FULL_CONF。

不同的协议栈配置,包含的功能和占用的 Flash 空间也不一致。

• 不同的协议栈配置包含的功能请查看 stack_user_cfg.h

• 占用的 Flash 空间可以通过编译的 Map 文件查看• 宏 RESET_MANAGER_SIZE 用于协议栈程序的跳转偏移,即预留多少空间给协议栈,因此这个宏的大小也会因为协议栈占用的空间不同而不同。

• Linker 中宏 MEMORY_FLASH_APP_SIZE 用于定义程序可用的大小。即预留多少空间给协议栈,因此这个宏的大小也会因为协议栈占用的空间不同而不同。

OTA_BTL_ResetManager 和 OTA_BTL_ResetManager_Basic 是另外一组:它们都是由协议栈程序跳转到 Lower 应用程序或者 Higher 应用程序;

• OTA_BTL_ResetManager 和 OTA_BTL_ResetManager_Basic 的区别:OTA_BTL_ResetManager_Basic 的协议栈配置是 BLE_STACK_BASIC_CONF, 而OTA_BTL_ResetManager 的协议栈配置是 BLE_STACK_FULL_CONF

• 不同的协议栈配置,包含的功能和占用的 Flash 空间也不一致。

o 不同的协议栈配置包含的功能请查看 stack_user_cfg.h

o 占用的 Flash 空间可以通过编译的 Map 文件查看

o 宏 RESET_MANAGER_SIZE 用于协议栈程序的跳转偏移,即预留多少空间给协议栈,因此这个宏的大小也会因为协议栈占用的空间不同而不同。

o Linker 中宏 MEMORY_FLASH_APP_SIZE 用于定义程序可用的大小。即预留多少空间给协议栈,因此这个宏的大小也会因为协议栈占用的空间不同而不同。

其中,一个工程负责生成协议栈,另一个工程负责应用,那么这里 BLE_StaticStack 中的Release or Basic 与 OTA_BTL_ResetManager or OTA_BTL_ResetManager_Basic 怎么和Release,LowerApp_OTA 和 HigherApp_OTA 组合呢?

• BLE_StaticStack 中的 Release or Basic + BLE_SensorDemo_StaticStack 中的Release //不带备份 OTA 的使用固定协议栈的方法

• BLE_StaticStack 中的 OTA_BTL_ResetManager or OTA_BTL_ResetManager_Basic + BLE_SensorDemo_StaticStack 中的 LowerApp_OTA or HigherApp_OTA //带备份OTA 的使用固定协议栈的方法

5.2 将工程实例化为静态协议栈工程编程基础

将工程实例化为静态协议栈涉及比较多的步骤,可以参考官方的文档 :BlueNRG-LP_LPS DK 1.2.0ProjectsBLE_ExamplesBLE_SensorDemo_StaticStackREADME.txt

以及 SDK 安装目录的 index.html 中的静态协议栈的介绍如下图所示。

08065c86-837d-11ee-939d-92fbcf53809c.jpg

如果在实例化 OTA 程序时,可能需要修改链接脚本和 Preprocesor Symbols 中下面几个宏(具体不同应用,不同 OTA 类型,具体需要定义的宏和宏的数值也不同):

RESET_MANAGER_SIZESERVICE_MANAGER_OFFSETSERVICE_MANAGER_SIZEMEMORY_FLASH_APP_SIZEMEMORY_RAM_APP_OFFSET

5.3 使用默认配置的协议栈

如果使用了 OTA,发现空间不够,可以考虑将应用协议栈和 OTA 协议栈合并使用如下图所示。

082649e2-837d-11ee-939d-92fbcf53809c.jpg

上图列举的是基于 BlueNRG-LP 的默认提供的工程的大致数值(BlueNRG-LPS 类似,这里不再举例)。如果遇到不同的应用,可以实际裁剪协议栈适配不同的应用需求。

5.4 使用自定义配置的协议栈

使用静态协议栈可以实现更为精确的函数级别的裁剪:通过注释协议栈工程中的 bluenrg_lp_cmd_if.c 中的 cmd_call_table 中对应的函数,编译时可以将不使用的协议栈函数裁减出协议栈。

08599608-837d-11ee-939d-92fbcf53809c.jpg

5.5 使用静态协议栈这种模式如何支持升级协议栈

当使用静态协议栈,默认协议栈就无法升级。为了能够支持协议栈也升级。需要增加一段 boot代码,当升级协议栈时,先放置在 APP 区域,当升级完协议栈后,将 APP 区域的协议栈拷贝到协议栈区域。接着继续升级被擦除的应用程序。Boot 代码决定搬运协议栈和跳转到下一级。

086ea3c2-837d-11ee-939d-92fbcf53809c.jpg

06

优化后空间仍不足的其他方法

如果使用静态协议栈和空间仍然不足,可以考虑将一些常用而不需修改的通用模块编译进协议栈的工程。如果空间仍然差距比较远则考虑用片外 Falsh 或者选用 STM32WB 系列,再或者使用 STM32+协处理器模式。






审核编辑:刘清

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

    关注

    5

    文章

    319

    浏览量

    36282
  • OTA
    OTA
    +关注

    关注

    7

    文章

    522

    浏览量

    34591
  • BlueNRG
    +关注

    关注

    0

    文章

    15

    浏览量

    9617

原文标题:实战经验 | 简谈 BlueNRG-LP 和-LPS 的代码空间优化

文章出处:【微信号:STM32_STM8_MCU,微信公众号:STM32单片机】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    意法半导体发布Bluetooth®LE系统芯片(SoC)—— BlueNRG-LP

    BlueNRG-LP支持蓝牙远程模式,采用前向纠错(FEC)编码物理层(Code PHY)将无线通信距离延长到数百米,并提高了连接可靠性。
    发表于 10-18 09:36 1196次阅读

    请问如何在BlueNRG-LP上看门狗处理程序?

    使用 BlueNRG1/2,我们得到了 WEAK_FUNCTION(void WDG_Handler(void) {}); 在 system_bluenrg1.c 中,但对于 BlueNRG-LP,在 system_
    发表于 12-14 06:38

    请问一下在哪里可以找到BlueNRG-LP网格示例呢

    大家好,我是 ST 世界的新手,我对自己的评估有些怀疑。我正在研究 BlueNRG-LP 控制器。因为我确定 LP 系列支持 Ble Mesh,所以为什么我在 STSW_BNRG_Mesh(它仅包含
    发表于 12-16 08:23

    BlueNRG-LPBlueNRG-LPS(无线)固件升级程序

    本应用笔记介绍运行于随 BlueNRG-LPBlueNRG-LPS 片上系统提供的 Bluetooth®低功耗(LE)栈之上的 BlueNRG-LPBlueNRG-LPS 无线(O
    发表于 08-14 10:19

    BlueNRG-LP/BlueNRG-LPS设备的PCB设计指南

    BlueNRG 系列是符合蓝牙规范的超低功耗 Bluetooth® Low Energy(BLE)器件。BlueNRG-LPBlueNRG-LPS 是一款采用 Cortex-M0+微控制器, 且
    发表于 08-14 06:35

    BLUENRG-LP无线处理器介绍

    意法半导体的第三代BlueNRG2.4 GHz Radio IP符合蓝牙SIG核心规范5.2版本要求,兼具出色的射频性能和极长的电池寿命。BlueNRG-LP SoC适用于点对多点连接和蓝牙SIG
    发表于 09-08 06:57

    【应用笔记】BlueNRG-LPBlueNRG-LPS+省电模式

    BlueNRG-LPBlueNRG-LPS 是超低功耗的 BLE 单模 SoC,符合 Bluetooth®规范。其架构核心是 32 位的 Cortex-M0+。 本应用笔记将介绍
    发表于 10-08 15:35

    意法半导体首款蓝牙LE 5.2 SoC产品BlueNRG-LP

    BlueNRG-LP (STSW-BNRGLP-Mesh)的蓝牙Mesh协议栈目前可供下载。】 BlueNRG-LP:开头第一步 STEVAL-IDB011V1评估板和更新的BlueNRG软件
    的头像 发表于 04-23 10:35 2370次阅读
    意法半导体首款蓝牙LE 5.2 SoC产品<b class='flag-5'>BlueNRG-LP</b>

    BlueNRG-LP支持128个并发连接的蓝牙低功耗SoC

    ST推出的BlueNRG-LP,这是首款支持 128 个并发连接的蓝牙低功耗 SoC。它也是我们第一款获得蓝牙低功耗 5.2 认证的设备。BlueNRG-LP 支持远程、2 Mbps 传输和广告扩展
    的头像 发表于 05-12 10:26 2215次阅读
    <b class='flag-5'>BlueNRG-LP</b>支持128个并发连接的蓝牙低功耗SoC

    应用笔记|使用 BlueNRG-LP SoC 方案无法扫描到扩展广播包

    关键字:BlueNRG-LP, 传统广播,扩展广播 目录预览 1 引言 2 问题描述 3 问题分析与定位 4 问题解决 5 小结 1. 引言 BlueNRG-LP 是意法半导体第三代低功耗蓝牙单芯片
    的头像 发表于 06-08 11:55 466次阅读
    应用笔记|使用 <b class='flag-5'>BlueNRG-LP</b> SoC 方案无法扫描到扩展广播包

    BLUENRG-LP无线处理器:符合未来要求的蓝牙低功耗5.2可编程片上系统

    电子发烧友网站提供《BLUENRG-LP无线处理器:符合未来要求的蓝牙低功耗5.2可编程片上系统.pdf》资料免费下载
    发表于 08-01 16:27 0次下载
    <b class='flag-5'>BLUENRG-LP</b>无线处理器:符合未来要求的蓝牙低功耗5.2可编程片上系统

    BlueNRG-LPBlueNRG-LPS 2.4GHz无线电私有驱动程序

    本文档介绍 BlueNRG-LPBlueNRG-LPS 2.4 GHz 无线电私有底层驱动程序,它提供对 BlueNRG-LPBlueNRG-LPS设备的访问权限,以便在不使用
    发表于 09-12 09:37 0次下载

    BlueNRG-LPBlueNRG-LPS定时器模块

    an5469  BlueNRG-LPBlueNRG-LPS 是超低功耗的 BLE 单模片上系统,符合 Bluetooth®规范。其架构核心是 32 位的 Cortex M0+。本文档介绍管理
    发表于 09-12 09:36 0次下载

    BlueNRG-LPBlueNRG-LPS省电模式

    BlueNRG-LPBlueNRG-LPS 是超低功耗的 BLE 单模 SoC,符合 Bluetooth®规范。其架构核心是 32 位的 Cortex-M0+。本应用笔记将介绍
    发表于 10-09 17:27 0次下载

    实战经验 | BlueNRG-X 原理图参数说明(附资料下载端口)

    关键词:BlueNRG-1, BlueNRG-2, BlueNRG-LP/LPS 目录预览 1、前言 2、BlueNRG-1/-2 的原理图
    的头像 发表于 10-18 19:15 394次阅读