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

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

[复制链接]
攻城狮Melo 发布时间:2023-11-16 19:19
01引言+ r* X7 `. L8 T. S! I3 W1 k
客户在使用 BlueNRG-LP/LPS 芯片时,增加 OTA 服务后常常反馈说,编译代码区域超空间了,需要帮忙优化一下。后文主要通过下列步骤进行分析和优化 BlueNRG-LP/LPS 的代码空间:1 j$ M7 h) ^. _& S7 r
a. 通过分析 BlueNRG-LP/LPS 的 OTA 方式,让客户可以选择合适的方式;) b: d" o1 V- |% l; e. }/ z* W0 @% Y$ x
b. 通过整体分析 BlueNRG-LP/LPS 的链接文件(*.icf/*.sct/*.ld)了解默认工程的存储分布;" Z8 ^3 r1 O3 I3 I' p
c. 通过裁剪协议栈,选择合适的协议栈功能,优化 BlueNRG-LP/LPS 的代码空间;
( B% r2 I( B- N# C3 O2 cd. 通过使用静态协议栈,进一步优化 BlueNRG-LP/LPS 的代码空间;
8 r5 f5 E9 f1 ?- M) qe. 其他方案;
0 e# h' S, }' f6 V. t/ P6 [6 u. S- _- g- n
微信图片_20231116191908.jpg - o: Q( S2 ?3 E+ C! H
. }* U+ e7 o4 r% e1 [3 k' S
总的来说通过两个维度来节省空间:一个是协议栈的裁剪维度:主要是通过修改宏配置实现编译对应应用需要的协议栈。另一个是 OTA 和静态协议栈的维度:OTA 和静态协议栈的选择流程图如下图所示0 Q, q, e) H% v- f

, ^( K4 `1 i2 p1 T! J3 V
02BlueNRG-LP/BlueNRG-LPS的OTA
1 X3 t0 M5 a" O' ?- c# ]% V2.1 OTA 的框架3 h' U0 _5 P7 s8 |: n+ m% o9 l
手机或者电脑做 GATT Client,给带 OTA 服务的设备升级。6 y- O. E6 R' Q. q+ z# D' y
3 w/ |' b8 S$ Z
微信图片_20231116191905.jpg 1 q* X9 C2 M5 x2 F  x
; u7 K' `2 ~* J! ~$ L4 C0 F0 S  I
2.2 官方提供的 OTA 方式/ M  K0 K! _8 a# V3 [
默认提供的 OTA 应用和协议栈编译在一个固件上。3 @* ]+ F( w9 d8 }- y
a. 不带备份的(右图中的右半部分): N. S# {5 w) P, P' ]0 w
升级服务程序在 Boot 端(OTA Service manager)。
; W+ o0 T% ~0 W- I( M# @; R. n* `+ }! b省空间(存放了 2 份协议栈,1 份应用)
( G4 o7 @/ l* c1 H0 J管理简单(只需管理一份应用)- X2 |- d' V  q% K  r5 w
b. 带备份的(右图中的左半部分)
6 o; Y& }7 a! [* n5 g: ^升级服务程序在应用端
, @; s7 ^  d. ?6 ]4 F/ A8 _8 k更消耗空间(存放了 2 份协议栈,2 份应用)
$ D) u5 G; x4 E, ]管理稍微麻烦(需要管理两份应用,Lower 区域应用不能放置 Higher 区域运行)% b& D  Y3 J6 R* Q3 `
更安全
/ l; h" T1 @- J" p  i: W" V6 w2 d8 D. N& f  V9 @4 d
微信图片_20231116191901.jpg   _# Y+ Z! J' K, c1 N9 U8 a1 @
5 p2 ?2 i& X) s4 o9 z( y
a. 不带备份的方式由以下组件构成:9 e5 s% {0 w& D- @$ ^4 i/ J) {$ \
BLE_OTA_ServiceManager+ application
6 O. @8 _" j) }3 F+ Db. 带备份的由以下组件构成:
7 R& j$ O3 J! ~3 p; OBLE_OTA_ResetManager +Lower Application (with BLE OTA service) orBLE_OTA_ResetManager + Higher Application (with BLE OTA service)  h* k) X3 v6 x) t8 g

. Y+ ^- u+ |( ?' w( M. }对应在 SDK 中工程和配置如下图所示:% x( w5 a; Q1 A* J" V
a.BLE_OTA_ServiceManager 配合 BLE_SerialPort 中的 Sever_Use_OTA_serviceManager
0 A& t& v# N, R* Cb.BLE_OTA_ResetManger 配合 BLE_SerialPort 中的 Service_LowerApp_OTA 或者Service_LowerApp_OTA 使用0 n, ?* w( h% t
$ G5 p3 A# p( `) A& J, s+ z
微信图片_20231116191859.jpg   c  p) S8 \/ B1 W, @5 I) @( |  i9 g. R
: f. \* t, r- g- b9 i( a
2.3 使用带备份类型 OTA 升级错误变砖头问题* o9 i1 f: P$ o) N! i  y
编译器编译的 Higher Application 如果放置在 Lower Application 的位置,程序无法运行。APP 程序可以知晓当前运行的固件是 Lower 还是 Higher APP。可以在编译固件 Higher Application 和 Lower Application 中加入一些标记,用于给升级工具识别,当前需要下载的是Higher Application 还是 Lower Application 或者是否混用。建议每次发布时两个应用程序都编译生成,不要人为来管理固件,否则容易造成混乱,应该让升级 app 自动选择对应的来升级。
* w' {. j0 Z) _' m: Y4 I" f/ H* a2 g% W' v2 k- t8 O8 [: Q# M. _

  I% u3 Q: X  U# |' D 微信图片_20231116191855.jpg
5 B. |1 V( q. @9 {0 {7 t1 I# t! ^6 w+ x* G$ z; `  u7 O: y- S+ q8 a, h
9 V% t$ A: ?/ K5 [8 Y
03BlueNRG-LP/LPS的存储分析
, |9 N8 H! f0 q4 ~4 a3.1 linker 中宏定义作用范围& j  i; z; c( I4 `7 J0 u
Linker 中可定义一些宏、用于指定链接脚本文件所需的配置。这些宏定义不作用于.c文件或者.h文件,只作用于链接文件(.icf 或者.sct 或者 *.ld)。
9 b6 j1 B& t' N5 I& G. O9 s, b4 D* `! X( l  i
; F; ?( Z2 S5 Z: ?
3.2 链接脚本文件分析(代码区域)) W) j( C3 X  _0 K+ W6 a
不同的 IDE 所使用的链接脚本文件的格式不同。比如,Keil 使用“*.sct”文件,IAR 使用“*.icf”文件,而 TrueStudio 使用 “*.ld”文件。 & y6 c! D3 n; u& l* |0 T+ T
8 s7 i1 F# D. g' x4 `
下面分析BlueNRG-LP最新SDK中BLE_SerialPort项目IAR工程目录下的BlueNRG_LP.icf文件, 其他IDE一样,可以进行类比。由于Flash的擦除必须是整页操作的,写Flash之前必须将对应的页擦除,所以Flash的划分需要2KB对齐。就算只使用到0.9KB,也需要划分2KB区域。( o4 \5 o6 n6 W3 S. Z7 h9 {' O! D

! f# j- l# ]4 x+ \默认SDK中提供了4种程序的链接配置:
; S9 M$ P' R! o1.CONFIG_OTA_HIGHER5 ~4 f8 y( @. \" k% W
2.CONFIG_OTA_LOWER- U1 z, h9 A/ J9 C6 H5 l% q
3.CONFIG_OTA_USE_SERVICE_MANAGER
9 _6 E! Q- o* v% R- i4.其他" V% `+ d- u8 G: R1 ?; y+ o3 p

4 n- d9 N7 }. _. d% H6 d8 s$ i! a
微信图片_20231116191852.jpg . }* P) l2 P6 g* p) k
* K. B9 R: k1 S6 f; \
对于这四种链接配置编译后,代码区域放置在如下地址。BLE_OTA_ServiceManager 工程使用的是非 OTA 程序,而 BLE_SerialPort 中的 Sever_Use_OTA_serviceManager 工程使用的是CONFIG_OTA_USE_SERVICE_MANAGER。
" W" `. _/ |: D0 U+ p  {; P9 x# i0 q" k; i1 }6 U7 ]
微信图片_20231116191849.jpg
) b" z* h. T2 A( r" w2 H* t  x& r

" |0 H. {# T' b% S上述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限制这个工程编译的程序空间大小不能超过这个范围。# v( ^3 I4 W' e- d

# Q* _$ N; B( {& s7 m" J0 z, _如果在linker中没有定义MEMORY_FLASH_APP_SIZE,则对应的4种配置分别是:
' N7 T: N+ J0 l- ]' @7 T# g
* k9 c5 j+ e+ P" Q  s
微信图片_20231116191846.jpg : l* Y  |$ T% f! f8 k: Y" Z9 s' v
7 Q( c4 z7 o/ x$ X
MEMORY_FLASH_APP_OFFSET: 定义程序编译链接地址的偏移(非OTA程序)。如果在linker中没有定义MEMORY_FLASH_APP_OFFSET,则对应的4种配置分别是:
$ y( b& O7 N- N/ o6 Q  \& D7 W; g0 y& l: G1 Z
微信图片_20231116191843.jpg
5 i: o2 v2 \! n' M( e7 R2 _2 r9 B4 W& I2 z/ J/ a2 [9 O9 y9 O
前面提到默认SDK中提供了4种程序的链接配置,本质上只是计算MEMORY_FLASH_APP_OFFSET和MEMORY_FLASH_APP_SIZE的方式不同而已,如果应用需要,也可以改动这个链接脚本文件。: x; r6 g  i! t% Z2 w/ ^
  b) ~: J3 ^5 z9 ^5 t2 g+ r- M6 v; L
  w1 s5 V+ B* H( S9 o7 c: k
04通过协议栈的初步裁剪与自定义优化空间+ W6 P% b( K6 d) h" X+ z0 p- |
SDK 中默认提供了 4 种默认配置的协议栈加一种自定义的协议栈配置(BLE_STACK_CUSTOM_CONF),如下图所示。
+ _! U6 J; c4 t& d5 K2 O2 f9 G' S$ s% B. c
微信图片_20231116191839.jpg % W( V* \* b( i" }
. S6 P3 {9 K, V, |! S
上述 5 种不同协议栈的配置,本质上就是通过使用宏控制不同的特性功能是否打开。只是前面 4种提供了默认便捷的设置,而最后一种可以进行细粒度更细的自定义的协议栈。 . l7 R: `0 K( @

* v" Q' @+ [" o: A可以在 Preprocesor Symbols 中定义相关的宏来配置使用哪种协议栈配置。" x. K4 E0 |! g* q' g! b
5 x, U/ x4 P5 a1 Q9 E
微信图片_20231116191836.jpg
- N! P  P  u! `  w5 _# _
! D" O  f+ m& c/ K" s* z如果选用细粒度更细的 BLE_STACK_CUSTOM_CONF 协议栈配置,则在 其中在头文件“custom_ble_stack_config.h”中开关不同功能特性,大致占用的代码如下图所示。' z+ X' _9 \' B

' w$ S2 n, ~/ P6 `, S9 B
微信图片_20231116191833.jpg ' N8 d8 e1 s8 Q' C

6 X0 c5 p- [8 b( I0 l6 _
  g: H- S% f* t* C, Y6 h; j# U
05协议栈的进一步裁剪:使用静态协议栈
& j1 M8 C8 g' Q% j" @5.1 静态协议栈工程的 4 种默认的配置% S% l, R7 l- ]( @7 J( m! u+ o1 y9 W
ST 官方 SDK 中已经提供了静态协议栈的 Demo,分为协议栈工程和应用工程两部分,路径为:C:\Users\user name\ST\BlueNRG-LP DK 1.x.x\Projects\BLE_Examples\BLE_StaticStack 静态协议栈工程默认提供了 4 种配置:4 V, ^  u9 r+ `$ F# ]% p3 b, L: x- ~
• Release
% j( k% h# v9 m1 w" x• Basic
& B$ D& p4 Q" R, j• OTA_BTL_ResetManager- f% B# f# e% V1 E) h
• OTA_BTL_ResetManager_Basic
% f2 L0 q; T) H5 |9 C
" L. }* R, E6 _3 v6 D: Y
C:\Users\user name\ST\BlueNRG-LP DK 1.x.0\Projects\BLE_Examples\BLE_SensorDemo_StaticStack" X! N+ V: t- `( W# H) S& q6 G/ ^* @
• Release
; ?6 A: W- w# k" U7 P• LowerApp_OTA
6 l9 T  [& Q# B, t/ R/ Q5 p• HigherApp_OTA( \& \6 O9 k6 r7 U/ Y) m; \
8 _  |) H) o  H
微信图片_20231116191830.jpg - q& i$ Z% E0 Y
; H: \4 P1 L+ l; o- b+ m* B$ D; W
那它们有什么区别呢?它们可以分为两组。  i# l! P% \# S4 F, u% u

% I/ x2 F" o" ]6 P
Release 和 Basic 是一组:它们运行时都是由协议栈程序直接跳转到一个固定的应用上;0 j7 q; k& s8 n; O8 U" S* G

" t& |, J( V# K
Release 和 Basic 的区别:Basic 的协议栈配置是 BLE_STACK_BASIC_CONF, 而 Release的协议栈配置是 BLE_STACK_FULL_CONF。8 }8 m5 f! U% J" U; ^0 V5 b" N
) {! z8 X/ J" v" j! i1 Q+ R
不同的协议栈配置,包含的功能和占用的 Flash 空间也不一致。/ Y" a% A& C0 O7 ]' D
• 不同的协议栈配置包含的功能请查看 stack_user_cfg.h
5 Z7 Z/ V5 Y5 F' o- b• 占用的 Flash 空间可以通过编译的 Map 文件查看• 宏 RESET_MANAGER_SIZE 用于协议栈程序的跳转偏移,即预留多少空间给协议栈,因此这个宏的大小也会因为协议栈占用的空间不同而不同。
* T. j6 ?7 ], `# q3 y" G• Linker 中宏 MEMORY_FLASH_APP_SIZE 用于定义程序可用的大小。即预留多少空间给协议栈,因此这个宏的大小也会因为协议栈占用的空间不同而不同。 - Q, A2 |9 h* S2 f) ~, f1 }, H

8 T1 O! r5 y; X$ J# `' G* IOTA_BTL_ResetManager 和 OTA_BTL_ResetManager_Basic 是另外一组:它们都是由协议栈程序跳转到 Lower 应用程序或者 Higher 应用程序; % }( U, i1 \2 U' }1 D6 a% e7 S/ S

9 P5 h( b7 v' ]9 s# E3 B• OTA_BTL_ResetManager 和 OTA_BTL_ResetManager_Basic 的区别:OTA_BTL_ResetManager_Basic 的协议栈配置是 BLE_STACK_BASIC_CONF, 而OTA_BTL_ResetManager 的协议栈配置是 BLE_STACK_FULL_CONF) r0 R* X  i3 T& w

: l  K5 |# i% J8 f7 c, I• 不同的协议栈配置,包含的功能和占用的 Flash 空间也不一致。) x  c% E3 S" O" S! {% I9 P
o 不同的协议栈配置包含的功能请查看 stack_user_cfg.h
$ L# g7 [  d! H8 Mo 占用的 Flash 空间可以通过编译的 Map 文件查看
4 x! P; ]( {6 W' T: V: R& ao 宏 RESET_MANAGER_SIZE 用于协议栈程序的跳转偏移,即预留多少空间给协议栈,因此这个宏的大小也会因为协议栈占用的空间不同而不同。
" Y' ]$ H1 K7 U2 qo Linker 中宏 MEMORY_FLASH_APP_SIZE 用于定义程序可用的大小。即预留多少空间给协议栈,因此这个宏的大小也会因为协议栈占用的空间不同而不同。
, W# y, {2 R' R( K" u, K, r; t/ ?" J
其中,一个工程负责生成协议栈,另一个工程负责应用,那么这里 BLE_StaticStack 中的Release or Basic 与 OTA_BTL_ResetManager or OTA_BTL_ResetManager_Basic 怎么和Release,LowerApp_OTA 和 HigherApp_OTA 组合呢?
4 Y& e- f6 q1 A9 J( V: G$ R• BLE_StaticStack 中的 Release or Basic + BLE_SensorDemo_StaticStack 中的Release //不带备份 OTA 的使用固定协议栈的方法
4 x+ u8 D& ^% U( ^9 X- a• BLE_StaticStack 中的 OTA_BTL_ResetManager or OTA_BTL_ResetManager_Basic + BLE_SensorDemo_StaticStack 中的 LowerApp_OTA or HigherApp_OTA //带备份OTA 的使用固定协议栈的方法
3 D7 e8 w# U9 c4 u% E: F) H1 m' _5 m3 ^6 Y6 y% I
5.2 将工程实例化为静态协议栈工程编程基础
( n8 K! v% o0 f9 _' _( o将工程实例化为静态协议栈涉及比较多的步骤,可以参考官方的文档 :BlueNRG-LP_LPS DK 1.2.0\Projects\BLE_Examples\BLE_SensorDemo_StaticStack\README.txt! q, n* @8 s- R+ f" i
% Y; i3 a2 ?5 E. A! d
以及 SDK 安装目录的 index.html 中的静态协议栈的介绍如下图所示。3 Q; Z$ F1 z0 T) u$ i
% @6 M/ s5 L( s! S
微信图片_20231116191827.jpg
) S4 W4 _# P+ Q9 o

) P9 Q! m$ N( J: d: s如果在实例化 OTA 程序时,可能需要修改链接脚本和 Preprocesor Symbols 中下面几个宏(具体不同应用,不同 OTA 类型,具体需要定义的宏和宏的数值也不同):
( R$ A- G3 Z6 j4 o  z1 L0 h- Y8 s3 U
RESET_MANAGER_SIZESERVICE_MANAGER_OFFSETSERVICE_MANAGER_SIZEMEMORY_FLASH_APP_SIZEMEMORY_RAM_APP_OFFSET
1 B  e$ d, x2 J
" l7 h' m3 X9 R* ]% ^6 y2 c
5.3 使用默认配置的协议栈
+ i; @; ^, n. G$ ~3 r如果使用了 OTA,发现空间不够,可以考虑将应用协议栈和 OTA 协议栈合并使用如下图所示。: X( u. C. u! G9 G

4 {7 Y$ ^& ^/ o1 W. Y
微信图片_20231116191823.jpg ! p! z; d* ^: f0 Y
# w* D8 j! W: I
上图列举的是基于 BlueNRG-LP 的默认提供的工程的大致数值(BlueNRG-LPS 类似,这里不再举例)。如果遇到不同的应用,可以实际裁剪协议栈适配不同的应用需求。
  h0 g! g: R0 ]% Y7 b1 d2 r
7 _% X" i4 r+ O5.4 使用自定义配置的协议栈
1 b# }( V! J$ u# i使用静态协议栈可以实现更为精确的函数级别的裁剪:通过注释协议栈工程中的 bluenrg_lp_cmd_if.c 中的 cmd_call_table 中对应的函数,编译时可以将不使用的协议栈函数裁减出协议栈。
, x- G8 g, `9 j5 k6 O4 H; t! A. @% N* r1 N4 y
微信图片_20231116191820.jpg 8 ?, s  u3 }  a5 K

7 I+ v8 M- w: O3 J: E0 L) C5 _5.5 使用静态协议栈这种模式如何支持升级协议栈/ n, l. p7 o  |  s/ W
当使用静态协议栈,默认协议栈就无法升级。为了能够支持协议栈也升级。需要增加一段 boot代码,当升级协议栈时,先放置在 APP 区域,当升级完协议栈后,将 APP 区域的协议栈拷贝到协议栈区域。接着继续升级被擦除的应用程序。Boot 代码决定搬运协议栈和跳转到下一级。
9 v+ m3 [8 x+ X7 S4 U* N6 J( L; U3 E1 l8 i/ O8 P
微信图片_20231116191817.jpg
9 y& c' {( {% L! p0 h$ q. \( u

7 P5 C; C; ~" T06优化后空间仍不足的其他方法
; k$ e, @/ _8 H+ K如果使用静态协议栈和空间仍然不足,可以考虑将一些常用而不需修改的通用模块编译进协议栈的工程。如果空间仍然差距比较远则考虑用片外 Falsh 或者选用 STM32WB 系列,再或者使用 STM32+协处理器模式。
7 T+ @' Y, q; L1 s% T3 @( r- \0 S
$ P8 W" R) b; ~7 [: j( n' z
. i9 C& H0 r9 M% B* W# c% \
转载自:记帖5 S* I! c' K$ T, A: B
如有侵权请联系删除3 |8 \2 L3 `( y

/ j; s4 s+ X( \6 _
* u1 p" t, T- f& N8 f
0 x# I9 f6 f  N1 d9 K0 X- z1 `
赞 收藏 评论0 发布时间:2023-11-16 19:19

举报

0个回答

所属标签

相似技术帖

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