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

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

[复制链接]
攻城狮Melo 发布时间:2023-11-16 19:19
01引言* F! C9 v( R4 {$ v( S
客户在使用 BlueNRG-LP/LPS 芯片时,增加 OTA 服务后常常反馈说,编译代码区域超空间了,需要帮忙优化一下。后文主要通过下列步骤进行分析和优化 BlueNRG-LP/LPS 的代码空间:
$ t+ \. _' P' @2 c6 n1 {a. 通过分析 BlueNRG-LP/LPS 的 OTA 方式,让客户可以选择合适的方式;8 ?1 ^# O8 o  ~$ \" {/ F2 L. }
b. 通过整体分析 BlueNRG-LP/LPS 的链接文件(*.icf/*.sct/*.ld)了解默认工程的存储分布;
4 \  e) d7 c+ vc. 通过裁剪协议栈,选择合适的协议栈功能,优化 BlueNRG-LP/LPS 的代码空间;
/ |+ W0 O0 p' w: C+ zd. 通过使用静态协议栈,进一步优化 BlueNRG-LP/LPS 的代码空间;- m7 `8 N$ a, j3 V9 L: X/ o' V
e. 其他方案; & Q+ \$ ~- C( ]- F7 L' Y- w

% D* h1 @/ ?3 G- D
微信图片_20231116191908.jpg 0 {; n7 B2 M( W
2 {- Z' }' o# c* r) j, q. I
总的来说通过两个维度来节省空间:一个是协议栈的裁剪维度:主要是通过修改宏配置实现编译对应应用需要的协议栈。另一个是 OTA 和静态协议栈的维度:OTA 和静态协议栈的选择流程图如下图所示
8 U. s- T: E# }- x3 q% F- k/ y# I) m
02BlueNRG-LP/BlueNRG-LPS的OTA2 S% b2 P( V1 k
2.1 OTA 的框架
! X: q5 j) Q- M% L( P手机或者电脑做 GATT Client,给带 OTA 服务的设备升级。7 A, Z" P+ ?$ ^
; C* d2 o/ {: ^- L4 l/ W& u9 m
微信图片_20231116191905.jpg
. ]) u7 S2 i9 y' |) Q; x$ C& v& D1 ^' k9 L" |( `6 i
2.2 官方提供的 OTA 方式7 B' ]0 K; J/ ^9 j7 d" W/ P
默认提供的 OTA 应用和协议栈编译在一个固件上。7 y! n/ ^. n3 T8 L7 D4 T0 J7 I& |
a. 不带备份的(右图中的右半部分)# Y  O+ w! M+ H& m/ D5 z$ J0 M
升级服务程序在 Boot 端(OTA Service manager)。) Q5 Y6 ~+ a. W2 ~( @
省空间(存放了 2 份协议栈,1 份应用)
  d" x% Q0 d7 p  P管理简单(只需管理一份应用)7 ~$ {& n4 p' F( i- B
b. 带备份的(右图中的左半部分)
7 M) B3 G2 n2 t% V: \0 R( M" ^升级服务程序在应用端/ f/ t8 x5 m: W1 a% Z/ k3 _* M
更消耗空间(存放了 2 份协议栈,2 份应用)6 b/ }, g- l" X3 o* v: n- J
管理稍微麻烦(需要管理两份应用,Lower 区域应用不能放置 Higher 区域运行)
9 g. U+ j: X  E7 f# i# ^4 \3 p$ Q- R更安全 1 }* Z  Q4 E  G6 n; ^. j

- U  d, p8 y& R
微信图片_20231116191901.jpg
' R" R8 o- i' }! S) l- J/ ?' f) \: E, W9 q. L+ b- M
a. 不带备份的方式由以下组件构成:4 k* q+ r2 [8 C7 `
BLE_OTA_ServiceManager+ application
# S) u1 H, ^" F0 o) P" Eb. 带备份的由以下组件构成:
, u" x. B. S& a% p- u; D+ N/ D/ A+ mBLE_OTA_ResetManager +Lower Application (with BLE OTA service) orBLE_OTA_ResetManager + Higher Application (with BLE OTA service): `: |% q3 c- q. Q; T6 {/ a

- d1 t( q  J# E1 w- y) N  x7 Y- e对应在 SDK 中工程和配置如下图所示:; d- b1 g4 a7 T
a.BLE_OTA_ServiceManager 配合 BLE_SerialPort 中的 Sever_Use_OTA_serviceManager
! s) t/ W% d- K7 `: m$ P2 x& Ab.BLE_OTA_ResetManger 配合 BLE_SerialPort 中的 Service_LowerApp_OTA 或者Service_LowerApp_OTA 使用0 q+ N# Y9 C  J& J/ I' X; e5 g

7 i; K9 h- [; G
微信图片_20231116191859.jpg
7 _( I& b- l! y  x) P

( E) L+ W! W* {( g* @$ R, I) P2.3 使用带备份类型 OTA 升级错误变砖头问题
8 k% m( R- q1 W1 z5 W编译器编译的 Higher Application 如果放置在 Lower Application 的位置,程序无法运行。APP 程序可以知晓当前运行的固件是 Lower 还是 Higher APP。可以在编译固件 Higher Application 和 Lower Application 中加入一些标记,用于给升级工具识别,当前需要下载的是Higher Application 还是 Lower Application 或者是否混用。建议每次发布时两个应用程序都编译生成,不要人为来管理固件,否则容易造成混乱,应该让升级 app 自动选择对应的来升级。
1 q4 p1 w0 n+ N0 B
" ?8 x% D2 z) m8 g4 R5 r! V
* m8 T& {3 E+ `
微信图片_20231116191855.jpg
: q$ p6 D% @2 ^5 V4 n( L5 j# ^- D! P  W" k2 \

% a9 |# w3 x6 z. r03BlueNRG-LP/LPS的存储分析: \5 q1 O* g! W/ y( [' ]5 A
3.1 linker 中宏定义作用范围# V* D6 J+ I( s: _3 b" l7 B
Linker 中可定义一些宏、用于指定链接脚本文件所需的配置。这些宏定义不作用于.c文件或者.h文件,只作用于链接文件(.icf 或者.sct 或者 *.ld)。
2 R8 z- r% l/ K; x' K1 G6 ?: W7 @/ H# P3 O
+ N" Q5 T, [# T" C" V6 m/ A8 t: D
3.2 链接脚本文件分析(代码区域)2 P- ~  Y) P* @- u  x
不同的 IDE 所使用的链接脚本文件的格式不同。比如,Keil 使用“*.sct”文件,IAR 使用“*.icf”文件,而 TrueStudio 使用 “*.ld”文件。
+ E% l3 I4 o. J  A! @  ]" E$ y
4 c  p  A: s. _& _4 ~' w" z2 Z下面分析BlueNRG-LP最新SDK中BLE_SerialPort项目IAR工程目录下的BlueNRG_LP.icf文件, 其他IDE一样,可以进行类比。由于Flash的擦除必须是整页操作的,写Flash之前必须将对应的页擦除,所以Flash的划分需要2KB对齐。就算只使用到0.9KB,也需要划分2KB区域。
0 a8 @3 ]0 k) m8 T; F+ y. R8 p' Y6 [" W# ~$ Y* D# E
默认SDK中提供了4种程序的链接配置:* A- ?0 Z. }9 v+ W
1.CONFIG_OTA_HIGHER
  R6 b, S! U- E6 u0 V; T0 X' x/ X2.CONFIG_OTA_LOWER3 g9 N, d  N' C. y0 W
3.CONFIG_OTA_USE_SERVICE_MANAGER4 }: \# h; A* V  |4 Z2 `  f2 v
4.其他1 q4 m6 `9 u- j$ l
' K6 p. [; f8 F- i  P0 ^
微信图片_20231116191852.jpg ) P1 O: D" [" }! O

2 b1 A) u* _& F3 b5 n5 }4 k对于这四种链接配置编译后,代码区域放置在如下地址。BLE_OTA_ServiceManager 工程使用的是非 OTA 程序,而 BLE_SerialPort 中的 Sever_Use_OTA_serviceManager 工程使用的是CONFIG_OTA_USE_SERVICE_MANAGER。
4 X& ]. z* }7 V# C1 y' d
% r1 ?/ f  F, m+ f
微信图片_20231116191849.jpg 6 B; F  Z" B% m+ o, n

* a/ e# x6 R) p  x( R) h/ a9 v上述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限制这个工程编译的程序空间大小不能超过这个范围。( B6 r, H1 L) w: j- l
# E2 S) z& O9 K0 O8 u; z
如果在linker中没有定义MEMORY_FLASH_APP_SIZE,则对应的4种配置分别是:
# F5 l. q' w7 w: U3 c6 D; O+ \/ d9 a
5 n9 m* ~  o9 K2 S$ v
微信图片_20231116191846.jpg
- K1 J! j+ A: }
7 i  {) j! Z$ v1 ], T; e
MEMORY_FLASH_APP_OFFSET: 定义程序编译链接地址的偏移(非OTA程序)。如果在linker中没有定义MEMORY_FLASH_APP_OFFSET,则对应的4种配置分别是:
! ~) K) Y3 A. x0 T8 v/ N
; s! L- Y4 o' {4 T& z4 M
微信图片_20231116191843.jpg
4 s' Q" D. v7 M
: e( @9 ^' Y2 l4 ?- Y前面提到默认SDK中提供了4种程序的链接配置,本质上只是计算MEMORY_FLASH_APP_OFFSET和MEMORY_FLASH_APP_SIZE的方式不同而已,如果应用需要,也可以改动这个链接脚本文件。
, d$ b' q4 |, h) |; Y6 b- l" Z: k3 _6 j

4 n- O& \; f& i4 I04通过协议栈的初步裁剪与自定义优化空间) ^; b! x: e/ ?( Y2 J
SDK 中默认提供了 4 种默认配置的协议栈加一种自定义的协议栈配置(BLE_STACK_CUSTOM_CONF),如下图所示。) a+ r5 ]& ~2 W& j, w1 S0 s

& Y. Y( ?7 j( a1 P& c3 U
微信图片_20231116191839.jpg
' C+ a( ?4 @. Y8 _& d5 M7 K, k
. \: T) P; S* J0 Y/ p3 x- b4 }6 |3 P
上述 5 种不同协议栈的配置,本质上就是通过使用宏控制不同的特性功能是否打开。只是前面 4种提供了默认便捷的设置,而最后一种可以进行细粒度更细的自定义的协议栈。
. A4 U6 r- N) O6 E, d
; o% e- _$ s+ `可以在 Preprocesor Symbols 中定义相关的宏来配置使用哪种协议栈配置。' T' ^! e: |3 K5 a& B/ ]. ^

1 y3 K5 _: M* @: E% @& s2 j
微信图片_20231116191836.jpg + v0 o; [$ q/ u# i& o' o

, V2 |# y, F3 U如果选用细粒度更细的 BLE_STACK_CUSTOM_CONF 协议栈配置,则在 其中在头文件“custom_ble_stack_config.h”中开关不同功能特性,大致占用的代码如下图所示。
5 i* {  O! X6 I$ j8 _) w% c) u. P% l0 L% C% @9 }
微信图片_20231116191833.jpg
& |; E; W* B/ l) H0 D. ]2 p% I& f; U2 T+ V7 n/ x" x( G7 l. l
1 a+ B% Z& W. f
05协议栈的进一步裁剪:使用静态协议栈
2 x: h4 f; T0 F4 B8 H8 U! H5.1 静态协议栈工程的 4 种默认的配置
( B, {& T; o. d  T5 B' a4 HST 官方 SDK 中已经提供了静态协议栈的 Demo,分为协议栈工程和应用工程两部分,路径为:C:\Users\user name\ST\BlueNRG-LP DK 1.x.x\Projects\BLE_Examples\BLE_StaticStack 静态协议栈工程默认提供了 4 种配置:
  N& ~# m5 V/ Y3 T7 o1 H• Release# n) s! [' `; L3 k* x7 T, f5 ~
• Basic% ^6 h1 b7 ~* S' I. _9 F
• OTA_BTL_ResetManager. n( j) _) P4 t2 d7 v$ c
• OTA_BTL_ResetManager_Basic
8 r$ ~* {) y: h5 c/ v
# _1 p+ B- x# H+ A8 e
C:\Users\user name\ST\BlueNRG-LP DK 1.x.0\Projects\BLE_Examples\BLE_SensorDemo_StaticStack, J8 e, _! j# L+ c
• Release
2 [; M8 S( l6 C: `2 V# f+ e- Z/ z• LowerApp_OTA: Z6 |  \; [! \7 g3 H0 H: C
• HigherApp_OTA! }. v: c. f+ z2 G6 `

1 v9 o. a1 O, P$ i; p: Q
微信图片_20231116191830.jpg
$ a) _+ p. f/ i
  P; R# m: [; U# s
那它们有什么区别呢?它们可以分为两组。& h' U0 S5 |  M, i  c8 ]

- K+ T/ m, B8 r: w
Release 和 Basic 是一组:它们运行时都是由协议栈程序直接跳转到一个固定的应用上;6 D' v! J7 Q6 ~: a, n
; {; h: a, j9 b7 |2 L! ~6 a; w$ G
Release 和 Basic 的区别:Basic 的协议栈配置是 BLE_STACK_BASIC_CONF, 而 Release的协议栈配置是 BLE_STACK_FULL_CONF。
1 l" S5 {) k3 {* [, m  D
& G6 Z+ [+ a( Z( o+ |& Y; Y
不同的协议栈配置,包含的功能和占用的 Flash 空间也不一致。; W8 v0 u" `7 ]) S9 |! v2 J' I
• 不同的协议栈配置包含的功能请查看 stack_user_cfg.h
1 v) e+ p/ V1 ?+ ?& U• 占用的 Flash 空间可以通过编译的 Map 文件查看• 宏 RESET_MANAGER_SIZE 用于协议栈程序的跳转偏移,即预留多少空间给协议栈,因此这个宏的大小也会因为协议栈占用的空间不同而不同。# M. Y5 y* D9 q7 l& y. M7 }) u
• Linker 中宏 MEMORY_FLASH_APP_SIZE 用于定义程序可用的大小。即预留多少空间给协议栈,因此这个宏的大小也会因为协议栈占用的空间不同而不同。 4 b* C8 V. X% }; C+ i
. G* R# h- `* r
OTA_BTL_ResetManager 和 OTA_BTL_ResetManager_Basic 是另外一组:它们都是由协议栈程序跳转到 Lower 应用程序或者 Higher 应用程序;
, I% ~3 D+ e$ n6 E6 t# M4 \6 R# @# U  u% o3 ~) U# ]; f
• OTA_BTL_ResetManager 和 OTA_BTL_ResetManager_Basic 的区别:OTA_BTL_ResetManager_Basic 的协议栈配置是 BLE_STACK_BASIC_CONF, 而OTA_BTL_ResetManager 的协议栈配置是 BLE_STACK_FULL_CONF
6 _5 Y3 }) @+ J
3 l; j, [% {4 B. r9 F( N• 不同的协议栈配置,包含的功能和占用的 Flash 空间也不一致。# G/ Y+ a) E; E, Y/ S% g) t
o 不同的协议栈配置包含的功能请查看 stack_user_cfg.h
) H0 F3 [1 X+ Q1 B& o8 [1 [3 co 占用的 Flash 空间可以通过编译的 Map 文件查看4 D2 g; q& G4 B. ~* i1 q
o 宏 RESET_MANAGER_SIZE 用于协议栈程序的跳转偏移,即预留多少空间给协议栈,因此这个宏的大小也会因为协议栈占用的空间不同而不同。
, |) {. V/ ?  b% ^o Linker 中宏 MEMORY_FLASH_APP_SIZE 用于定义程序可用的大小。即预留多少空间给协议栈,因此这个宏的大小也会因为协议栈占用的空间不同而不同。 ! h  \& I5 ?5 N3 p# `6 k9 ~

  i; W; d: m  _/ f0 B- `6 X! l其中,一个工程负责生成协议栈,另一个工程负责应用,那么这里 BLE_StaticStack 中的Release or Basic 与 OTA_BTL_ResetManager or OTA_BTL_ResetManager_Basic 怎么和Release,LowerApp_OTA 和 HigherApp_OTA 组合呢?
  ]# ]7 t% E9 y$ g9 y& L2 ~, p4 `• BLE_StaticStack 中的 Release or Basic + BLE_SensorDemo_StaticStack 中的Release //不带备份 OTA 的使用固定协议栈的方法( x/ G- @  z& w: |' P
• BLE_StaticStack 中的 OTA_BTL_ResetManager or OTA_BTL_ResetManager_Basic + BLE_SensorDemo_StaticStack 中的 LowerApp_OTA or HigherApp_OTA //带备份OTA 的使用固定协议栈的方法* H6 Q0 c$ C/ I0 z

9 `; S0 T& w0 L9 C/ M2 a' ]' d5.2 将工程实例化为静态协议栈工程编程基础
9 c( B# k! Q' d将工程实例化为静态协议栈涉及比较多的步骤,可以参考官方的文档 :BlueNRG-LP_LPS DK 1.2.0\Projects\BLE_Examples\BLE_SensorDemo_StaticStack\README.txt
% A1 Y  k" @( I: X* N5 d0 [: n) H/ n  x4 ~% Q8 W3 X2 _
以及 SDK 安装目录的 index.html 中的静态协议栈的介绍如下图所示。. b0 o% j! E& D$ Y, s
; J! k3 `$ g' P( ~/ a
微信图片_20231116191827.jpg ! i& {, g8 k' {; c" N3 d

- F$ C0 L1 |3 E6 W/ T* S, j如果在实例化 OTA 程序时,可能需要修改链接脚本和 Preprocesor Symbols 中下面几个宏(具体不同应用,不同 OTA 类型,具体需要定义的宏和宏的数值也不同):
! R" j7 f8 u1 l+ t( q- y+ |, G' @7 N. T
RESET_MANAGER_SIZESERVICE_MANAGER_OFFSETSERVICE_MANAGER_SIZEMEMORY_FLASH_APP_SIZEMEMORY_RAM_APP_OFFSET6 h2 M' P- d3 b$ K& u

! W2 c0 _6 N6 i4 c0 H" M% a5.3 使用默认配置的协议栈7 A. a7 t$ y- e, s/ H! F. T
如果使用了 OTA,发现空间不够,可以考虑将应用协议栈和 OTA 协议栈合并使用如下图所示。6 |1 M  \! a% q2 @7 X

* m1 k2 _3 u1 q, R' z9 H3 p
微信图片_20231116191823.jpg ' [3 |* B0 n5 c: A9 d, O

, z* j* j7 |3 N# T4 J9 e9 P上图列举的是基于 BlueNRG-LP 的默认提供的工程的大致数值(BlueNRG-LPS 类似,这里不再举例)。如果遇到不同的应用,可以实际裁剪协议栈适配不同的应用需求。0 j. w( {* z4 n# z
5 N2 }; }" i. `" M; |
5.4 使用自定义配置的协议栈2 }0 T& x8 Q4 Z
使用静态协议栈可以实现更为精确的函数级别的裁剪:通过注释协议栈工程中的 bluenrg_lp_cmd_if.c 中的 cmd_call_table 中对应的函数,编译时可以将不使用的协议栈函数裁减出协议栈。
$ A" R7 E& M2 o" K+ D- ~+ u8 K. W- x9 g
微信图片_20231116191820.jpg
2 u$ r9 h) x2 B2 t

8 R* ]' P  d0 K+ a8 T# \5.5 使用静态协议栈这种模式如何支持升级协议栈
* z& b6 K0 R* c# _' H3 A" t) H# L当使用静态协议栈,默认协议栈就无法升级。为了能够支持协议栈也升级。需要增加一段 boot代码,当升级协议栈时,先放置在 APP 区域,当升级完协议栈后,将 APP 区域的协议栈拷贝到协议栈区域。接着继续升级被擦除的应用程序。Boot 代码决定搬运协议栈和跳转到下一级。" {* j  n$ |. A, g9 b7 u
; m+ j$ l1 i, L
微信图片_20231116191817.jpg
+ E/ M* E* Q/ v8 y& ?& |! m% M
% B9 W! F9 }' e& q% K% `) e  C
06优化后空间仍不足的其他方法4 ]9 I- k% U) {! k1 T: L* ]
如果使用静态协议栈和空间仍然不足,可以考虑将一些常用而不需修改的通用模块编译进协议栈的工程。如果空间仍然差距比较远则考虑用片外 Falsh 或者选用 STM32WB 系列,再或者使用 STM32+协处理器模式。$ L' |9 k5 p5 N' ?  n
& [: K1 `6 ?' \/ F9 C' r
( S+ [8 g- Z# H
转载自:记帖
5 E8 J7 N) ?1 K( ?1 S如有侵权请联系删除
2 K6 ?* @, {$ S. I5 x  J4 E& F
, B. U" T" R, z/ f2 A! ~+ K9 q
& a! i8 p- x6 Z2 A" ^% K% r% Y

+ U" {9 T  J% \  z$ _8 l7 O0 a
赞 收藏 评论0 发布时间:2023-11-16 19:19

举报

0个回答

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版