你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于STM32的BlueNRG-LP 和-LPS 的代码空间优化经验分享

[复制链接]
攻城狮Melo 发布时间:2023-11-16 19:19
01引言
: M$ M5 K/ v+ L  U8 e/ v客户在使用 BlueNRG-LP/LPS 芯片时,增加 OTA 服务后常常反馈说,编译代码区域超空间了,需要帮忙优化一下。后文主要通过下列步骤进行分析和优化 BlueNRG-LP/LPS 的代码空间:; v  s3 X/ N4 m: y
a. 通过分析 BlueNRG-LP/LPS 的 OTA 方式,让客户可以选择合适的方式;
( h. K: C/ T9 D& a; g' Zb. 通过整体分析 BlueNRG-LP/LPS 的链接文件(*.icf/*.sct/*.ld)了解默认工程的存储分布;
3 R5 ]/ H6 r9 N* cc. 通过裁剪协议栈,选择合适的协议栈功能,优化 BlueNRG-LP/LPS 的代码空间;
- [% q; J* K& o( fd. 通过使用静态协议栈,进一步优化 BlueNRG-LP/LPS 的代码空间;5 o9 C! [. R, m
e. 其他方案;
; m; {, Z5 U+ R
( r, C1 Q3 G/ e
微信图片_20231116191908.jpg
1 m. M5 d1 I* A9 F* L; x' H* }4 B6 a1 J- d# f' B' _( a% E
总的来说通过两个维度来节省空间:一个是协议栈的裁剪维度:主要是通过修改宏配置实现编译对应应用需要的协议栈。另一个是 OTA 和静态协议栈的维度:OTA 和静态协议栈的选择流程图如下图所示
* v: u# }5 Z- Q. I3 T
! B2 w5 O9 {+ n+ T
02BlueNRG-LP/BlueNRG-LPS的OTA
, d2 G7 m8 P9 j9 S2.1 OTA 的框架) l+ A/ N1 Y8 S) Z2 T
手机或者电脑做 GATT Client,给带 OTA 服务的设备升级。* r3 T5 f) S% R) `! j6 q

9 `4 ?$ E$ M) @  k" n/ ]
微信图片_20231116191905.jpg ( s. A4 b2 C8 e* V* m8 p1 C! Y

2 _; c' }8 d4 i, f
2.2 官方提供的 OTA 方式
' c: w+ @0 b0 _默认提供的 OTA 应用和协议栈编译在一个固件上。% x( p* _8 ^( `' u( h
a. 不带备份的(右图中的右半部分)2 B- J9 v: y3 a; H5 ~' m5 W
升级服务程序在 Boot 端(OTA Service manager)。' \0 l  Z( I4 r1 d! |
省空间(存放了 2 份协议栈,1 份应用)% t2 C  n/ ^$ }
管理简单(只需管理一份应用)
6 D; T$ m& t( w4 i, Ub. 带备份的(右图中的左半部分)3 v/ D4 y0 Q2 F/ X2 ~6 U
升级服务程序在应用端
% X( r' I5 D  ]; ]2 g- M- o  d更消耗空间(存放了 2 份协议栈,2 份应用)
6 r  M) G# [! b& e1 [* ~管理稍微麻烦(需要管理两份应用,Lower 区域应用不能放置 Higher 区域运行)
+ V' E$ T7 D) M/ O! _" l2 W0 Q更安全 3 C/ \. l) l; e. o8 B
' _$ C7 S0 T- q6 Z- ]1 H
微信图片_20231116191901.jpg ) j* q1 x- t# R8 i" R) S; h
7 [8 ]3 I/ j( S( |7 h- K( ]
a. 不带备份的方式由以下组件构成:
3 k/ u- {6 f' m+ W( z4 `BLE_OTA_ServiceManager+ application9 |+ C: k7 o7 S3 Y: i) d
b. 带备份的由以下组件构成:
* F* V* x5 }4 X) r8 PBLE_OTA_ResetManager +Lower Application (with BLE OTA service) orBLE_OTA_ResetManager + Higher Application (with BLE OTA service)
1 ]9 X" u& b  I- Q4 h
; a3 ~/ I* n. H对应在 SDK 中工程和配置如下图所示:1 |! V; b3 y9 _7 O( ~! |
a.BLE_OTA_ServiceManager 配合 BLE_SerialPort 中的 Sever_Use_OTA_serviceManager& `" Y! d1 W9 N: C# R
b.BLE_OTA_ResetManger 配合 BLE_SerialPort 中的 Service_LowerApp_OTA 或者Service_LowerApp_OTA 使用
6 p: L# A+ z, T# r& d
6 v5 S+ H: J, F, r% r
微信图片_20231116191859.jpg & p7 Y, |5 L' b& [' ~. j7 C
- ]( A2 n" x  B, G& L2 T6 Z
2.3 使用带备份类型 OTA 升级错误变砖头问题2 E4 \7 z  N% O; b/ Q6 _& n* s
编译器编译的 Higher Application 如果放置在 Lower Application 的位置,程序无法运行。APP 程序可以知晓当前运行的固件是 Lower 还是 Higher APP。可以在编译固件 Higher Application 和 Lower Application 中加入一些标记,用于给升级工具识别,当前需要下载的是Higher Application 还是 Lower Application 或者是否混用。建议每次发布时两个应用程序都编译生成,不要人为来管理固件,否则容易造成混乱,应该让升级 app 自动选择对应的来升级。
+ r/ h# y2 ^; s) H; D* h; f+ [: J  G  f/ Y- R9 d8 O3 B

! c, E% E6 ?" ^5 x' b4 |5 v 微信图片_20231116191855.jpg
8 \7 Z+ ?, v+ E5 y5 q! V  w$ j! Q% {: O2 H0 V
' d4 J' e9 J2 k1 A
03BlueNRG-LP/LPS的存储分析! Q! A! J) ?% ^$ o& ?
3.1 linker 中宏定义作用范围
+ S9 l9 F# i4 J3 d! mLinker 中可定义一些宏、用于指定链接脚本文件所需的配置。这些宏定义不作用于.c文件或者.h文件,只作用于链接文件(.icf 或者.sct 或者 *.ld)。- y  L4 S" Z* u  W6 o+ u6 I
( {. H+ w+ A& _' k( @

. ?! B  o6 A/ ]) x* y6 c- V/ M7 e3.2 链接脚本文件分析(代码区域)
3 _( `/ A: ]( n. [. b不同的 IDE 所使用的链接脚本文件的格式不同。比如,Keil 使用“*.sct”文件,IAR 使用“*.icf”文件,而 TrueStudio 使用 “*.ld”文件。 & ]! `( D8 `+ x" y
2 s. \. Q0 ~  L, M2 \, s. w/ ?# w
下面分析BlueNRG-LP最新SDK中BLE_SerialPort项目IAR工程目录下的BlueNRG_LP.icf文件, 其他IDE一样,可以进行类比。由于Flash的擦除必须是整页操作的,写Flash之前必须将对应的页擦除,所以Flash的划分需要2KB对齐。就算只使用到0.9KB,也需要划分2KB区域。
; ?9 H3 s% u3 e" m1 d# m" i* y
9 m4 T% {! }2 w6 Z默认SDK中提供了4种程序的链接配置:
) M) W6 [4 T" r6 Z7 [7 ]1.CONFIG_OTA_HIGHER/ Z: a0 E! J  C9 P& E* D5 J5 x+ y
2.CONFIG_OTA_LOWER& O% X. n  i2 H" W
3.CONFIG_OTA_USE_SERVICE_MANAGER
- G: v, H2 W" s% I4.其他3 P( o9 f6 J; L) V7 }( `$ \
/ z/ M* W% i9 c5 P$ m7 x( @
微信图片_20231116191852.jpg * O* ?$ w0 \2 O4 y9 o2 |

8 M" ^" W! ^* ?" v+ F. T对于这四种链接配置编译后,代码区域放置在如下地址。BLE_OTA_ServiceManager 工程使用的是非 OTA 程序,而 BLE_SerialPort 中的 Sever_Use_OTA_serviceManager 工程使用的是CONFIG_OTA_USE_SERVICE_MANAGER。" V8 A% K! z0 h3 ?1 m2 X2 M

/ x% _) ~8 _" r+ Q
微信图片_20231116191849.jpg
6 k7 E0 g- X2 U3 |
: a; m; ~  m9 g& S9 {3 E: w; I3 o0 @
上述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限制这个工程编译的程序空间大小不能超过这个范围。3 g( U. n( z8 t- v

( \8 ]( e! U0 H8 f+ ?% V- d如果在linker中没有定义MEMORY_FLASH_APP_SIZE,则对应的4种配置分别是:6 N; |; b  U- n, C( T# g8 _

# Z* S* B  e/ A9 g9 M# I
微信图片_20231116191846.jpg 4 a! i7 p* s! ?/ G

# i8 |. v  h; Y6 h7 c# K* [MEMORY_FLASH_APP_OFFSET: 定义程序编译链接地址的偏移(非OTA程序)。如果在linker中没有定义MEMORY_FLASH_APP_OFFSET,则对应的4种配置分别是:
( {- D* [1 p& g2 V. Q0 i1 T4 `" k% X  \9 P7 J
微信图片_20231116191843.jpg
4 B1 R4 ?9 r! @0 v) _" D# z* U* }1 E  U" a% p# `4 q( j  i2 ?
前面提到默认SDK中提供了4种程序的链接配置,本质上只是计算MEMORY_FLASH_APP_OFFSET和MEMORY_FLASH_APP_SIZE的方式不同而已,如果应用需要,也可以改动这个链接脚本文件。6 o$ W6 W1 ~9 c; Q0 l( Y

" Y/ ~8 M, K, X& a. C& I

" E8 @! t" C5 j3 d  P( _04通过协议栈的初步裁剪与自定义优化空间
6 M6 ^2 g4 F1 k* w# i) f6 T9 TSDK 中默认提供了 4 种默认配置的协议栈加一种自定义的协议栈配置(BLE_STACK_CUSTOM_CONF),如下图所示。
9 Z/ ^9 J: P/ a- r6 j6 y. Z
8 p& t% S4 I/ S' a: G( k# I' \6 k* R
微信图片_20231116191839.jpg
- G' s7 ]" H2 `( l; q8 w8 s+ _
6 F$ O$ \$ D+ ^! [7 \' @8 g$ c/ ?# K+ o
上述 5 种不同协议栈的配置,本质上就是通过使用宏控制不同的特性功能是否打开。只是前面 4种提供了默认便捷的设置,而最后一种可以进行细粒度更细的自定义的协议栈。 6 _6 R/ @5 ?  `

' W; }) q% @; P+ m% Y6 K0 w可以在 Preprocesor Symbols 中定义相关的宏来配置使用哪种协议栈配置。+ ~0 Z* R: P# z8 [* a: ]

* R/ U4 b3 U; E9 L2 Y
微信图片_20231116191836.jpg ( J+ x& Z  ?- Z/ h% ~9 p
5 D3 y; s: O8 B& T* e/ p
如果选用细粒度更细的 BLE_STACK_CUSTOM_CONF 协议栈配置,则在 其中在头文件“custom_ble_stack_config.h”中开关不同功能特性,大致占用的代码如下图所示。: {8 H+ M# W$ d
! c9 M2 P, h! |
微信图片_20231116191833.jpg 9 R/ C# |  |) M: p$ I5 W
3 i0 }0 K  I/ A3 Y

1 K/ f7 R8 Z' ?5 U1 O" f! @0 w05协议栈的进一步裁剪:使用静态协议栈
& e; v' R. Z% B; ~- ]5.1 静态协议栈工程的 4 种默认的配置9 ^- \8 {0 X/ V, V
ST 官方 SDK 中已经提供了静态协议栈的 Demo,分为协议栈工程和应用工程两部分,路径为:C:\Users\user name\ST\BlueNRG-LP DK 1.x.x\Projects\BLE_Examples\BLE_StaticStack 静态协议栈工程默认提供了 4 种配置:: g; n! P0 Z4 @
• Release
: }- W* X+ b: |• Basic" M& s4 x8 t, f; l' Y
• OTA_BTL_ResetManager
6 [1 a! k1 k- x% {% k( [# O• OTA_BTL_ResetManager_Basic, b+ Q: b+ L* [  _1 x

% A: I4 {+ f3 t0 H& e' K" w2 {0 L2 pC:\Users\user name\ST\BlueNRG-LP DK 1.x.0\Projects\BLE_Examples\BLE_SensorDemo_StaticStack
6 e1 h  k) F8 n. _. e2 q6 d• Release
2 D) }2 ^2 Y& l' E, `! |) U+ k• LowerApp_OTA
) P" b% C. Q, O' H1 ^* o) m$ V• HigherApp_OTA
- p9 b/ r; |2 ~
' g- \; }9 t: u
微信图片_20231116191830.jpg , E) e/ ^# a" e+ v$ Y& O; X
1 W# ]1 ^% a$ o7 ^5 _
那它们有什么区别呢?它们可以分为两组。
3 S3 P# s7 J  h/ R0 x' a  R, F& s' B0 J+ e. U/ g4 k
Release 和 Basic 是一组:它们运行时都是由协议栈程序直接跳转到一个固定的应用上;: m- r; c8 z  @
# E/ ^( ]& Z% \: ]
Release 和 Basic 的区别:Basic 的协议栈配置是 BLE_STACK_BASIC_CONF, 而 Release的协议栈配置是 BLE_STACK_FULL_CONF。
) y$ \3 m& J! |/ @; N
1 V3 ]2 s% Q/ s4 e, Y
不同的协议栈配置,包含的功能和占用的 Flash 空间也不一致。
$ i. M. q. y5 b  n" [; a3 H# U• 不同的协议栈配置包含的功能请查看 stack_user_cfg.h
- f3 {! g/ [) V+ y0 h• 占用的 Flash 空间可以通过编译的 Map 文件查看• 宏 RESET_MANAGER_SIZE 用于协议栈程序的跳转偏移,即预留多少空间给协议栈,因此这个宏的大小也会因为协议栈占用的空间不同而不同。
+ O; ]) k+ }4 n• Linker 中宏 MEMORY_FLASH_APP_SIZE 用于定义程序可用的大小。即预留多少空间给协议栈,因此这个宏的大小也会因为协议栈占用的空间不同而不同。
; g/ w; s0 {8 }2 m) U& B& H( k, K7 z7 p
OTA_BTL_ResetManager 和 OTA_BTL_ResetManager_Basic 是另外一组:它们都是由协议栈程序跳转到 Lower 应用程序或者 Higher 应用程序;
: P( a/ G7 I1 g# G
! q! @$ R6 }1 w) m& p3 x• OTA_BTL_ResetManager 和 OTA_BTL_ResetManager_Basic 的区别:OTA_BTL_ResetManager_Basic 的协议栈配置是 BLE_STACK_BASIC_CONF, 而OTA_BTL_ResetManager 的协议栈配置是 BLE_STACK_FULL_CONF
! [( a! v7 w: B6 ^3 Y: ~' w
; v9 ]" @1 Q& \7 _% V• 不同的协议栈配置,包含的功能和占用的 Flash 空间也不一致。
( V1 v5 ~  A5 lo 不同的协议栈配置包含的功能请查看 stack_user_cfg.h
% W* a8 h4 w+ e/ g3 p, \o 占用的 Flash 空间可以通过编译的 Map 文件查看
. P# L2 I1 Z' _4 Io 宏 RESET_MANAGER_SIZE 用于协议栈程序的跳转偏移,即预留多少空间给协议栈,因此这个宏的大小也会因为协议栈占用的空间不同而不同。( a' @2 s7 k. \
o Linker 中宏 MEMORY_FLASH_APP_SIZE 用于定义程序可用的大小。即预留多少空间给协议栈,因此这个宏的大小也会因为协议栈占用的空间不同而不同。 - ]9 Z3 P6 S! q

" F+ H- ?* b2 Z# n其中,一个工程负责生成协议栈,另一个工程负责应用,那么这里 BLE_StaticStack 中的Release or Basic 与 OTA_BTL_ResetManager or OTA_BTL_ResetManager_Basic 怎么和Release,LowerApp_OTA 和 HigherApp_OTA 组合呢?
' J; l; {8 u0 _/ @' ?6 i* h• BLE_StaticStack 中的 Release or Basic + BLE_SensorDemo_StaticStack 中的Release //不带备份 OTA 的使用固定协议栈的方法
$ C- X( G. R2 d4 b7 c• BLE_StaticStack 中的 OTA_BTL_ResetManager or OTA_BTL_ResetManager_Basic + BLE_SensorDemo_StaticStack 中的 LowerApp_OTA or HigherApp_OTA //带备份OTA 的使用固定协议栈的方法0 ^8 }! ^  H9 U0 W$ h& P/ q" L

* @) {1 K  A& _5.2 将工程实例化为静态协议栈工程编程基础
& z/ n  f. w' p' K: i将工程实例化为静态协议栈涉及比较多的步骤,可以参考官方的文档 :BlueNRG-LP_LPS DK 1.2.0\Projects\BLE_Examples\BLE_SensorDemo_StaticStack\README.txt6 ]* Y- W" f: f( @% ~0 q1 x

. y* r( P0 W+ A* x6 u5 ]3 C. e以及 SDK 安装目录的 index.html 中的静态协议栈的介绍如下图所示。
% j  o. K/ g, A. M
* C' H( M0 l0 s4 c# ], o  R' P
微信图片_20231116191827.jpg 0 q! |, B& M  @3 E7 w* e
  `- U; q! |9 U0 q, B) K5 f* h8 s
如果在实例化 OTA 程序时,可能需要修改链接脚本和 Preprocesor Symbols 中下面几个宏(具体不同应用,不同 OTA 类型,具体需要定义的宏和宏的数值也不同): . P3 F7 a& b6 g! Z% j2 _
3 \* L) q# N4 \2 k
RESET_MANAGER_SIZESERVICE_MANAGER_OFFSETSERVICE_MANAGER_SIZEMEMORY_FLASH_APP_SIZEMEMORY_RAM_APP_OFFSET/ S2 r: o' i* Y, r& c/ p3 H
$ @" Q8 I/ @2 ]( ]" Z
5.3 使用默认配置的协议栈
6 U! {8 c+ `$ _- }1 h1 P# S如果使用了 OTA,发现空间不够,可以考虑将应用协议栈和 OTA 协议栈合并使用如下图所示。
# \( l% i5 @2 ]  f) X& y( f
+ f( |% `  Z, c3 e. E- X. A
微信图片_20231116191823.jpg # |3 _  b$ L( u6 c1 U

+ I4 D' _) y% f3 d& y  l1 O7 R9 I上图列举的是基于 BlueNRG-LP 的默认提供的工程的大致数值(BlueNRG-LPS 类似,这里不再举例)。如果遇到不同的应用,可以实际裁剪协议栈适配不同的应用需求。4 }" f  y  N0 J8 W' Z
- ]8 z; G0 K- ?& p& B
5.4 使用自定义配置的协议栈) j: B. C9 R. _0 A( n
使用静态协议栈可以实现更为精确的函数级别的裁剪:通过注释协议栈工程中的 bluenrg_lp_cmd_if.c 中的 cmd_call_table 中对应的函数,编译时可以将不使用的协议栈函数裁减出协议栈。9 W* U7 n# z# c/ l
2 p  S- J8 z+ B0 N, ^( T. Z/ C8 W
微信图片_20231116191820.jpg & q% K( u' m% l& y) u8 t
$ n* h# {$ T. L8 f
5.5 使用静态协议栈这种模式如何支持升级协议栈
/ V( A- T) D. _# Y9 u+ D9 m' v6 E当使用静态协议栈,默认协议栈就无法升级。为了能够支持协议栈也升级。需要增加一段 boot代码,当升级协议栈时,先放置在 APP 区域,当升级完协议栈后,将 APP 区域的协议栈拷贝到协议栈区域。接着继续升级被擦除的应用程序。Boot 代码决定搬运协议栈和跳转到下一级。' T$ [" L  S$ G! l3 |
. U; b6 C% l7 z& ]& x
微信图片_20231116191817.jpg - G4 R& }3 C% q2 T- {+ U
- n" ~# {7 x- V7 \6 b  H
06优化后空间仍不足的其他方法
! \3 w) I' I4 U, z& }4 H3 C, u8 n如果使用静态协议栈和空间仍然不足,可以考虑将一些常用而不需修改的通用模块编译进协议栈的工程。如果空间仍然差距比较远则考虑用片外 Falsh 或者选用 STM32WB 系列,再或者使用 STM32+协处理器模式。$ K% a+ E+ t9 K: [( g
- j. T. k* y5 @. {' G6 F0 ]
6 h" I. c4 m0 t; l0 V
转载自:记帖# I( V5 U( I4 b
如有侵权请联系删除
% p  j6 L; m3 f# e
: |9 E9 |/ O& \, |& L0 ]- p, U
  T4 c$ I4 _; f: |/ @
) |  G) @6 s5 w2 C
收藏 评论0 发布时间:2023-11-16 19:19

举报

0个回答

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版