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

关于Heap_5的使用

[复制链接]
lebment 发布时间:2020-4-22 16:56
  很少见到关于heap5的使用,特地今天测试了一下,并且分享关于这方面的例子。  软件:CubeMX5.6,Keil5.27,串口助手
- o! _2 v- U+ Y  硬件:STM32L4R5,片外 双SRAM
7 n( y- u! k" h  q& Z) Q+ |5 i; X, Z5 o) P& {
  STEP1: 环境搭建,各项配置
/ W9 _3 v) \" H* l    并不赘述如何配置芯片,自行搭建。" r# f" F) y$ S, _9 `/ j: S

2 B% B0 }! ]8 W5 l. ]6 b/ h2 a  STEP2:修改CubemX代码
1 `) }5 F8 ^- x7 E; a0 }' K! v! g        生成的FreeRTOS的MX_FREERTOS_Init中添加部分代码,如下
( i9 Y3 V; B2 U+ C" G3 `2 W        const HeapRegion_t xHeapRegions[] =# I* _: q. O! f- ?8 g
        {
" ?& {4 U" r" B8 W% I! ~! ^) u                        { ( uint8_t * ) 0x64000000UL, 1024*32 },6 z0 ~) ~0 x* E# I9 q! v
                        { ( uint8_t * ) 0x68000000UL, 1024*32 },
6 d2 ^9 Q6 e2 E7 S7 Q) ]6 l3 W                        { NULL, 0 } /* Terminates the array. */" R+ m( Z% ?# D9 Y! i
        };: i4 Z! {! K2 @5 q

8 [; E4 T* l& W* e7 \  vPortDefineHeapRegions(xHeapRegions);  + Q' p; Z, c" z( e" q
( e5 H$ Z  p. l6 |5 i

4 Y: h7 ~+ {6 t. F  STEP3:测试malloc
. E3 Q1 H7 f# }0 `1 F* J+ J; U7 O- j
    本测试仅有一个任务,
/ ^8 `1 y- c4 O" Y7 f# q1 e, ivoid StartDefaultTask(void const * argument): N' ^, u! |- m! `1 M9 \
{
! n  s% H$ V! B: [  a  /* USER CODE BEGIN StartDefaultTask */
) A0 Z0 r/ D) V5 }        uint8_t * p;
, }* p, c7 R' `9 f/ W        uint32_t size;$ ]+ Z( h- G9 h+ x( D
        uint32_t count = 1;. W8 \, u+ c0 X$ j
        char str[64];
, t# P' ]; A& m9 c2 a0 U7 q  /* Infinite loop */9 j2 R; z& P" U! h  a
  for(;;)) Y' U, k, e! U, B. L. m
  {! ?6 I7 P! P2 h$ v4 \
                if( HAL_GPIO_ReadPin(B1_GPIO_Port,  B1_Pin) == GPIO_PIN_SET )! x; O  t1 g3 f! c
                {4 ]" J  @+ I; U
                        HAL_Delay(10);4 I; R0 ]; A7 A6 l# O$ g# g- j2 r
                        if( HAL_GPIO_ReadPin(B1_GPIO_Port,  B1_Pin) == GPIO_PIN_SET )
2 {, ^* `" D; e/ d6 d+ _! Y                        {
1 S& g& X! \: |7 J8 a) u7 u9 e                                p = pvPortMalloc(1024*2);        . L, i6 {5 W' N
                                size = xPortGetFreeHeapSize();
) a+ c/ L- K' e                                2 k0 N) [* F- v" s  A: F
                                sprintf(str, "malloc times %d\r\n", (uint32_t)count);8 D% u; M0 ]# g; S" t+ {3 `
                                HAL_UART_Transmit(&hlpuart1, (uint8_t *)str, strlen(str), 0xFF);
  T* m! `/ `' ]8 ?" x' [                                memset(str, 0, strlen(str));
' n# q0 O( Z6 v; V: `/ a, p- T                                # v# i! S- m  |) L( J* e
                                sprintf(str, "mem add %x\r\n", (uint32_t)p);
7 I. E' A3 Q8 J8 r# B  l                                HAL_UART_Transmit(&hlpuart1, (uint8_t *)str, strlen(str), 0xFF);          n+ T$ g0 H/ G5 g5 L: _; `3 V
                                memset(str, 0, strlen(str));
2 K# {" N* ^- j  ?0 }9 h+ `                                9 }2 L: W9 g% E% V: p
                                sprintf(str, "Free size Bytes %d\r\n", size);5 @. |$ b# W; V. @+ L" J" @, g
                                HAL_UART_Transmit(&hlpuart1, (uint8_t *)str, strlen(str), 0xFF);# A! M( T0 l6 `6 o# e
                                memset(str, 0, strlen(str));5 z1 [# X/ h$ m7 w0 F& r& M7 ~
- ~4 ^& j8 l: p+ U, V" r
                                sprintf(str, "Free size Bytes %d\r\n", size);
# ?, P6 h' Y( I! V* f                                HAL_UART_Transmit(&hlpuart1, (uint8_t *)str, strlen(str), 0xFF);
& O2 p3 \/ G" }; j7 J6 k                                memset(str, 0, strlen(str));
* o+ N; l. _# X/ e0 {/ g6 q                                                       
' ^! i  R8 w; V" A% O& y: l- H( h                                count++;' Q8 C# [, X2 z. Q0 s
                                  [" Y/ O; I; ]- M* x5 f- p; J- E
                        }
4 ]4 s4 t: T/ X2 Q% ^                }$ a/ u% [6 z5 h! f: t4 e& y9 v
                osDelay(50);
/ P. l* l) K/ [- M! ^. ~  }# T/ C* x  Q0 `
  /* USER CODE END StartDefaultTask */. D% i2 z' |) z2 G! E! W& Y& G
}. v2 i5 l% |+ L$ o) f

