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

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

[复制链接]
攻城狮Melo 发布时间:2023-11-16 19:19
01引言* u9 L7 ?! t' u; c) {4 E5 W/ v
客户在使用 BlueNRG-LP/LPS 芯片时,增加 OTA 服务后常常反馈说,编译代码区域超空间了,需要帮忙优化一下。后文主要通过下列步骤进行分析和优化 BlueNRG-LP/LPS 的代码空间:! t% H% d% t1 }
a. 通过分析 BlueNRG-LP/LPS 的 OTA 方式,让客户可以选择合适的方式;8 \$ M# B$ `! S- w" z
b. 通过整体分析 BlueNRG-LP/LPS 的链接文件(*.icf/*.sct/*.ld)了解默认工程的存储分布;8 U7 L+ U' F. J; m; c' ^4 G9 u
c. 通过裁剪协议栈,选择合适的协议栈功能,优化 BlueNRG-LP/LPS 的代码空间;
* F2 n2 m) z& I: ^- Hd. 通过使用静态协议栈,进一步优化 BlueNRG-LP/LPS 的代码空间;, ^/ y# P% C. l- D" L
e. 其他方案; # P& ^& G, o" p

9 E$ R% E, q9 E: A5 Z
微信图片_20231116191908.jpg
' h+ B. S: U: F) e
  K- a3 |1 }- R总的来说通过两个维度来节省空间:一个是协议栈的裁剪维度:主要是通过修改宏配置实现编译对应应用需要的协议栈。另一个是 OTA 和静态协议栈的维度:OTA 和静态协议栈的选择流程图如下图所示! W$ I; Y  `: g) o( C

4 h2 S- s# A# Q. J' Y% X
02BlueNRG-LP/BlueNRG-LPS的OTA
6 T2 m/ s# j  @* }* l+ Y( I2.1 OTA 的框架
0 W; k/ C) u$ A% j手机或者电脑做 GATT Client,给带 OTA 服务的设备升级。
) q$ l0 f" I/ E0 E( }9 Q' \( X3 a$ A  Y+ y
微信图片_20231116191905.jpg & u! C! |2 m; K8 r: g2 t( h0 q
9 A/ ?4 {) l' }' K
2.2 官方提供的 OTA 方式2 t3 g3 Q0 [" X2 z) Y' G
默认提供的 OTA 应用和协议栈编译在一个固件上。
3 c. a1 J2 _9 {, l. La. 不带备份的(右图中的右半部分)5 m+ Z& C" I' F! R3 D/ ~
升级服务程序在 Boot 端(OTA Service manager)。
' m( W2 G0 e/ z# l1 |省空间(存放了 2 份协议栈,1 份应用)/ U2 s. `( V/ i; |
管理简单(只需管理一份应用)
; e5 {' J" |  `/ X( E0 rb. 带备份的(右图中的左半部分)7 ?& k8 i2 L0 |$ M# d9 y
升级服务程序在应用端
! O' ~4 w& ~7 ?9 h0 j8 J7 v更消耗空间(存放了 2 份协议栈,2 份应用)
& ?1 o' f+ Q5 E$ W  F管理稍微麻烦(需要管理两份应用,Lower 区域应用不能放置 Higher 区域运行)5 ~: o  `0 V/ h/ k$ [5 O' P
更安全
6 c% y9 Z; X7 V% A' L' g) ?
4 @% N0 r( @4 k
微信图片_20231116191901.jpg " M" ?/ c( Q# g- Y9 N

/ s* X2 I3 Z, t( |, W* e- _3 fa. 不带备份的方式由以下组件构成:
7 s& X( a2 Q4 [3 EBLE_OTA_ServiceManager+ application
( \' I4 S; n; s% L! xb. 带备份的由以下组件构成:; v# O, x- P5 p0 l4 i
BLE_OTA_ResetManager +Lower Application (with BLE OTA service) orBLE_OTA_ResetManager + Higher Application (with BLE OTA service)
' U' ?/ Y! C4 g: O) J/ z. C6 S/ m- _8 C: X6 {5 [7 }, G0 Z
对应在 SDK 中工程和配置如下图所示:6 W4 ?2 d5 M; M! Z8 N, Y
a.BLE_OTA_ServiceManager 配合 BLE_SerialPort 中的 Sever_Use_OTA_serviceManager
- o$ E9 k5 d) Z; S! c- Gb.BLE_OTA_ResetManger 配合 BLE_SerialPort 中的 Service_LowerApp_OTA 或者Service_LowerApp_OTA 使用
0 @/ C! t/ r7 p
* @+ f7 d3 k: x, h7 j6 b" f: |: g$ |
微信图片_20231116191859.jpg 6 H4 m  x, x  G- I! T

* n# p3 `+ j, _1 _# {2.3 使用带备份类型 OTA 升级错误变砖头问题
2 @% _6 T% R$ B  d/ i& I编译器编译的 Higher Application 如果放置在 Lower Application 的位置,程序无法运行。APP 程序可以知晓当前运行的固件是 Lower 还是 Higher APP。可以在编译固件 Higher Application 和 Lower Application 中加入一些标记,用于给升级工具识别,当前需要下载的是Higher Application 还是 Lower Application 或者是否混用。建议每次发布时两个应用程序都编译生成,不要人为来管理固件,否则容易造成混乱,应该让升级 app 自动选择对应的来升级。
0 j/ F! `* ]/ i+ F5 }* B) d/ U6 M( D
1 @( w; E" n- Z# g
微信图片_20231116191855.jpg : q7 D" y5 Q% p* i
4 {7 w- Z; ?3 q% f6 s+ @

- @* ]% r; t* T; e* F03BlueNRG-LP/LPS的存储分析
& I: A/ V, z, V3.1 linker 中宏定义作用范围( ]8 ]* B4 M, }  k
Linker 中可定义一些宏、用于指定链接脚本文件所需的配置。这些宏定义不作用于.c文件或者.h文件,只作用于链接文件(.icf 或者.sct 或者 *.ld)。
" q, K( j9 W7 L1 @0 g  j1 c
+ q/ G6 V; D$ L- F$ X' Q

( b* x9 j  |* y4 i  ?( T3.2 链接脚本文件分析(代码区域)
. B1 N. n$ a, Z! B# a* }! K8 d1 i不同的 IDE 所使用的链接脚本文件的格式不同。比如,Keil 使用“*.sct”文件,IAR 使用“*.icf”文件,而 TrueStudio 使用 “*.ld”文件。 . Z* E  ]4 V+ E, r

7 X" S' I8 z) `/ S! c5 P* z7 G下面分析BlueNRG-LP最新SDK中BLE_SerialPort项目IAR工程目录下的BlueNRG_LP.icf文件, 其他IDE一样,可以进行类比。由于Flash的擦除必须是整页操作的,写Flash之前必须将对应的页擦除,所以Flash的划分需要2KB对齐。就算只使用到0.9KB,也需要划分2KB区域。
* F; b/ s: V# s/ |. l4 }& K+ o0 x/ A( G
默认SDK中提供了4种程序的链接配置:
9 A9 [5 d' x5 o; E' f1.CONFIG_OTA_HIGHER$ I' v" X) t' P1 y9 A6 a/ O: l
2.CONFIG_OTA_LOWER6 a" W% t) }4 x" M  A
3.CONFIG_OTA_USE_SERVICE_MANAGER5 k5 N# H4 m% A. j  o4 c
4.其他
9 N+ K8 [, p9 N$ C: D+ }- {5 [$ O
微信图片_20231116191852.jpg 1 X/ K) J" p$ [( {# m3 x) p1 H3 ^$ Q

' s' ~5 y: H. i对于这四种链接配置编译后,代码区域放置在如下地址。BLE_OTA_ServiceManager 工程使用的是非 OTA 程序,而 BLE_SerialPort 中的 Sever_Use_OTA_serviceManager 工程使用的是CONFIG_OTA_USE_SERVICE_MANAGER。
- m. X# Z  i. d: H- ^( k
% e4 d% @6 H: j9 L5 {& n/ {7 w
微信图片_20231116191849.jpg 5 H5 F+ E" k3 g! @4 t# `  G

( n3 _) A" w$ k上述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限制这个工程编译的程序空间大小不能超过这个范围。6 M0 k6 o; [4 k1 i
5 x$ Q1 p1 q/ d1 D" `1 p+ _
如果在linker中没有定义MEMORY_FLASH_APP_SIZE,则对应的4种配置分别是:
6 J, Z9 Q: K  |9 c# k7 R" N- Q- }4 ]% G  v$ \9 T' h
微信图片_20231116191846.jpg
/ W# B( Q# a/ f) a5 P) P

1 z5 G+ T) E9 X  lMEMORY_FLASH_APP_OFFSET: 定义程序编译链接地址的偏移(非OTA程序)。如果在linker中没有定义MEMORY_FLASH_APP_OFFSET,则对应的4种配置分别是:
7 O% K2 g7 `0 Z) @4 W) _/ j8 I
) t# B* X0 Y1 p
微信图片_20231116191843.jpg " B8 K: _) c) C8 n' ~. C- B& C1 B/ ^

+ t* w3 V6 p6 m( g前面提到默认SDK中提供了4种程序的链接配置,本质上只是计算MEMORY_FLASH_APP_OFFSET和MEMORY_FLASH_APP_SIZE的方式不同而已,如果应用需要,也可以改动这个链接脚本文件。
! |  p9 q- X+ z" C5 j  D( {
* h/ e3 }* n! z" t* z
" v6 X5 o  W- j+ v
04通过协议栈的初步裁剪与自定义优化空间# s9 b8 z6 B+ ?9 o4 ~  z
SDK 中默认提供了 4 种默认配置的协议栈加一种自定义的协议栈配置(BLE_STACK_CUSTOM_CONF),如下图所示。$ c. {" H) g6 e4 c2 v  _# k# g, P

) ]5 }- k( U: m
微信图片_20231116191839.jpg , F7 C( \- A7 o3 D- l8 N

  s& v) ^4 b4 U4 l; H上述 5 种不同协议栈的配置,本质上就是通过使用宏控制不同的特性功能是否打开。只是前面 4种提供了默认便捷的设置,而最后一种可以进行细粒度更细的自定义的协议栈。 8 a9 J& u9 {* `4 f

3 O" ]: L4 E, O0 ]! m可以在 Preprocesor Symbols 中定义相关的宏来配置使用哪种协议栈配置。4 L! b0 Y- v( E+ l

% B( P9 q" r  ?3 Q8 ~% m& ]8 |& ], L
微信图片_20231116191836.jpg ( R. F- J4 s) S. h

& m+ q+ `2 L! d9 f# e如果选用细粒度更细的 BLE_STACK_CUSTOM_CONF 协议栈配置,则在 其中在头文件“custom_ble_stack_config.h”中开关不同功能特性,大致占用的代码如下图所示。8 h) n4 }: D* ^( \* A$ B
: ]1 |. h0 y* _% y9 |
微信图片_20231116191833.jpg ! N, X" H. Y8 e

0 t. d5 t, A0 ?. U. d

. g9 I3 m, X5 M; p5 Y05协议栈的进一步裁剪:使用静态协议栈; v9 H" ]# x$ M
5.1 静态协议栈工程的 4 种默认的配置% t! w( d( S3 s0 K. o
ST 官方 SDK 中已经提供了静态协议栈的 Demo,分为协议栈工程和应用工程两部分,路径为:C:\Users\user name\ST\BlueNRG-LP DK 1.x.x\Projects\BLE_Examples\BLE_StaticStack 静态协议栈工程默认提供了 4 种配置:
- t& U% k( A; D1 n+ h* U' {7 r• Release
  Z4 m3 S+ J6 e5 z" Z: W• Basic( j3 m# ^- i% u& J. C: d
• OTA_BTL_ResetManager
& L1 _; J9 v9 j- Q• OTA_BTL_ResetManager_Basic7 ~# v3 `, J' W8 U
) Y4 |: n9 U5 o% G+ d
C:\Users\user name\ST\BlueNRG-LP DK 1.x.0\Projects\BLE_Examples\BLE_SensorDemo_StaticStack$ U/ w3 M3 `' g
• Release! X: H' \1 o, D! @) p
• LowerApp_OTA
* N: x% h" a( b" Q• HigherApp_OTA
/ h# z+ J" b; B& e& Y" t+ Y. i  m, x& o
微信图片_20231116191830.jpg
# `5 X2 u" P& V5 p
7 }5 d8 U% X9 f
那它们有什么区别呢?它们可以分为两组。
* d3 J3 J: k6 Q$ K* W1 q
7 t/ D; L1 x3 _. C. ?0 \3 c# k
Release 和 Basic 是一组:它们运行时都是由协议栈程序直接跳转到一个固定的应用上;& ]/ m0 Y% G1 A; s* u; a% o8 C
- I- P. }- @% ^2 I* Z
Release 和 Basic 的区别:Basic 的协议栈配置是 BLE_STACK_BASIC_CONF, 而 Release的协议栈配置是 BLE_STACK_FULL_CONF。' x& |% y# H, u2 {( Y  Y

$ S& a4 r$ K: f3 X5 T1 k不同的协议栈配置,包含的功能和占用的 Flash 空间也不一致。& G3 O6 }  Z$ G8 a1 g0 g
• 不同的协议栈配置包含的功能请查看 stack_user_cfg.h
; b2 V0 M- w+ F: `4 J! Q• 占用的 Flash 空间可以通过编译的 Map 文件查看• 宏 RESET_MANAGER_SIZE 用于协议栈程序的跳转偏移,即预留多少空间给协议栈,因此这个宏的大小也会因为协议栈占用的空间不同而不同。
: i  V( w; r% m! f0 @( l3 ^; V• Linker 中宏 MEMORY_FLASH_APP_SIZE 用于定义程序可用的大小。即预留多少空间给协议栈,因此这个宏的大小也会因为协议栈占用的空间不同而不同。 3 ]& S6 G: p% h( W
- I" m, N) d! f
OTA_BTL_ResetManager 和 OTA_BTL_ResetManager_Basic 是另外一组:它们都是由协议栈程序跳转到 Lower 应用程序或者 Higher 应用程序;
  y& v3 d! U1 ^- K1 d: C
+ q, L1 O; B7 _' H. U6 |& t3 J• OTA_BTL_ResetManager 和 OTA_BTL_ResetManager_Basic 的区别:OTA_BTL_ResetManager_Basic 的协议栈配置是 BLE_STACK_BASIC_CONF, 而OTA_BTL_ResetManager 的协议栈配置是 BLE_STACK_FULL_CONF0 C! m$ G' T2 [
1 v' T: }- y/ f, s  D
• 不同的协议栈配置,包含的功能和占用的 Flash 空间也不一致。
: H+ p* M% q2 x; lo 不同的协议栈配置包含的功能请查看 stack_user_cfg.h, }) Q/ ]; b0 v6 j" }
o 占用的 Flash 空间可以通过编译的 Map 文件查看
/ w* O" Y/ ?2 D' P8 D0 D  Ho 宏 RESET_MANAGER_SIZE 用于协议栈程序的跳转偏移,即预留多少空间给协议栈,因此这个宏的大小也会因为协议栈占用的空间不同而不同。  u; D3 h8 C' q/ {) a- g, x
o Linker 中宏 MEMORY_FLASH_APP_SIZE 用于定义程序可用的大小。即预留多少空间给协议栈,因此这个宏的大小也会因为协议栈占用的空间不同而不同。 . k5 k; k' ?' S5 l# f9 }. _9 k: y
* `$ T; n4 @- ~
其中,一个工程负责生成协议栈,另一个工程负责应用,那么这里 BLE_StaticStack 中的Release or Basic 与 OTA_BTL_ResetManager or OTA_BTL_ResetManager_Basic 怎么和Release,LowerApp_OTA 和 HigherApp_OTA 组合呢?
" z8 Z( c# c! M3 m7 Y• BLE_StaticStack 中的 Release or Basic + BLE_SensorDemo_StaticStack 中的Release //不带备份 OTA 的使用固定协议栈的方法
. T8 U; m1 U9 C6 l* s# `! T4 s• BLE_StaticStack 中的 OTA_BTL_ResetManager or OTA_BTL_ResetManager_Basic + BLE_SensorDemo_StaticStack 中的 LowerApp_OTA or HigherApp_OTA //带备份OTA 的使用固定协议栈的方法
8 e4 `: {$ R( Z9 P7 I9 u& X) G9 M% C7 K
5.2 将工程实例化为静态协议栈工程编程基础
; j' w1 b# `9 ^  E% R: S将工程实例化为静态协议栈涉及比较多的步骤,可以参考官方的文档 :BlueNRG-LP_LPS DK 1.2.0\Projects\BLE_Examples\BLE_SensorDemo_StaticStack\README.txt) k7 B- b& f0 t7 U

1 W; w8 Y4 Y0 b( X- m以及 SDK 安装目录的 index.html 中的静态协议栈的介绍如下图所示。
% ^7 ]% ?" b* u! U: H- A2 k
) {7 l8 z" Q  \7 i1 {. ]
微信图片_20231116191827.jpg
0 v% R9 R) N3 y+ b! |% H% h- P* y

" V$ t2 R: O! P  l. a: O如果在实例化 OTA 程序时,可能需要修改链接脚本和 Preprocesor Symbols 中下面几个宏(具体不同应用,不同 OTA 类型,具体需要定义的宏和宏的数值也不同): 8 u. S# [' o$ j( j( i" i( j# g

: F0 Z& v5 T7 Z# WRESET_MANAGER_SIZESERVICE_MANAGER_OFFSETSERVICE_MANAGER_SIZEMEMORY_FLASH_APP_SIZEMEMORY_RAM_APP_OFFSET
7 ~4 J) ?# I) ~7 n

! ^& `, V: E' B& P2 b- f& B5.3 使用默认配置的协议栈6 C* x" K+ s2 s
如果使用了 OTA,发现空间不够,可以考虑将应用协议栈和 OTA 协议栈合并使用如下图所示。6 [5 y& z! X/ v6 H/ V
, B% m0 e( V9 Q, h* L: i! P0 \
微信图片_20231116191823.jpg
( P2 c" }8 z, E+ `& N/ s+ N1 L! o' R9 v: i( ?
上图列举的是基于 BlueNRG-LP 的默认提供的工程的大致数值(BlueNRG-LPS 类似,这里不再举例)。如果遇到不同的应用,可以实际裁剪协议栈适配不同的应用需求。! q  J4 q5 J6 r% L

3 H+ w6 g. b; a( y3 L8 V5.4 使用自定义配置的协议栈  W7 b( y* x7 v$ A+ g% \
使用静态协议栈可以实现更为精确的函数级别的裁剪:通过注释协议栈工程中的 bluenrg_lp_cmd_if.c 中的 cmd_call_table 中对应的函数,编译时可以将不使用的协议栈函数裁减出协议栈。
+ I0 A* b" |. h) c, ~  @  V$ ]
, @4 e7 R& b1 d3 c
微信图片_20231116191820.jpg 5 u, ?. C6 r* F8 P& o" Z5 U* ?

% X& |+ F0 S2 Y1 O, J5.5 使用静态协议栈这种模式如何支持升级协议栈4 U  S6 k) Z+ g
当使用静态协议栈,默认协议栈就无法升级。为了能够支持协议栈也升级。需要增加一段 boot代码,当升级协议栈时,先放置在 APP 区域,当升级完协议栈后,将 APP 区域的协议栈拷贝到协议栈区域。接着继续升级被擦除的应用程序。Boot 代码决定搬运协议栈和跳转到下一级。2 u% R8 R- k/ {0 i8 W3 n
7 O- X, ], X5 ]6 ^
微信图片_20231116191817.jpg
7 E1 x5 Y6 V, [( o7 b

  J0 y8 q) X3 K- z8 _7 j+ i06优化后空间仍不足的其他方法% z  f! ^5 F$ M+ H2 e# v+ r
如果使用静态协议栈和空间仍然不足,可以考虑将一些常用而不需修改的通用模块编译进协议栈的工程。如果空间仍然差距比较远则考虑用片外 Falsh 或者选用 STM32WB 系列,再或者使用 STM32+协处理器模式。4 B0 H' E/ h5 Z) |1 _. a1 h/ O
2 X# i1 t% T- ^% y
7 S3 }( x/ a# e: Q9 {
转载自:记帖) {7 T- }) V: ?
如有侵权请联系删除% y! m) s' B* m- A& o* v1 B* C  U
, `% a0 _! c8 X& }
3 w7 @8 e" S/ H0 v( ]$ [4 e
( h" P" \5 [1 `3 R- D
收藏 评论0 发布时间:2023-11-16 19:19

举报

0个回答

所属标签

相似技术帖

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