8 p" |' c; h3 l  o5 r1 ], V& N0 u3 t/ W* `5 a. G' M! ~  p" w! [& c
测试结果:
, u( U" `6 b0 e/ b3 V# [  malloc times 1
/ A1 x/ v/ X! `* R7 k1 E* S$ X3 ~mem add 64000270
. r# r* Q, l& }5 L2 j6 fFree size Bytes 628488 {4 K! ^6 u# A3 R/ K0 f0 N
Free size Bytes 62848) }4 V% T1 g% O. \* }
malloc times 24 Q; f3 T+ y* A; T9 }. C9 \
mem add 64000a785 |9 q+ c. g, v5 ^4 S/ \- d
Free size Bytes 60792
8 A1 Y4 B/ h6 n8 I$ }Free size Bytes 60792
$ N6 x% [4 f  u$ r+ Gmalloc times 3
8 H) h/ ?; \; f9 rmem add 64001280
4 z* o: P" w3 SFree size Bytes 58736) u& l1 H2 p' R! T5 Y* B4 ?
Free size Bytes 58736- R& k: I* C6 W4 K2 Q
malloc times 4; R/ T$ J* t% E- E
mem add 64001a883 k! T8 t5 `2 Y1 m
Free size Bytes 56680# b9 W* ~% {) n* g0 T
Free size Bytes 56680
" G- U9 G9 K+ W" Y8 t! Tmalloc times 5% Q* W) p3 G* O- P
mem add 64002290/ V1 A* [+ ?0 n
Free size Bytes 54624
: U( A* B: p  N: b! {- M9 ?) AFree size Bytes 54624
/ s! S8 E, K& d+ nmalloc times 6
1 }, P7 }0 E5 w. {4 nmem add 64002a98
7 s2 K7 N/ s4 i# X: oFree size Bytes 525682 g5 w# W1 R9 L+ D+ {
Free size Bytes 525683 Z- u' C  s4 K" |
malloc times 7
& C; D, y6 o7 Z9 G) c$ Ymem add 640032a0/ J- i! u. F. @
Free size Bytes 505123 Q* r# n, D4 j+ Q, A
Free size Bytes 50512
" u. o, i. C/ s- U% v! {% emalloc times 8! _/ L& K% _( c" T6 z9 U# w
mem add 64003aa8
  n# B* n) A1 }) bFree size Bytes 48456
& d- ^3 t; T! t, w; QFree size Bytes 484569 J' o) e) v$ j# L
malloc times 9
3 p) o, N" `% s1 R0 X; `+ Wmem add 640042b0
4 |2 e2 \1 {2 B0 oFree size Bytes 46400( v9 p  Q/ f2 {  h
Free size Bytes 46400; G; q' ]6 p( L4 x' a, s4 \6 }$ g1 H
malloc times 10% B" m: ?* q8 c! w( s: s5 Q1 k
mem add 64004ab8
0 T+ D9 {1 {, RFree size Bytes 44344, Q/ H& ]7 w3 f) r& Q2 k) \/ E
Free size Bytes 44344
! X# S& ~2 }) }2 `" y/ [( Kmalloc times 11
$ A1 C% W2 w  C# D' @7 \& A# |; v# fmem add 640052c01 N" @  a! L7 S2 Q
Free size Bytes 42288
" b; n3 f' {$ D4 r3 K2 oFree size Bytes 42288
/ M6 e7 \+ q( ?  zmalloc times 12+ n; z5 V$ m3 S  R) ^$ B! q+ v) i% K
mem add 64005ac8, E* B! d  b; Y, [6 J. z
Free size Bytes 40232. Q/ \+ [$ L' C" R, K
Free size Bytes 40232
; f. q( E+ K3 F! ?malloc times 13
2 I* q) X) g: o  imem add 640062d04 I' l; @4 M% y3 F  c+ p5 C* R
Free size Bytes 38176( a; j; l4 x5 {7 h4 i% Y
Free size Bytes 38176+ X. v1 P% j1 e
malloc times 14
! C0 I! o. ^0 H3 h5 p7 \mem add 64006ad8
& L. M/ J6 }; x0 f: {7 ]. xFree size Bytes 36120& ?4 P* [+ |/ V! b7 |$ j# t
Free size Bytes 36120
* [3 A: T1 [  m4 x, E4 ?malloc times 155 V* Q4 G9 \' h  T; ~
mem add 640072e0
* V! i6 m8 R- d2 X4 x2 GFree size Bytes 340649 P7 V: y, G! P' x; m  c8 n9 c
Free size Bytes 34064
  P! ^) b7 A9 K7 U1 h( [* Smalloc times 16
6 c9 b) [# V! f/ Pmem add 68000008! C+ D! [: \0 ~; N( `: z# N
Free size Bytes 32008
" r+ m/ Y/ \. k. N6 x4 IFree size Bytes 320088 X9 W, t% b) R% k+ T' y3 E- K
malloc times 17
6 K0 v7 @+ f3 E! D) ]/ Smem add 68000810
5 c4 B5 U" _0 g2 i0 B/ }- ^; |2 oFree size Bytes 29952$ h7 X( @! ~2 g' Z* V
Free size Bytes 29952$ H- a7 Y; N) W4 F; j1 ?
malloc times 18
. Z: U3 P4 A; X3 m/ e3 F: r: lmem add 680010183 Q* ~2 c  Z: i4 f$ B
Free size Bytes 27896
% G  I# v$ }8 _3 KFree size Bytes 27896
# ^1 z7 h% N( Qmalloc times 19, E: w2 Q" ]7 W. ^' u8 |- |, y% A
mem add 680018202 O, j, m% ~4 Z2 n; t# W" M; h, j) `
Free size Bytes 25840
% _; D2 w1 M% d+ GFree size Bytes 25840
4 E5 d4 `! L  W5 imalloc times 208 t. c( u5 f) Z
mem add 680020287 R& `2 s+ E6 }) z* l
Free size Bytes 23784
& E3 u! f  j! P" ^8 F# p. MFree size Bytes 23784/ e4 R* p1 S& T" y. F: f
malloc times 21
3 q1 t7 I. e+ p3 C+ ~mem add 68002830
5 R+ }" l* ?: A& s- R. |5 {Free size Bytes 21728
4 N) V% i$ S, B& d- h4 MFree size Bytes 21728# ~+ G( i: L  W( S
malloc times 22
1 q# ^6 l: A/ A( t  ?5 Q3 B: Ymem add 68003038
! G& Y* J4 f9 n/ WFree size Bytes 19672
- h/ H, b- U1 p1 A0 h% b6 l$ aFree size Bytes 19672
" O/ _. u7 e4 \, s4 I2 t4 _malloc times 23$ u1 Q' V$ c8 ?% w5 v- g- o  x( t3 a' n! x
mem add 680038409 @: \: q* s" _/ s
Free size Bytes 17616" H2 S6 |7 h( |1 i5 q( `* e
Free size Bytes 17616% Z3 n' q/ g/ b; K
malloc times 24
/ d) `. U* U/ Pmem add 68004048
- ?0 |2 p9 c! vFree size Bytes 15560) x! E; S! j) {4 v+ p! E: h
Free size Bytes 15560
8 i0 k9 j6 M4 G& U2 X5 i' i7 Emalloc times 256 G( e' k) D  B; @8 r
mem add 68004850
% X/ q# F+ e* `% I' n, P1 K. }Free size Bytes 13504* T- V9 t2 Q5 Q3 |, C
Free size Bytes 13504
0 m6 F, I, X$ X3 h3 k3 _- H) u5 Ymalloc times 26
3 T8 @* Y  b3 `' c: \5 Kmem add 68005058
2 S3 ^$ R2 b) X' c5 A! T: S6 ^. zFree size Bytes 114489 e" S: s7 T- N5 B
Free size Bytes 11448
$ W1 o" v7 B  x6 Ymalloc times 27
0 z+ X- i1 A' r% N5 wmem add 68005860
; h( E' Y# b) V* IFree size Bytes 9392
% _; Z) g3 P  d7 |$ xFree size Bytes 93920 R4 c. x8 ~- t6 w, U" n+ ~; Q
malloc times 28  L& D3 J0 d3 x  y( M# J* |
mem add 680060688 e. a- Q( o; Z. x9 x
Free size Bytes 7336- j7 o& I' P, g7 E3 }
Free size Bytes 7336
6 U. ^1 I' t$ E/ L0 Xmalloc times 29
: ]  ^  Y+ u5 E* @; fmem add 68006870+ V: }# f: `' B" l- Z% N7 [
Free size Bytes 5280
) O1 r: Q* V$ a4 z" E# Z5 n4 d3 {7 s: ~Free size Bytes 52805 ]0 f3 P5 K- N! }2 J  G4 f) S
malloc times 30$ t- r' N; I3 {+ {: K
mem add 68007078
! y* e9 D9 U! p# v6 TFree size Bytes 3224
# c- j% w$ y/ w* p( _Free size Bytes 3224% t9 e$ |8 O0 V0 O7 r% `
malloc times 31
( N* f; X7 K& c. j2 g/ M+ ?mem add 0
( ]/ T+ e7 l8 i2 {# H$ `0 MFree size Bytes 3224
6 L) E8 Q* W: @6 F: k/ oFree size Bytes 32249 _" q; F, X  e: |& n
7 |3 s% B. z: e& w5 ^1 v
32KB x 2 SRAM,总共64KB,实际可以使用小于64KB,并且每次malloc大小为2KB,实际1024*2+8 = 2056Byets。- \5 J0 x! a3 J; T1 m+ {& a! ^
最后明显大于2056Bytes却还是不能malloc的原因:
  w% z9 @/ G( E. e% ?& T- f第一次malloc地址0x64000270,也就是说624Bytes跳过了, 那么3324-624=2700Bytes, 4 \* W2 v* p& V1 J
第一片SRAM的最后一次malloc 地址0x640072e0,第一片剩余3360-2056=518Bytes,总共2700-518=2182Bytes,; N/ ~5 _3 ?5 R3 ?% A& ?6 W6 }
第二片SRAM的最后一次有效malloc 地址0x68007078,第二片最后剩余922Bytes,总共2182-922<2056Bytes,
" B$ _$ w0 [- w# O7 F0 a/ U
' ]1 G2 b4 _% Z7 Q/ s2 C. s  简单来说,第一片前部分内存,后部分内存,第二片后部分内存都被切开剩余了,虽然剩余3224Bytes,很明显能malloc一次2056Bytes的空间,但是这种碎片应该可以被更小malloc大小用掉。SDRAM使用heap5应该注意这点,而且对于不连续的内存的使用会比较复杂,0x64000000到0x68000000,中间不连续,程序需要考虑,操作内存需要跳到相应地址。我觉得一个if else 就够了。+ M  S1 L/ E8 `
赞 收藏 评论0 发布时间:2020-4-22 16:56

举报

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