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

【经验分享】STM32H7的TCM,SRAM等五块内存的动态内存分配实现

[复制链接]
STMCU小助手 发布时间:2021-12-23 15:00
27.1 初学者重要提示
! l- P( {4 o+ K/ r! i0 f" `! j& t- V  学习本章节前,务必优先学习了解TCM,SRAM等五块内存区的基础知识,比较重要。' t2 q4 M. N9 ?% T
  将RTX5系统的动态内存管理整理了出来,可以同时管理多个分区。如果其它RTOS中使用,记得做互斥保护或者加个调度锁均可。
2 F" n& C6 y  r3 B" l  支持动态内存使用情况统计。
/ u: w2 K6 y( P0 q% {' J27.2 动态内存管理移植
+ A% ^( _, C& l) k+ V  M移植比较简单,仅需添加两个文件到工程即可。
' z  N" p' e; d+ {: K7 t& ?$ Q! \5 Y/ o1 v$ J$ J& B: _
27.2.1 MDK版的移植
5 K# r9 M" B2 ~/ x0 n5 m% r  第1步,添加如下两个文件到MDK中
. a6 h. T# a$ k注,以本章配套例子为例,这两个文件的路径\User\malloc。
$ W3 O; g2 }! I  B5 A( Z5 A& j1 K4 E# o* p
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDcvMTM3OTEwNy0yMDE5.png
+ c8 c  m  T/ x
& K& v/ H2 K' y; P" S6 h" q' K) U; j
  第2步,添加路径。
  s$ R% F: |! Y3 |) L& Y( I: r
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDcvMTM3OTEwNy0yMDE5.png
2 o: \* Z. G$ D3 I9 J
& `# |. R$ u8 y: e- [& Z
  第3步,添加头文件。
5 t- C' H; t0 P% c如果哪个源文件要用到动态内存,包含rtx_lib.h即可,本章配套例子是直接将其放在了bsp.h文件里面,哪个源文件要用到动态内存,直接包含bsp.h头文件即可。
' ]6 e. p0 p! G
+ S5 a8 z2 X$ l/ \, N通过这简单的三步就完成了MDK的移植。
8 T5 ^: ^, [% ^. d( ?* j; s+ s# q$ U4 s9 F& Q) b" g
27.2.2 IAR版的移植% C0 h, ^$ @: O
  第1步,添加如下两个文件到IAR中
! r$ w: j8 r( y4 r7 |1 f& x3 o注,以本章配套例子为例,这两个文件的路径\User\malloc。
7 U! z2 l) _; M0 @( I( I2 C' B$ I0 I' {0 g* b$ Y6 g. e
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDcvMTM3OTEwNy0yMDE5.png

1 K; T) `& ^1 Q& V9 p  {3 o5 o6 X+ J9 Y5 ^- ~$ Y
  第2步,添加路径。! M3 ~4 M7 s; l) }- y/ |/ B
2 E9 T% L, C7 s) D
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDcvMTM3OTEwNy0yMDE5.png

* E( k7 a, c  e* l( c. D
4 W2 R+ R3 s' F1 X  第3步,添加头文件。
2 `% ?7 m1 s) S2 O1 m* d: o如果哪个源文件要用到动态内存,包含rtx_lib.h即可,本章配套例子是直接将其放在了bsp.h文件里面,哪个源文件要用到动态内存,直接包含bsp.h头文件即可。
. K9 |% m% l/ i# y) K
9 l  g* e7 f2 b& l通过这简单的三步就完成了IAR的移植。
5 V, X3 W( `5 Q8 n. o: ^0 g+ U
6 _- D, ?9 @& Z% E: M% r27.3 动态内存的使用方法
' j8 z, L: f0 J/ y+ f下面分别以MDK和IAR为例进行说明:. p1 K" r% Y9 G* E+ y0 [
' y' b" W2 V# I& w9 e
27.3.1 MDK上的动态内存用法
; ?1 s$ T9 N7 \& u! @5 R3 d% M" Q  定义动态内存区$ Y  r  w8 M& B( q
比如当前的主RAM用的DTCM,我们就可以直接定义一块大的数组作为动态内存空间:
3 S! ~& U1 {. W1 }  D3 ]- Z6 n: Q6 y! Z
  1. /* DTCM, 64KB */5 |$ k% X8 C( G# W
  2. /* 用于获取当前使用的空间大小 */0 y. r( J! C$ D0 @0 V/ @4 E
  3. mem_head_t *DTCMUsed; 5 l. r" m2 s% z" m$ y8 y
  4. /* 定义为64位变量,首地址是8字节对齐 */             # c, g4 B) Z1 z% O; @/ {
  5. uint64_t AppMallocDTCM[64*1024/8];
复制代码

" v  `4 V6 [2 Y. H如果要使用AXI SRAM作为动态内存空间,可以使用__attribute__((at( )))指定地址。
- j+ |$ C6 u* P, m0 _5 E3 g
! a! \# }6 D5 Y+ a8 o. J
  1. /* D1域, AXI SRAM, 512KB */: i+ M2 A7 }9 C
  2. /* 用于获取当前使用的空间大小 */& ?! Q) a; i  F8 ?+ r# b- z6 J
  3. mem_head_t *AXISRAMUsed;  
    - e" f) f( x& b& I; J+ n
  4. /* 定义为64位变量,首地址是8字节对齐 */
    ; T! ^/ P$ _4 m0 P; o& t2 I
  5. uint64_t AppMallocAXISRAM[512*1024/8]__attribute__((at(0x24000000)));
复制代码

& ~) U+ D! E3 g( `4 L* s( ~  初始化动态内存区5 @5 H$ f7 r! m3 V# ~( I
调用动态内存管理提供的函数osRtxMemoryInit即可做初始化:1 M) L( T3 a  s0 r3 q2 Q
0 l" M7 {  c: e  X
osRtxMemoryInit(AppMallocDTCM,    sizeof(AppMallocDTCM));; {7 W2 x7 R, j2 `
osRtxMemoryInit(AppMallocAXISRAM, sizeof(AppMallocAXISRAM));4 M9 ?: h$ B6 ~
* v( D6 |4 j9 s# F, Q4 a
  申请动态内存
. p# _# _) L, \* x# I通过函数void *osRtxMemoryAlloc (void *mem, uint32_t size, uint32_t type)做动态内存申请。5 D3 ?# Q; a9 S# Q7 Y

2 ^2 t% y* S$ R# x  u' V! S4 m第1个参数填写内存区首地址,比如申请的AppMallocDTCM,就填AppMallocDTCM即可。" O! ]4 }2 V1 M3 m1 S

% \! s4 \1 r$ k第2个参数填写申请的字节大小,单位字节。
9 R- w& G& I5 O5 I1 F  I. }1 U: {, ^( s& g
第3个参数固定填0即可。+ Q2 o) l1 {- v0 T6 t

2 C6 `, j* U- M6 c& m( _返回值是所申请缓冲区的首地址,如果没有空间可用,将返回NULL,这点要特别注意!
' t0 O1 Z3 a. J- c! ^
8 a# u9 F6 k) k6 {举个例子:- w0 n! M. z: ^3 _( T1 U/ }
* Y. M2 G+ p1 z5 _4 u5 e2 A! V
  1. uint32_t *DTCM_Addres0, *AXISRAM_Addres0;9 A- n# b* `. E, Q/ m8 a- [

  2. 7 @0 M/ v9 j" y
  3. /* 从DTCM申请280字节空间,使用指针变量DTCM_Addres0操作这些空间时不要超过280字节大小 */        ' D/ L+ d( W! w1 O
  4. DTCM_Addres0 = osRtxMemoryAlloc(AppMallocDTCM, 280, 0);
    / w4 Z9 ]' `: U0 ]; Z2 ]! Z, |% Z
  5. DTCMUsed = MemHeadPtr(AppMallocDTCM);8 y8 w7 e( v# e. v, M7 h, \. X
  6. printf("DTCM总大小 = %d字节,申请大小 = 0280字节,当前共使用大小 = %d字节\r\n", ' }7 i) S* |9 s6 G/ m9 f
  7.                                                              DTCMUsed->size, DTCMUsed->used);
    ) t6 h; f$ E! t: x
  8. 6 S' b/ z* r2 }; h# C. h! W# H4 k
  9. /* 从AXI SRAM 申请160字节空间,使用指针变量AXISRAM_Addres0操作这些空间时不要超过160字节大小 */        
    # Y8 a1 m! {9 Y6 n) G! ^4 [# x( w! Z
  10. AXISRAM_Addres0 = osRtxMemoryAlloc(AppMallocAXISRAM, 160, 0);! ~/ ]9 c4 U5 _9 @5 x! F5 W
  11. AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);. }& O, y" ^' c$ ~
  12. printf("AXI SRAM总大小 = %d字节,申请大小 = 0162字节,当前共使用大小 = %d字节\r\n", , \3 B6 Y0 h$ _/ L/ w0 n
  13.                                                             AXISRAMUsed->size, AXISRAMUsed->used);
复制代码

5 E: Z1 Z1 ^! _4 A7 T- ]1 |3 P申请了空间后,就可以直接使用了。另外注意红色字体部分,通过DTCMUsed->used和AXISRAMUsed->used可以获取当前使用的空间大小。
3 n- y: N9 v. @, k
. ~5 Q. M- z, C, I+ O$ K, j  释放动态内存
9 L9 X+ l% g' T2 _, _' ]通过函数uint32_t osRtxMemoryFree (void *mem, void *block)做动态内存释放。9 C4 n( r- T3 O5 s4 {, D

/ g* V8 q. q: E/ O2 r4 v3 Y第1个参数填写内存区首地址,比如释放的AppMallocDTCM,就填AppMallocDTCM即可。
# G  |* }3 p6 g5 w0 v0 f7 t: ^2 x: |  u
第2个参数填写申请内存时所获取的内存区首地址,这里用于释放。
  s. q( j4 j' M, b8 P
5 j* p, ?4 q- I( q2 m返回值,返回1表示成功,返回0表示失败。( ?4 d$ _+ W8 |7 ]1 `# w: u

" W: g& \/ H. {1 L举个例子:
. v4 t8 B. Z# u; M8 Q$ c6 {+ G8 T+ _* u7 k" |" \2 H2 a
  1. /* 释放从DTCM申请的280字节空间 */
    0 X/ @2 J/ j! L- O3 \! Y
  2. osRtxMemoryFree(AppMallocDTCM, DTCM_Addres0);' o( X; ?- ^* e
  3. DTCMUsed = MemHeadPtr(AppMallocDTCM);3 e2 K1 j3 E0 \* y- j6 w
  4. printf("释放DTCM动态内存区申请的0280字节,当前共使用大小 = %d字节\r\n", DTCMUsed->used);, i4 V! N- z1 K, M$ t1 Q. W
  5. 5 U0 Q* L; ^; [! W  D- g
  6. /* 释放从AXI SRAM申请的160字节空间 */
    " X8 W& @6 a7 k" a" _! E
  7. osRtxMemoryFree(AppMallocAXISRAM, AXISRAM_Addres0);
    3 T6 M( V& }. `% w# w# c# b
  8. AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);
      B/ G7 G- f1 U/ d% E, c& p
  9. printf("释放AXI SRAM动态内存区申请的0160字节,当前共使用大小 = %d字节\r\n", AXISRAMUsed->used);
复制代码

$ U4 g: V+ M0 g% s6 _* H2 ^27.3.2 IAR上的动态内存用法0 `6 ^# V) v. ]: ^/ m
注:IAR使用这个动态内存管理,仅在定义时跟MDK略有不同,其它地方是一样的。: @0 v# r. q$ U9 b: \% [
- j4 _9 G$ s/ K+ N+ `& i: I9 v
  定义动态内存区
. U+ F( u8 G/ V' T比如当前的主RAM用的DTCM,我们就可以直接定义一块大的数组作为动态内存空间:
3 V# d) n- x$ F2 ]+ ~9 Z% y: b0 C! q. U1 Q3 a( `
  1. /* DTCM, 64KB */- n# J3 \) i/ c* f9 J, x
  2. /* 用于获取当前使用的空间大小 */
    " D( E1 ~) }0 E9 y* _2 C
  3. mem_head_t *DTCMUsed; # m" `" w; K" N2 y, e; ~8 p) V
  4. /* 定义为64位变量,首地址是8字节对齐 */             ' f7 m+ u0 B6 {* m
  5. uint64_t AppMallocDTCM[64*1024/8];
复制代码

9 d5 B* h* _9 L0 \. d8 ^如果要使用AXI SRAM作为动态内存空间,可以使用__attribute__((at( )))指定地址。/ z: }/ s# c8 F
! I6 ?% g+ D$ q/ H6 \6 m, M
  1. /* D1域, AXI SRAM, 512KB */
    3 d- O6 ]9 J6 \% u0 T
  2. /* 用于获取当前使用的空间大小 */" Q" _  G% o/ O, ]$ a/ Q
  3. mem_head_t *AXISRAMUsed;  
    / `( E* p  r9 ~
  4. /* 指定下面数组的地址为0x24000000 */
    & [( X. t! u. K& E3 Z4 g9 b; f
  5. #pragma location = 0x24000000
    7 y# p  O, R) v
  6. uint64_t AppMallocAXISRAM[512*1024/8];
复制代码
# O) w' c8 ~7 S2 p! L
  初始化动态内存区/ U% c4 W* H* s  e5 G4 d" t
调用动态内存管理提供的函数osRtxMemoryInit即可做初始化:
4 p( V+ Q  O  h! x1 b  _- S, a) _+ u3 N5 t) I
  1. osRtxMemoryInit(AppMallocDTCM,    sizeof(AppMallocDTCM));
    $ E( q% H( O" R2 K2 i  R
  2. osRtxMemoryInit(AppMallocAXISRAM, sizeof(AppMallocAXISRAM));
复制代码

+ e; R$ u/ M+ \6 ?7 ~6 U" {  申请动态内存
2 ?% {9 G' e$ n通过函数void *osRtxMemoryAlloc (void *mem, uint32_t size, uint32_t type)做动态内存申请。3 Y# |6 b: J0 V. J$ S' B
2 w, R) t7 m! U; J. z3 \6 C) e' b
第1个参数填写内存区首地址,比如申请的AppMallocDTCM,就填AppMallocDTCM即可。
: z' S, w' m- c5 I! h( O* \9 r$ s$ g0 D  Q# B" u4 w, p
第2个参数填写申请的字节大小,单位字节。
8 B8 P* ^+ d; z2 O! s$ I! V( E5 F+ b' h$ p! C
第3个参数固定填0即可。# j4 D/ w4 f% r' S
- N' Y) d# z( s7 g! D
返回值是所申请缓冲区的首地址,如果没有空间可用,将返回NULL,这点要特别注意!
- M: J' H! ]5 [0 q
: C; S# C, m6 A举个例子:
" Y# n: {( I/ a; ~& t) S8 N- c6 R. T! d4 e$ a
  1. uint32_t *DTCM_Addres0, *AXISRAM_Addres0;
    + H; z) d" b1 \* o1 n( n9 x% S
  2. 9 f" j" l/ n6 x5 m1 n6 Z% L
  3. /* 从DTCM申请280字节空间,使用指针变量DTCM_Addres0操作这些空间时不要超过280字节大小 */        & m: x" s# |0 {+ O
  4. DTCM_Addres0 = osRtxMemoryAlloc(AppMallocDTCM, 280, 0);4 U. X, }! I! R0 H: ~1 p$ O7 R
  5. DTCMUsed = MemHeadPtr(AppMallocDTCM);% B( a" M* i" i% _( ?& d
  6. printf("DTCM总大小 = %d字节,申请大小 = 0280字节,当前共使用大小 = %d字节\r\n",
    3 t' H  `* y/ e( m3 A9 H5 m( q
  7.                                                              DTCMUsed->size, DTCMUsed->used);
    ; N% M4 c5 [# g, O3 a
  8.   _: {9 }7 y/ u& m7 w3 Y: \
  9. /* 从AXI SRAM 申请160字节空间,使用指针变量AXISRAM_Addres0操作这些空间时不要超过160字节大小 */        
    3 X+ e" M/ C1 b
  10. AXISRAM_Addres0 = osRtxMemoryAlloc(AppMallocAXISRAM, 160, 0);1 @9 e) I0 X/ ]" t# Z- X/ f
  11. AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);
    + m1 @: p) }( Y  d) p. v9 X
  12. printf("AXI SRAM总大小 = %d字节,申请大小 = 0162字节,当前共使用大小 = %d字节\r\n",
    . }0 X5 H7 ~) X! K: x7 A' }
  13.                                                             AXISRAMUsed->size, AXISRAMUsed->used);
复制代码

9 V1 ]& {. Y4 ~! W0 r申请了空间后,就可以直接使用了。另外注意红色字体部分,通过DTCMUsed->used和AXISRAMUsed->used可以获取当前使用的空间大小。, Q" i7 H; O9 U" ^+ y

8 W# w  X: g; X  O. d* ]  释放动态内存
6 I  `! E* V/ X1 T# {  }通过函数uint32_t osRtxMemoryFree (void *mem, void *block)做动态内存释放。
) M# u, s- W- k' p, f8 P% O
" U- t8 {4 T- w$ _  o: [第1个参数填写内存区首地址,比如释放的AppMallocDTCM,就填AppMallocDTCM即可。
9 {" W9 c- P% R4 P5 p* U5 J, j4 i- V6 m( Y- q& O
第2个参数填写申请内存时所获取的内存区首地址,这里用于释放。! g* m; f- W/ c* s

: [; B8 U; h0 |返回值,返回1表示成功,返回0表示失败。0 L  ?6 n; W1 F8 T

6 h* a& o% D: T; j' F" ]举个例子:; f* R1 y1 D. m, A% O' l! U3 ]

2 R" {# F) O4 `/ T# o+ I7 K# o) t
  1. /* 释放从DTCM申请的280字节空间 */3 B* d! o1 H) x  z- Z
  2. osRtxMemoryFree(AppMallocDTCM, DTCM_Addres0);3 ^1 d, n* v6 M8 R5 |7 {
  3. DTCMUsed = MemHeadPtr(AppMallocDTCM);
    / C, U2 ~& }6 i, Y4 P) g
  4. printf("释放DTCM动态内存区申请的0280字节,当前共使用大小 = %d字节\r\n", DTCMUsed->used);) b3 ^- p; Q' R+ k

  5. , K: \! ?& p) i
  6. /* 释放从AXI SRAM申请的160字节空间 */' R* \7 y) b( I# `& W/ y8 a+ N
  7. osRtxMemoryFree(AppMallocAXISRAM, AXISRAM_Addres0);
    7 D9 u5 f- ^- b) u- m5 L0 G7 X
  8. AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);. {0 X" |* ?+ C/ D& Q
  9. printf("释放AXI SRAM动态内存区申请的0160字节,当前共使用大小 = %d字节\r\n", AXISRAMUsed->used)
复制代码

8 \1 h, U+ w! @$ R, Y27.4 实验例程说明(MDK)
& }0 G2 H0 N  ]* w% f, U# U配套例子:$ }6 k9 }/ _" t3 W. |' R# J% _
V7-006_TCM,SRAM等五块内存的动态内存分配实现0 t1 P3 _7 M' @1 h
. G% A1 O4 L4 r8 h1 J2 v
实验目的:
0 f7 l* y+ p& g学习TCM,SRAM等五块内存的动态内存分配实现。
4 I& p& b+ c6 H2 M  F7 h. W6 j* Z7 K+ I3 S# t0 E, |5 h

5 U' q0 d6 H9 \% J. e实验内容
6 V4 d# Q- r6 \. f6 K: {3 _启动自动重装软件定时器0,每100ms翻转一次LED2。
6 F6 D( q: ~6 N" ^# k4 q5 B( z- G. k5 `- z; D* m  H

" Y, r. n* m: f" {" J3 Q实验操作:9 O* S1 i7 J4 y8 _1 ?
K1键按下,从DTCM依次申请280字节,64字节和6111字节。# P" C5 f( v" a; t# Z" l
K1键松开,释放从DTCM申请的空间。
: E* u4 o  Z! nK2键按下,从AXI SRAM依次申请160字节,32字节和2333字节。, @: s( g) H6 c- c
K2键松开,释放从AXI SRAM申请的空间。
' U+ r; v+ D. }% F* @! e8 I: UK3键按下,从D2域SRAM依次申请200字节,96字节和4111字节。
6 B: o( m. k# D: G" ZK3键松开,释放从D2域SRAM申请的空间。
! N( S8 N  }# u; o( j摇杆OK键按下,从D3域SRAM依次申请300字节,128字节和5111字节。# n  b  X+ @$ e5 u
摇杆OK键松开,释放从D3域SRAM申请的空间。
, H: U5 ~3 \& f% d) ~1 F
7 D+ I2 ]9 [: ?% m8 z' y0 g
6 [: U3 R  ?8 ^0 n上电后串口打印的信息:' k& ]7 r: _( S
# e9 O2 x9 r/ ?( C8 n8 u0 p
波特率 115200,数据位 8,奇偶校验位无,停止位 1' T) @8 i+ U2 p

' u9 V0 T! a- |2 i# i
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDcvMTM3OTEwNy0yMDE5.png

) k* l7 I: L' L3 R3 d" b: H8 M7 x  e* }" G: v
程序设计:% R; s1 N: Z6 Y+ M* R. E

, b2 w4 k9 g0 a& W; l  l7 h0 y  系统栈大小分配:
) {( |( _( T1 w/ `: L, F* R7 _( u7 W. J  m" }) i0 j
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDcvMTM3OTEwNy0yMDE5.png
" t6 X/ o! m; z& M. e
5 X6 @* c" w# Y7 d0 @, A4 r
RAM空间用的DTCM:* C, x3 C, C) H* \9 W: ?) V# E5 k

& d  w6 L5 X# B/ Y0 k0 b
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDcvMTM3OTEwNy0yMDE5.png
* q9 A9 a4 r' ~2 M' G" w

; ]7 R) ^5 y& j7 y. t( v  硬件外设初始化, i' V. i" _; h/ f' G# Z- r
) }$ }6 h, ~/ o3 c
硬件外设的初始化是在 bsp.c 文件实现:8 W; f- m9 Q" @) U% M
7 J- s0 l& N0 M* M6 _$ E
  1. /*
    0 `9 d' V" Q: T7 y
  2. *********************************************************************************************************7 P# q6 H2 L. i  p6 V" ^
  3. *        函 数 名: bsp_Init
    : e  y# p5 C9 s$ t7 a& V
  4. *        功能说明: 初始化所有的硬件设备。该函数配置CPU寄存器和外设的寄存器并初始化一些全局变量。只需要调用一次
    5 `. x( g1 X0 A
  5. *        形    参:无
    8 {5 ^: T1 r- D
  6. *        返 回 值: 无( y+ l3 G. E4 h/ y- f
  7. *********************************************************************************************************8 R/ [! \+ U$ F; I( V, x9 |( \7 X
  8. */
    + D) D9 v# J" R. w2 k
  9. void bsp_Init(void)( U' z3 {4 V  X( V, @( ?
  10. {  x6 E3 u2 w2 u  n
  11.     /* 配置MPU */
    6 p( v5 R; u  X" C
  12.         MPU_Config();. \  g7 E6 T8 v  C2 Y! {
  13.         
    $ T& W  j( h: |& f
  14.         /* 使能L1 Cache */
    3 A) D/ Y% e8 a
  15.         CPU_CACHE_Enable();
    ; d, e( B9 O5 Q# y2 m

  16. 4 a+ o. Y; V5 Z  k( _
  17.         /*
    - b+ j. n2 U* G* M3 E+ r
  18.        STM32H7xx HAL 库初始化,此时系统用的还是H7自带的64MHz,HSI时钟:
    ( t" i, f: C4 g1 \! q
  19.            - 调用函数HAL_InitTick,初始化滴答时钟中断1ms。1 x( r) v' P& X( a& w. Y
  20.            - 设置NVIV优先级分组为4。
    & H; w/ t  G. ?2 U: J% o
  21.          */
    $ x4 `+ l6 P- d1 r" B: b7 z4 ^! O: p2 }
  22.         HAL_Init();
    ' O' S( x) \! L

  23.   g9 ?( t( y" \% {2 U
  24.         /*
    5 u4 j; B7 M7 z  s3 N6 _3 j; v
  25.        配置系统时钟到400MHz# r! n* n5 l' i2 N! M' z
  26.        - 切换使用HSE。( i$ z9 L% `0 F# m2 V" \+ u
  27.        - 此函数会更新全局变量SystemCoreClock,并重新配置HAL_InitTick。
    " h3 l! b9 z% p9 [) V' I
  28.     */7 q) ~! i3 m- n% i: M
  29.         SystemClock_Config();0 P- M( [( m1 D; n3 P- ]! f
  30.   n# |' u& ?  p
  31.         /*
    / Y% E& w1 k% g+ S( X/ E
  32.            Event Recorder:
    8 @% F/ B9 x1 o, N4 O  u, \
  33.            - 可用于代码执行时间测量,MDK5.25及其以上版本才支持,IAR不支持。( F6 P' [# K5 T4 t0 m2 ^" }
  34.            - 默认不开启,如果要使能此选项,务必看V7开发板用户手册第xx章) ^; o3 i2 m) X  l! z4 }' d
  35.         */        
    4 d+ E( s  \- q1 @& u2 K8 G- {
  36. #if Enable_EventRecorder == 1  * n* x2 N) T" ?  E: N( H
  37.         /* 初始化EventRecorder并开启 */
    " p) B8 O0 P; `  v2 d
  38.         EventRecorderInitialize(EventRecordAll, 1U);: R% V5 a) t" z# E$ ]2 @
  39.         EventRecorderStart();
    1 _- K. b1 ?- n7 z  b5 g8 K
  40. #endif
    6 h% v* O* a8 _$ e! w
  41.         
    : e. H9 b% Y3 J3 F- E7 @
  42.         bsp_InitKey();            /* 按键初始化,要放在滴答定时器之前,因为按钮检测是通过滴答定时器扫描 */1 s+ }+ s: }; Q9 U% l
  43.         bsp_InitTimer();          /* 初始化滴答定时器 */& R- W0 O$ o! B8 R' W' J
  44.         bsp_InitUart();        /* 初始化串口 */
    6 S# V6 W& r6 v
  45.         bsp_InitExtIO();        /* 初始化FMC总线74HC574扩展IO. 必须在 bsp_InitLed()前执行 */        
    $ [& p1 B. q' o; h9 T6 M7 f& W
  46.         bsp_InitLed();            /* 初始化LED */        ' j5 b- Q/ W3 b; Y5 z
  47. }
复制代码

$ b3 B" h6 x  `; @3 j# @/ q  MPU配置和Cache配置:
+ [9 v" h; ^3 S3 @1 u" m( W8 J数据Cache和指令Cache都开启。+ A& j. L9 Z; d# K. `

. r& o, D/ D5 f) P% a: MAXI SRAM的MPU属性:
- e2 J+ e* `0 X6 ^" k+ p
, p3 B, p) N) Z4 H7 _4 DWrite back, Read allocate,Write allocate。
( Z. S/ T1 _$ q9 I5 [( [: W% [* z3 j) S* \5 t
FMC的扩展IO的MPU属性:8 [6 }. C9 `. o% ~9 o/ I

; c) |2 S: Y6 _& q5 G必须Device或者Strongly Ordered。! U, |6 C# d% F  \2 X* y

: ]$ A- q1 X2 B+ `7 |8 [( {D2 SRAM1,SRAM2和SRAM3的MPU属性:1 _, ^* Q. `5 W; `
2 U- h4 ?. j: b  [; ^# i8 r
Write through, read allocate,no write allocate。. I1 s$ S! ^3 r; [, A9 n
' A1 S% L+ n9 p$ W7 i( ?
D3 SRAM4的MPU属性:
/ Z& d7 X4 N! ?/ |" D; r" n8 e
+ d* s; z. v3 m* E  WWrite through, read allocate,no write allocate。
& `* f& D: f% Y6 |. s* O' r/ e7 g' g- K4 V& ?* y: P* p: U# d% s4 A
  1. /*
    ) e/ ?  [, w8 y' R- ^  e$ b/ I
  2. *********************************************************************************************************
    & D( Q- H/ m! J; P9 F1 n
  3. *        函 数 名: MPU_Config
    " R: f  o4 Q- [- V# _
  4. *        功能说明: 配置MPU2 u$ j$ y* d8 F2 d2 ]( X( e
  5. *        形    参: 无% Z6 Q0 x1 B" E9 t3 M/ }
  6. *        返 回 值: 无4 S9 F, v# T5 h$ ]6 U6 q
  7. *********************************************************************************************************4 S: Y' x$ M. n. p
  8. */
    ! C+ [  s; V) s8 ?- Y2 a
  9. static void MPU_Config( void )& J8 y: ?% \* e- S1 l
  10. {6 M8 u/ i/ j1 P- a1 @  p+ H
  11.         MPU_Region_InitTypeDef MPU_InitStruct;
    . j( [4 o# [7 k) j

  12. 0 ~2 m* |! Z8 S7 ?* K" [3 Y6 W
  13.         /* 禁止 MPU */
    2 ^/ I7 ^8 N! a
  14.         HAL_MPU_Disable();( n, W4 v+ ?/ f: ]* ~6 N% g

  15. 7 i9 _$ ]+ n0 B2 ]8 }0 A
  16.         /* 配置AXI SRAM的MPU属性为Write back, Read allocate,Write allocate */
    ) |7 q! k' n5 Z$ E" f
  17.         MPU_InitStruct.Enable           = MPU_REGION_ENABLE;
    ) W# |, n& M3 O2 [: |; b6 U
  18.         MPU_InitStruct.BaseAddress      = 0x24000000;( O, T; e) E) W6 s- c# r! n' ?
  19.         MPU_InitStruct.Size             = MPU_REGION_SIZE_512KB;
    3 F9 P! a4 l1 G& o- L4 }
  20.         MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
    - M/ U. r; v- C
  21.         MPU_InitStruct.IsBufferable     = MPU_ACCESS_BUFFERABLE;! V, y) w+ b0 E4 Z" b
  22.         MPU_InitStruct.IsCacheable      = MPU_ACCESS_CACHEABLE;! G/ M+ a- Y0 O& L
  23.         MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;) J$ r; c- f+ y0 N
  24.         MPU_InitStruct.Number           = MPU_REGION_NUMBER0;/ L- r4 w9 L5 {3 s3 r/ ~
  25.         MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL1;3 h) y! p, N; s& c  B
  26.         MPU_InitStruct.SubRegionDisable = 0x00;
    , H0 t& d- v* ]: P+ s
  27.         MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;, |6 n; i9 C  X; K3 y: A
  28. . q. G1 G6 K1 k1 Y: x1 M( a4 N
  29.         HAL_MPU_ConfigRegion(&MPU_InitStruct);4 b- f7 ]; V  s# O
  30.         
    2 f2 X: z2 B) x% M5 V  Y
  31.         1 L  C- K! ^' ?
  32.         /* 配置FMC扩展IO的MPU属性为Device或者Strongly Ordered */
    7 x# ~% }# M! g# d- A1 M  f1 x$ J
  33.         MPU_InitStruct.Enable           = MPU_REGION_ENABLE;* E) n# r8 w2 e" Q. M
  34.         MPU_InitStruct.BaseAddress      = 0x60000000;
    8 D' |$ W, D  E8 o. ?% Q) {$ ]
  35.         MPU_InitStruct.Size             = ARM_MPU_REGION_SIZE_64KB;        ! f( C" l  x& D$ T& y3 {" X
  36.         MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;: |- w% W) F0 a# F" J2 i
  37.         MPU_InitStruct.IsBufferable     = MPU_ACCESS_BUFFERABLE;  v1 R& ~: Q& b9 F/ J0 F/ Y; M* t
  38.         MPU_InitStruct.IsCacheable      = MPU_ACCESS_NOT_CACHEABLE;
    1 l0 l9 B+ H1 w( B% g$ A5 p) Z: A/ x
  39.         MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;+ z; ]' n+ F0 M7 H+ v$ V1 _
  40.         MPU_InitStruct.Number           = MPU_REGION_NUMBER1;8 h- p; Y3 k6 C9 n' [
  41.         MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL0;; P! P  [3 D2 ^/ e# E6 N
  42.         MPU_InitStruct.SubRegionDisable = 0x00;% }/ Z  O6 I' ?
  43.         MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;
    , ?/ H4 Z& g& G$ Z: c: e
  44.         
    + }( o' P, t; L# O5 C% ?) g5 a% j; t
  45.         HAL_MPU_ConfigRegion(&MPU_InitStruct);* Q( w& M+ Y1 a7 z: I" F9 ^
  46.         - |9 j+ V1 c# H7 R, |
  47.         /* 配置SRAM1的属性为Write through, read allocate,no write allocate */; X- n0 j8 S" W
  48.     MPU_InitStruct.Enable           = MPU_REGION_ENABLE;
    " F* M: B$ `" F  d& W, l
  49.     MPU_InitStruct.BaseAddress      = 0x30000000;
    % g) \! w. n5 k6 b
  50.     MPU_InitStruct.Size             = ARM_MPU_REGION_SIZE_128KB;        
      ?5 R: v6 k  L9 O9 Q/ U  S
  51.     MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;" @2 J" t" w: {1 e  L: s9 P! o
  52.     MPU_InitStruct.IsBufferable     = MPU_ACCESS_NOT_BUFFERABLE;
    , ^& k1 K  [: [2 u- ^
  53.     MPU_InitStruct.IsCacheable      = MPU_ACCESS_CACHEABLE;
    5 D" a3 q9 d4 s$ D' e3 B% F+ f
  54.     MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;
    2 Z8 }# g. z1 ?
  55.     MPU_InitStruct.Number           = MPU_REGION_NUMBER2;
    3 V4 g1 w8 u0 w( D) n0 @  B' z
  56.     MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL0;: ^+ T2 P& f! Q( o
  57.     MPU_InitStruct.SubRegionDisable = 0x00;/ ^5 Q( [3 r7 K
  58.     MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;; N$ J/ _/ z: V: A1 Q, w2 ~" y

  59. - I- W5 p* E2 R! b) v
  60.     HAL_MPU_ConfigRegion(&MPU_InitStruct);$ y/ z+ \3 N  |
  61.         
    ' g0 L/ W" B. W" u
  62.         /* 配置SRAM2的属性为Write through, read allocate,no write allocate */! F( m2 [7 V0 W* {, i' l- ]6 i, t$ f
  63.     MPU_InitStruct.Enable           = MPU_REGION_ENABLE;; t+ |% g$ P- v& }4 v8 V; d
  64.     MPU_InitStruct.BaseAddress      = 0x30020000;
    5 H# E. ?! w$ [; y0 `
  65.     MPU_InitStruct.Size             = ARM_MPU_REGION_SIZE_128KB;        ' ?  h+ ]- e. V9 i) Z/ ^
  66.     MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;7 T9 N- V  M1 ]9 l0 W' W
  67.     MPU_InitStruct.IsBufferable     = MPU_ACCESS_NOT_BUFFERABLE;
    + p) {8 G6 R, q0 ^- u; t+ a
  68.     MPU_InitStruct.IsCacheable      = MPU_ACCESS_CACHEABLE;: Y# g) n, r4 |# m, K: V" F
  69.     MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;
    % W2 t; e/ R$ L# ~  }0 N0 @
  70.     MPU_InitStruct.Number           = MPU_REGION_NUMBER3;9 @! T. ~  k3 G& t" i6 m9 |( s
  71.     MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL0;  Q7 Q* C3 B- R% z" D
  72.     MPU_InitStruct.SubRegionDisable = 0x00;  ?2 l2 d$ M, K- z- D3 C! p7 ^+ h
  73.     MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;1 o' s) k. m& g

  74. 0 g9 a6 c% N, S' p% s. {2 |9 }$ A3 m3 }& x
  75.     HAL_MPU_ConfigRegion(&MPU_InitStruct);2 ?' C. M" T6 C+ ^# [4 f
  76. ) D# V% b8 M* v4 l/ Y
  77. , C7 @2 S' e& f' ?0 \+ I/ g
  78.     /* 配置SRAM3的属性为Write through, read allocate,no write allocate */: v2 V1 {- ^' M
  79.     MPU_InitStruct.Enable           = MPU_REGION_ENABLE;
    " l  G* a7 X- I- n! a$ t
  80.     MPU_InitStruct.BaseAddress      = 0x30040000;
    , ^. l+ N1 d( y+ i9 q6 X
  81.     MPU_InitStruct.Size             = ARM_MPU_REGION_SIZE_32KB;        
    7 v2 h- u  \; x% M7 t* _; Q! T
  82.     MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
    9 x) l/ O" k0 ]+ Z- K
  83.     MPU_InitStruct.IsBufferable     = MPU_ACCESS_NOT_BUFFERABLE;
    1 ?, b- e5 \3 B. R: w' R& `5 _$ [
  84.     MPU_InitStruct.IsCacheable      = MPU_ACCESS_CACHEABLE;5 r( m2 L  j# ]1 _, D& ]
  85.     MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;
    * R4 _5 \: Q3 @" L$ v
  86.     MPU_InitStruct.Number           = MPU_REGION_NUMBER4;
    % [; P4 n: n9 x- q
  87.     MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL0;! g# W6 d0 N% K3 k+ T
  88.     MPU_InitStruct.SubRegionDisable = 0x00;
    ; Q4 c: J' q$ g$ I0 S
  89.     MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;; ~) Y3 O# _7 n* X" ~

  90. 3 I8 m7 u- ?' G  ~
  91.     HAL_MPU_ConfigRegion(&MPU_InitStruct);& X( p( ~& _+ w3 X1 v2 z
  92.         
    + y3 B# `8 w- w( P
  93.         " u! W3 C9 f+ s
  94.         /* 配置SRAM4的属性为Write through, read allocate,no write allocate */" d- \$ b/ M3 Y  s. u0 A1 r2 j; C. }9 g% h7 o
  95.     MPU_InitStruct.Enable           = MPU_REGION_ENABLE;, }$ y4 x' N$ n2 K" Z5 ^9 B6 I7 |
  96.     MPU_InitStruct.BaseAddress      = 0x38000000;
    5 W1 s  T2 x/ Y2 z
  97.     MPU_InitStruct.Size             = ARM_MPU_REGION_SIZE_64KB;        7 B) v' j% x( g4 W0 U, u. z+ c
  98.     MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;- G" d  I2 \* t1 k3 b
  99.     MPU_InitStruct.IsBufferable     = MPU_ACCESS_NOT_BUFFERABLE;
    ( K5 `7 x/ H8 N% q
  100.     MPU_InitStruct.IsCacheable      = MPU_ACCESS_CACHEABLE;- ~. H8 \. [2 S" {% x" u4 ~0 N5 P
  101.     MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;+ b0 y, r  m' {
  102.     MPU_InitStruct.Number           = MPU_REGION_NUMBER5;1 m" @* e& f$ ~! c  Z" U5 F) Z" M8 l
  103.     MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL0;( b; M6 L2 W1 r
  104.     MPU_InitStruct.SubRegionDisable = 0x00;
    " Q5 x3 e# `) F7 h2 J
  105.     MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;1 _5 V" N, W0 e; A- z

  106. ) H2 @1 K( f9 B6 C* a2 }- {9 Y
  107.     HAL_MPU_ConfigRegion(&MPU_InitStruct);% n8 j3 A) j8 S; Z+ N# m3 v
  108.         ! }$ [: I  o; B5 `3 X3 s
  109.         /*使能 MPU */# k% n; s( B% G* s0 T" ?8 G
  110.         HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);
    . k/ f% p0 {6 |. b" b7 M4 p
  111. }8 \/ m. V# y+ t0 u5 C( x& N( t& E& Q

  112. 4 p  X* [$ m* j3 G/ C
  113. /*
    ! S. z( r7 L% i
  114. *********************************************************************************************************+ h4 A- `6 x. ?* ^* a  J
  115. *        函 数 名: CPU_CACHE_Enable
    ' T9 h5 G+ J$ A! b# W
  116. *        功能说明: 使能L1 Cache# \& W3 ]' ^2 f% ?- X. |) n& J4 }
  117. *        形    参: 无! p" S; x$ O, h
  118. *        返 回 值: 无
    3 ]6 C( \4 M0 ]) k3 @6 K1 y
  119. *********************************************************************************************************4 T8 x0 g! t; s, s' ]2 p
  120. */  v( D  x2 a4 P' P1 |
  121. static void CPU_CACHE_Enable(void)
    ! W. k! }. K* q  `
  122. {
    . y0 R4 G  d3 h
  123.         /* 使能 I-Cache */
    , s& n) a; W9 ?: ~* X  u
  124.         SCB_EnableICache();. n& W  E& a3 B
  125. * X6 ~% E" H- w; _3 {& v& n
  126.         /* 使能 D-Cache */
    ! n0 F# _4 X8 x8 @
  127.         SCB_EnableDCache();
    + A# ?2 o& j7 F* ]# _9 I/ i6 i4 p
  128. }
复制代码

) W! ]8 F4 G" [: D4 ]  主功能:
* m2 _+ L- Z* J0 }5 }. g  c/ O" e
  M4 R7 ~0 ]- J/ Q主程序实现如下操作:/ ?' |9 ]6 F' O% c

) a4 z) Q9 M- w! W6 y! {9 e  启动自动重装软件定时器0,每100ms翻转一次LED2。1 y. }( C" X( `1 v4 ]7 P/ m, r( `
  K1键按下,从DTCM依次申请280字节,64字节和6111字节。2 e( J3 j5 |# Z* \
  K1键松开,释放从DTCM申请的空间。2 t0 x' y' T- W1 ]1 i3 D' y: S. Z
  K2键按下,从AXI SRAM依次申请160字节,32字节和2333字节。8 u, L# a! b" y) x0 l
  K2键松开,释放从AXI SRAM申请的空间。: {6 H5 s, k5 X- Q1 d$ M
  K3键按下,从D2域SRAM依次申请200字节,96字节和4111字节。
# m9 w$ q) D& O" p: K3 [& c1 M  K3键松开,释放从D2域SRAM申请的空间。
- }! l' F- l  }- K  摇杆OK键按下,从D3域SRAM依次申请300字节,128字节和5111字节。
1 z& a: h! y+ @7 M1 a- q6 l# \  摇杆OK键松开,释放从D3域SRAM申请的空间。$ k- z5 b6 G( H, k3 g# q; f- ~
  1. /*
    " @6 r, C: {" Z% M6 K9 x5 M
  2. *********************************************************************************************************0 o! Y  ]1 H- ^4 F
  3. *        函 数 名: main
    - X& t, Z6 J$ Y+ q  v
  4. *        功能说明: c程序入口
    6 R2 D, Z9 y+ w
  5. *        形    参: 无) I. @; ^7 N& E9 y0 M9 N+ f
  6. *        返 回 值: 错误代码(无需处理)
    , W' u. f) R( E7 J) O7 R
  7. *********************************************************************************************************" c9 Y8 h% ~  f/ c
  8. */6 n. O4 I/ D1 v# Z+ ~3 n
  9. int main(void)& I) C; T# ~& g
  10. {2 ?' {: R" `+ E$ {9 N
  11.         uint8_t ucKeyCode;                /* 按键代码 */
    * i2 w: j: S" _/ N
  12.         uint32_t *DTCM_Addres0, *AXISRAM_Addres0, *SRAM1_Addres0, *SRAM4_Addres0;
    9 f$ `3 O" d" g& f
  13.         uint16_t *DTCM_Addres1, *AXISRAM_Addres1, *SRAM1_Addres1, *SRAM4_Addres1;2 f4 n; g, M  G' m
  14.         uint8_t  *DTCM_Addres2, *AXISRAM_Addres2, *SRAM1_Addres2, *SRAM4_Addres2;" a& A/ k8 ?; I# U
  15. 4 t  y$ d: f) `4 T
  16. 8 `" k  i: _; B3 H1 {% g
  17.         bsp_Init();                /* 硬件初始化 */
    7 u/ q0 I8 t3 ]! A% G- R. Y8 W
  18.         ) `4 v, N* n* _8 @; a
  19.         /* 初始化动态内存空间 */
    ( X2 B7 _% P$ ]
  20.         osRtxMemoryInit(AppMallocDTCM,    sizeof(AppMallocDTCM));+ u& ~+ K" c0 }! ~  t8 u: e
  21.         osRtxMemoryInit(AppMallocAXISRAM, sizeof(AppMallocAXISRAM));# ?% [$ T, H( Q; g1 j5 r7 v
  22.         osRtxMemoryInit(AppMallocSRAM1,   sizeof(AppMallocSRAM1));# k3 Y$ L, `; i6 u9 ^# R- c
  23.         osRtxMemoryInit(AppMallocSRAM4,   sizeof(AppMallocSRAM4));, n: g+ M% \2 G+ }
  24.         
    2 {' Z$ F; ~- H
  25.         PrintfLogo();        /* 打印例程名称和版本等信息 */8 S: P2 a3 @# H6 u# q
  26.         PrintfHelp();        /* 打印操作提示 */
    ) r8 O) v; o& E9 {; [& r* W

  27. $ b2 A8 h* E& c9 Y% y3 R8 M
  28.         bsp_StartAutoTimer(0, 100);        /* 启动1个100ms的自动重装的定时器 */
    0 A; ^' M( C$ k& g( {  k
  29.         
    + f! T* P8 U* H% W' \+ @

  30. 1 b. ^6 h, A$ [' W  f3 ^! E
  31.         /* 进入主程序循环体 */: Q% Z1 N% {" X. m* o
  32.         while (1)
    " P4 n& S, t; X2 Q/ t8 G( c
  33.         {7 G+ n* v" r. F: }# d2 [  a
  34.                 bsp_Idle();                /* 这个函数在bsp.c文件。用户可以修改这个函数实现CPU休眠和喂狗 */
    3 a" C% d: k0 \) k* U5 R0 V
  35. . d+ T1 k/ m1 n: I  ]3 D
  36.                 /* 判断定时器超时时间 */% D/ j, }$ [9 o" T; ^" E  M& w
  37.                 if (bsp_CheckTimer(0))        
    : O9 F: G% U+ T9 h
  38.                 {& G( e5 r  F: v7 F0 f
  39.                         /* 每隔100ms 进来一次 */  ! Q) I* u* R+ r
  40.                         bsp_LedToggle(2);
    4 m7 D5 r$ ^2 t- W* [" g
  41.                 }
    7 s2 R0 X2 c4 t( _
  42. # x# Z' a# i" @1 \
  43.                 /* 按键滤波和检测由后台systick中断服务程序实现,我们只需要调用bsp_GetKey读取键值即可。 */2 {4 Y8 o  c( Z' C; k
  44.                 ucKeyCode = bsp_GetKey();        /* 读取键值, 无键按下时返回 KEY_NONE = 0 */
    4 |, M+ ]9 P% p1 U
  45.                 if (ucKeyCode != KEY_NONE)5 ]( C1 D% |. V- i, L
  46.                 {/ }9 \# q$ N6 Y- c2 _' o, @
  47.                         switch (ucKeyCode)  t, q- r% Q" |
  48.                         {- A& r5 ^/ W- Z, i- @0 |  A
  49.                 /* 从DTCM依次申请280字节,64字节和6111字节 */
    $ C& b* p" N- K% v5 l! k% q1 |% T
  50.                                 case KEY_DOWN_K1:        
    7 S8 j5 O1 X; \6 Q
  51.                     /* 从DTCM申请280字节空间,使用指针变量DTCM_Addres0操作这些空间时不要超过280字节大小 */+ ]. m" j' X2 @' l: |" q. h/ @
  52.                                         printf("=========================================================\r\n");4 x, H  K' n$ z+ {6 G& v/ k+ K4 K1 X' u
  53.                                         DTCM_Addres0 = osRtxMemoryAlloc(AppMallocDTCM, 280, 0);
    ) R% c5 ~( Q  `; U7 a, ~) b
  54.                                         DTCMUsed = MemHeadPtr(AppMallocDTCM);
    & f- T% g6 F7 |: ]- V2 v) ]
  55.                                         printf("DTCM总大小 = %d字节,申请大小 = 0280字节,当前共使用大小 = %d字节\r\n", 8 y+ N) V' E8 ?+ P
  56.                                                                                 DTCMUsed->size, DTCMUsed->used);! O2 J# n, M' b4 r
  57.                                 * ?0 j0 ]  i: }6 e* V2 R
  58.                         /* 从DTCM申请64字节空间,使用指针变量DTCM_Addres1操作这些空间时不要超过64字节大小 */        
    ) t/ e7 Z  g  Q# c
  59.                                         DTCM_Addres1 = osRtxMemoryAlloc(AppMallocDTCM, 64, 0);. k8 K$ ~4 G- y, R' R3 O, g
  60.                                         DTCMUsed = MemHeadPtr(AppMallocDTCM);* L% R( f9 X9 N/ @
  61.                                         printf("DTCM总大小 = %d字节,申请大小 = 0064字节,当前共使用大小 = %d字节\r\n",
    $ b  |1 K$ N% J5 U5 j
  62.                                                                                                            DTCMUsed->size, DTCMUsed->used);! L. l# `% v* b8 I2 C
  63.                                 
    8 o0 M  D* G4 Y# K$ r
  64.                     /* 从DTCM申请6111字节空间,使用指针变量DTCM_Addres2操作这些空间时不要超过6111字节大小 */* f( m2 Q8 a$ d* Y+ Z, e, q
  65.                                         DTCM_Addres2 = osRtxMemoryAlloc(AppMallocDTCM, 6111, 0);
    8 _! D& z8 L# P5 ]
  66.                                         DTCMUsed = MemHeadPtr(AppMallocDTCM);
    ! ?% M& ]  |/ Q6 p, ^" P; r8 Z
  67.                                         printf("DTCM总大小 = %d字节,申请大小 = 6111字节,当前共使用大小 = %d字节\r\n", 6 ]+ A7 G( j2 x7 |- y
  68.                                                                                 DTCMUsed->size, DTCMUsed->used);3 y( O& g5 r  \% f' y
  69.                                         break;
    # n& n0 ]! l! L9 o9 e
  70.                                 : }: I  N* {/ T- J
  71.                                 /* 释放从DTCM申请的空间 */0 l' M& t* h: Y( _  ~
  72.                                 case KEY_UP_K1:        
      G) d) J. k1 f
  73.                                         /* 释放从DTCM申请的280字节空间 */3 m8 h' ?8 g, z  }1 f
  74.                                         osRtxMemoryFree(AppMallocDTCM, DTCM_Addres0);
    ! j, `% H- g3 g3 \) s* B. O- Z! b
  75.                                         DTCMUsed = MemHeadPtr(AppMallocDTCM);9 s% M9 c3 d, C5 k
  76.                                         printf("释放DTCM动态内存区申请的0280字节,当前共使用大小 = %d字节\r\n", * x6 \6 [! I6 F& i
  77. DTCMUsed->used);9 |0 i! z( ?9 B9 |$ r# K, V
  78.                                 % z. z& X8 r3 f" B6 [
  79.                                         /* 释放从DTCM申请的64字节空间 */) A3 E  H. s* p# a
  80.                                         osRtxMemoryFree(AppMallocDTCM, DTCM_Addres1);
    - g5 r! j0 d0 M$ X1 X# ?; A  F
  81.                                         DTCMUsed = MemHeadPtr(AppMallocDTCM);
    + B8 x/ o" N9 b$ {
  82.                                         printf("释放DTCM动态内存区申请的0064字节,当前共使用大小 = %d字节\r\n",
    6 Y, V& F+ P$ }) y% B+ ?! Q, c
  83. DTCMUsed->used);
    9 s3 Z1 c) s( c, _
  84.                                 , D4 C/ b8 A2 L" a" v' p, w& V
  85.                                         /* 释放从DTCM申请的6111字节空间 */
    & C. z/ D- D% U2 f- A/ I
  86.                                         osRtxMemoryFree(AppMallocDTCM, DTCM_Addres2);/ x& P" [3 |# F- b! W% q2 F
  87.                                         DTCMUsed = MemHeadPtr(AppMallocDTCM);/ \5 L5 N1 \0 d: K' V
  88.                                         printf("释放DTCM动态内存区申请的6111字节,当前共使用大小 = %d字节\r\n",$ O) U8 o7 K' G3 f
  89. DTCMUsed->used);% C8 w7 p0 j2 _6 \
  90.                                         break;6 _4 }. e/ M# j4 j' c, v* ~$ k
  91.                                 2 q6 ?/ N' d: B; @3 u% U
  92.                                 /* 从AXI SRAM依次申请160字节,32字节和2333字节 */
    ) ~( ^; W3 b' R, r. C# v7 r
  93.                                 case KEY_DOWN_K2:        . W& s2 L' {, A. B9 U8 H
  94.             /* 从AXI SRAM 申请160字节空间,使用指针变量AXISRAM_Addres0操作这些空间时不要超过160字节大小 */" k* Y4 K2 o+ d' q, G- D
  95.                                         printf("=========================================================\r\n");               
    * x4 ~) \4 z1 o" A5 P
  96.                                         AXISRAM_Addres0 = osRtxMemoryAlloc(AppMallocAXISRAM, 160, 0);# _0 m, Z$ s& s! p$ V$ C2 S1 q
  97.                                         AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);( W9 b1 w: {. i5 T  h
  98.                                         printf("AXI SRAM总大小 = %d字节,申请大小 = 0162字节,当前共使用大小 = %d字节\r\n",
    2 n+ T" B1 G. p8 F! t" E
  99.                                                                                 AXISRAMUsed->size, AXISRAMUsed->used);
      N' z5 ?. V* I, M% ~) ^2 Z
  100.                                 : Z* G5 w9 F4 X0 ]& h' r
  101.                         /* 从AXI SRAM 申请32字节空间,使用指针变量AXISRAM_Addres1操作这些空间时不要超过32字节大小 */* n0 X, c; q3 L7 `
  102.                                         AXISRAM_Addres1 = osRtxMemoryAlloc(AppMallocAXISRAM, 32, 0);
    % P. A8 c+ p, ~1 T, V8 w' ~
  103.                                         AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);
    & p4 W) c; G' ]8 _9 x
  104.                                         printf("AXI SRAM总大小 = %d字节,申请大小 = 0032字节,当前共使用大小 = %d字节\r\n",
    - I7 K' \& }9 Q
  105.                                                                                                       AXISRAMUsed->size, AXISRAMUsed->used);3 W! H, f  e9 \7 ?# C; |8 M* X
  106.                                 
    " T& ^0 N- z/ u/ I2 }9 Q$ F+ r' w2 Q+ g
  107. /* 从AXI SRAM 申请2333字节空间,使用指针变量AXISRAM_Addres2操作这些空间时不要超过2333字节大小 */        
    ( u$ d  S* A9 J/ G
  108.                                         AXISRAM_Addres2 = osRtxMemoryAlloc(AppMallocAXISRAM, 2333, 0);
    , }: D3 h- y& x
  109.                                         AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);
    5 e) R6 K' ^. t6 C/ Q' M, [( R
  110.                                         printf("AXI SRAM总大小 = %d字节,申请大小 = 2333字节,当前共使用大小 = %d字节\r\n",
    $ i# t* w( W. d% A% W
  111.                                                                                 AXISRAMUsed->size, AXISRAMUsed->used);$ l0 @7 b& |; f1 k
  112.                                         break;
      P" v1 W* r& `4 F( I, c4 G5 F2 G
  113.                                 
    " k% y; S% [" G: F$ B
  114.                                 /* 释放从AXI SRAM申请的空间 */
    . h9 |& ^8 s5 d* u& `
  115.                                 case KEY_UP_K2:        
      N5 T8 z* u( Q0 n5 T2 j$ _
  116.                                         /* 释放从AXI SRAM申请的160字节空间 */
    7 m7 a7 g1 D$ D1 w8 J1 P, W, a
  117.                                         osRtxMemoryFree(AppMallocAXISRAM, AXISRAM_Addres0);* D0 K* ^9 \+ Z- G
  118.                                         AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);) _# b; x& T( ~- E+ t, |
  119.                                         printf("释放AXI SRAM动态内存区申请的0160字节,当前共使用大小 = %d字节\r\n",
    . e0 i( j6 Q* w& p
  120. AXISRAMUsed->used);
    7 A3 F( @/ U7 n& |, x
  121.                                 
      N1 W6 W$ I* C- C3 S9 ~% B
  122.                                         /* 释放从AXI SRAM申请的32字节空间 */; h. ^9 I6 M0 S7 _* m
  123.                                         osRtxMemoryFree(AppMallocAXISRAM, AXISRAM_Addres1);4 A8 h& f! d, f; C! O9 W
  124.                                         AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);
    $ Q$ Z) g  _6 a; ^% w: v" f
  125.                                         printf("释放AXI SRAM动态内存区申请的0032字节,当前共使用大小 = %d字节\r\n",2 x, q  E0 O2 D) w! n8 y! R- n
  126. AXISRAMUsed->used);7 Z. D; [9 K3 R3 @- ~2 d3 @& e
  127.                                 
    : X, m$ Z( j; q3 x$ e3 |
  128.                                         /* 释放从AXI SRAM申请的2333字节空间 */
    0 L$ s0 k- g7 q: ~
  129.                                         osRtxMemoryFree(AppMallocAXISRAM, AXISRAM_Addres2);
    7 L5 |( T2 t& s( n" f
  130.                                         AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);7 @3 {9 X) r4 u8 W. \5 p
  131.                                         printf("释放AXI SRAM动态内存区申请的2333字节,当前共使用大小 = %d字节\r\n", * Q( f; M' V  ?% m  l
  132. AXISRAMUsed->used);# @& F  f* d1 l) ]& r+ A9 }+ ?. u
  133.                                         break;: x7 u4 [* t, P1 C7 [. y
  134.                                 . @# e* @! f9 ?" k9 {
  135.                                 /* 从D2域SRAM依次申请200字节,96字节和4111字节 */4 ^9 J8 l* B* \
  136.                                 case KEY_DOWN_K3:        
    * s% n+ E1 w8 Z( |* y6 e  a( V
  137.         /* 从D2域的SRAM申请200字节空间,使用指针变量SRAM1_Addres0操作这些空间时不要超过200字节大小 */& K# y* L7 A+ K1 \9 X0 l* B
  138.                                         printf("=========================================================\r\n");               
    & j& K- w# f1 |) Q3 w
  139.                                         SRAM1_Addres0 = osRtxMemoryAlloc(AppMallocSRAM1, 200, 0);$ b' a) D" o4 D& S
  140.                                         SRAM1Used = MemHeadPtr(AppMallocSRAM1);4 n2 H, h" v5 h* z' H; t2 ?" e  M6 @
  141.                                         printf("D2域SRAM总大小 = %d字节,申请大小 = 0200字节,当前共使用大小 = %d字节\r\n", # K1 U( ^5 v2 a
  142.                                                                                 SRAM1Used->size, SRAM1Used->used);& I) G- c: G- K0 t# [: r
  143.                                 $ x8 i$ \$ A0 e
  144.          /* 从D2域的SRAM申请96字节空间,使用指针变量SRAM1_Addres1操作这些空间时不要超过96字节大小 */        
    ; A5 D, ]# k. W4 Y
  145.                                         SRAM1_Addres1 = osRtxMemoryAlloc(AppMallocSRAM1, 96, 0);/ P. Z0 x5 j+ V3 `! Y8 i
  146.                                         SRAM1Used = MemHeadPtr(AppMallocSRAM1);
    5 Z) s8 |% @8 O' K% U0 ~) r8 B# v4 k
  147.                                         printf("D2域SRAM总大小 = %d字节,申请大小 = 0096字节,当前共使用大小 = %d字节\r\n", 4 H. _; f3 M  ]) N
  148.                                                                                                            SRAM1Used->size, SRAM1Used->used);
    1 S8 w3 @, c! c% b* H) j" k
  149.                                 0 [" {$ {3 A* O7 t
  150.          /* 从D2域的SRAM申请4111字节空间,使用指针变量SRAM1_Addres2操作这些空间时不要超过4111字节大小 */
    & s$ L' n% D. a
  151.                                         SRAM1_Addres2 = osRtxMemoryAlloc(AppMallocSRAM1, 4111, 0);
    1 @0 U! ^4 n' G
  152.                                         SRAM1Used = MemHeadPtr(AppMallocSRAM1);
    # W& Y! u1 a  [, ^& g( j
  153.                                         printf("D2域SRAM总大小 = %d字节,申请大小 = 4111字节,当前共使用大小 = %d字节\r\n",
    * K+ M1 d6 ?) i
  154.                                                                                 SRAM1Used->size, SRAM1Used->used);
    ( W& {6 b+ M! s$ k& @
  155.                                         break;- N/ Q: n. i8 ^' @( Q8 X
  156.                                 
    5 H/ Y3 V* m+ D+ {
  157.                                 /* 释放从D2域SRAM申请的空间 */  {: b& @' _* M9 O; U0 p
  158.                                 case KEY_UP_K3:        
    9 I/ P/ \% ]7 w8 B% Y, M
  159.                                         /* 释放从D2域的SRAM申请的200字节空间 */( K8 o) N# {& K) k% o
  160.                                         osRtxMemoryFree(AppMallocSRAM1, SRAM1_Addres0);4 a7 u6 _' ?, z$ j5 J1 e; P% S
  161.                                         SRAM1Used = MemHeadPtr(AppMallocSRAM1);  S1 P9 u. U+ j5 y1 H
  162.                                         printf("释放D2域SRAM动态内存区申请的0200字节,当前共使用大小 = %d字节\r\n",# l& R* ~" t$ V9 n; u6 _% v. V2 Y
  163. SRAM1Used->used);
    ' A! ?* e1 m2 M; c) y1 \. ?
  164.                                 
    - h1 ?' y3 @' I( ~! O( i1 B6 m
  165.                                         /* 释放从D2域的SRAM申请的96字节空间 */, d! Q2 u' B5 x2 k
  166.                                         osRtxMemoryFree(AppMallocSRAM1, SRAM1_Addres1);
    $ @- n7 F/ }. e. A1 \
  167.                                         SRAM1Used = MemHeadPtr(AppMallocSRAM1);
    + W7 x* U  {' Z
  168.                                         printf("释放D2域SRAM动态内存区申请的0096字节,当前共使用大小 = %d字节\r\n",& P$ K6 x( t  y7 ~
  169. SRAM1Used->used);4 M8 C, o* m; y/ I  g) u
  170.                                 
    8 S' q5 `2 W$ h
  171.                                         /* 释放从D2域的SRAM申请的4111字节空间 */
    # o2 ~' O- K- n6 ^+ K( p0 u
  172.                                         osRtxMemoryFree(AppMallocSRAM1, SRAM1_Addres2);* `) j' [# G1 Q# Y1 J- U) t
  173.                                         SRAM1Used = MemHeadPtr(AppMallocSRAM1);' Q6 ~& I2 Q; j' Z1 w; R
  174.                                         printf("释放D2域SRAM动态内存区申请的4111字节,当前共使用大小 = %d字节\r\n",+ _' _5 f; V' d6 C
  175. SRAM1Used->used);- z& f; Y9 z. v+ |) u2 X4 l
  176.                                         break;
    ) @% w6 W9 t* B# S& y- b
  177.                                 & J1 s) `. o# N* U2 k6 r
  178.                                 /* 从D3域SRAM依次申请300字节,128字节和5111字节 */) V" A, y/ s1 x1 K" W$ ~& ?
  179.                                 case JOY_DOWN_OK:        0 ~4 o3 z/ @3 j1 J
  180.             /* 从D3域的SRAM申请300字节空间,使用指针变量SRAM4_Addres0操作这些空间时不要超过300字节大小 */  T# u. ?1 h, N  ]) ^
  181.                                         printf("=========================================================\r\n");               
    2 I( V2 ?% J8 j0 E0 q, p1 ]
  182.                                         SRAM4_Addres0 = osRtxMemoryAlloc(AppMallocSRAM4, 300, 0);2 a7 b( a- s- @
  183.                                         SRAM4Used = MemHeadPtr(AppMallocSRAM4);, s4 d; J5 L1 j9 E+ U( E: L; j0 P
  184.                                         printf("D3域SRAM总大小 = %d字节,申请大小 = 0300字节,当前共使用大小 = %d字节\r\n", ' U/ C5 t# M/ |, |) R" J3 `
  185.                                                                                 SRAM4Used->size, SRAM4Used->used);
      @/ @5 r& f, u& ]/ V2 O/ p
  186.                                 8 |/ M1 f) o8 s6 |
  187.                 /* 从D3域的SRAM申请96字节空间,使用指针变量SRAM4_Addres1操作这些空间时不要超过96字节大小 */
    $ I' {' V5 n0 ~$ c& v' e4 I
  188.                                         SRAM4_Addres1 = osRtxMemoryAlloc(AppMallocSRAM4, 128, 0);* Y) g- H( D0 {6 k% Q' W
  189.                                         SRAM4Used = MemHeadPtr(AppMallocSRAM4);
    3 n0 M2 s: B: E: G0 a4 X) F8 ?
  190.                                         printf("D3域SRAM总大小 = %d字节,申请大小 = 0128字节,当前共使用大小 = %d字节\r\n", " s/ _7 L/ b! h4 X6 o
  191.                                                                                                            SRAM4Used->size, SRAM4Used->used);
    + _. j9 i' n: ^. ^
  192.                                 
    & `! e. b/ E' [" P7 I2 R; o
  193.         /* 从D3域的SRAM申请5111字节空间,使用指针变量SRAM4_Addres2操作这些空间时不要超过5111字节大小 */
    0 H* x6 D! S8 i2 a" [
  194.                                         SRAM4_Addres2 = osRtxMemoryAlloc(AppMallocSRAM4, 5111, 0);
    / L( T. f3 ~% j% I
  195.                                         SRAM4Used = MemHeadPtr(AppMallocSRAM4);
    9 o' T/ V5 p. o' p% S9 G
  196.                                         printf("D3域SRAM总大小 = %d字节,申请大小 = 5111字节,当前共使用大小 = %d字节\r\n",
    , E' ~2 D2 \0 g; X
  197.                                                                                 SRAM4Used->size, SRAM4Used->used);0 T5 T9 Q. C5 ^$ M% U
  198.                                         break;
    6 J; b) Q% e9 C* R
  199.                                 
    ' O! n$ K6 \7 Z8 K6 A" b! P- D9 n
  200.                                 /* 释放从D3域SRAM申请的空间 */, I% j" m* i# u$ R9 d( Z% {
  201.                                 case JOY_UP_OK:        8 G1 G6 k* C# p# I
  202.                                         /* 释放从D3域的SRAM申请的300字节空间 */
    : e5 L$ d9 b2 E( B3 t
  203.                                         osRtxMemoryFree(AppMallocSRAM4, SRAM4_Addres0);
    , w( x9 [  J8 b( _5 e4 Z5 ^' @
  204.                                         SRAM4Used = MemHeadPtr(AppMallocSRAM4);9 a$ E: F' O" d( Z# l
  205.                                         printf("释放D3域SRAM动态内存区申请的0300字节,当前共使用大小 = %d字节\r\n",
    3 t- m2 l9 U: g( a2 e4 s; U
  206. SRAM4Used->used);
    $ [0 J+ c" ]; t' E
  207.                                 # T2 c8 k3 l& i, I6 v
  208.                                         /* 释放从D3域的SRAM申请的128字节空间 */
    5 a! [6 u- b8 o' A
  209.                                         osRtxMemoryFree(AppMallocSRAM4, SRAM4_Addres1);
    % Q7 c$ Y0 Q+ m7 j4 x; _
  210.                                         SRAM4Used = MemHeadPtr(AppMallocSRAM4);' }) y2 x1 _$ I! y
  211.                                         printf("释放D3域SRAM动态内存区申请的0128字节,当前共使用大小 = %d字节\r\n",1 _4 O" z: q7 }. N6 P
  212. SRAM4Used->used);( w" d& ^* s) u; p5 P" R6 q8 q
  213.                                 7 }; U0 c1 J( u1 C& |) E% D: c- d
  214.                                         /* 释放从D3域的SRAM申请的5111字节空间 */4 k; \/ c" P2 A
  215.                                         osRtxMemoryFree(AppMallocSRAM4, SRAM4_Addres2);
    0 S  O9 k, h0 ]) t
  216.                                         SRAM4Used = MemHeadPtr(AppMallocSRAM4);4 @  }+ f8 w% e2 i4 I) z
  217.                                         printf("释放D3域SRAM动态内存区申请的5111字节,当前共使用大小 = %d字节\r\n",1 @( D9 _) ^! k  @# \
  218. SRAM4Used->used);1 X$ z0 i* B) x
  219.                                         break;
    7 s+ m$ ~% X. {3 k  w; x
  220.                         
    - v+ w. X* y# F8 n
  221.                                 default:
    : m- O# d. m1 E" g1 }3 j- l7 ^
  222.                                   /* 其它的键值不处理 */
    ) V6 Z% d5 g7 d$ u8 ^5 f
  223.                                   break;- j, f2 l, \: v
  224.                         }2 y7 x$ e1 g' g( z
  225.                 }; V1 p/ c8 m) d8 I4 T6 Q
  226.         }$ D: H0 r/ c' d
  227. }
复制代码
' O3 k2 z) i* Y! J- ]
27.5 实验例程说明(IAR)& u- u  w  o4 I4 F! d3 r  Y
配套例子:# q$ R- L4 v0 ?3 l+ q1 x
V7-006_TCM,SRAM等五块内存的动态内存分配实现: e' {$ o! D2 z# [8 _
* k: d+ i% ^0 T8 t& j& `4 Z
实验目的:& Z6 ~# T$ [( u1 L/ h, {! }
学习TCM,SRAM等五块内存的动态内存分配实现。
/ x. B: g' U0 m* Z8 A! E
5 G2 }" }- V# M' }0 g0 l+ M2 `' c6 v( V; I6 b8 G
实验内容:% J+ Y* K4 h- k/ ~  X
启动自动重装软件定时器0,每100ms翻转一次LED2。' n& q5 |" g  T% s; d: N. ]# Y3 f

/ i! c4 @/ `" y8 Z2 K实验操作:% d% ~* V$ O4 W, \9 J9 o. S
K1键按下,从DTCM依次申请280字节,64字节和6111字节。
3 f0 R; a+ l4 h# ?6 Y' SK1键松开,释放从DTCM申请的空间。) m! I# Q/ E' q$ O
K2键按下,从AXI SRAM依次申请160字节,32字节和2333字节。* }7 f) t; L7 P
K2键松开,释放从AXI SRAM申请的空间。
7 f0 c; J8 l* Z0 K* IK3键按下,从D2域SRAM依次申请200字节,96字节和4111字节。
4 O/ S7 I/ U5 PK3键松开,释放从D2域SRAM申请的空间。0 S  L9 T  ^. S" |$ X2 Q
摇杆OK键按下,从D3域SRAM依次申请300字节,128字节和5111字节。
8 s. p/ T4 W' i& v摇杆OK键松开,释放从D3域SRAM申请的空间。/ J  _8 t0 Z4 C# m
! P! m5 h3 b' S
上电后串口打印的信息:
3 d/ A1 [- Q- b2 ]% z, f/ a: B4 T" D$ |/ T
波特率 115200,数据位 8,奇偶校验位无,停止位 1
3 P3 r. R8 d* R. L* H+ @
+ ~$ ~* F# }+ ^
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDcvMTM3OTEwNy0yMDE5.png

' I. v8 ^8 L& J2 J: s, i9 ?1 O0 ]$ D# \3 }% e) t4 J
程序设计:
& v3 M- G  a: r% I/ v
% ]2 |: d- ^3 q: a( ^  系统栈大小分配:
7 V% T9 c2 F; x, |% {
4 `% U- e) t* e* ~/ L5 q
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDcvMTM3OTEwNy0yMDE5.png

8 Q/ `! |/ B) W2 N: e( w9 d2 @% `9 R+ P. J8 u0 Z
  RAM空间用的DTCM:$ s; m+ U. y. l5 s
& @: B% }- w3 A, X+ R
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDcvMTM3OTEwNy0yMDE5.png
5 _4 y6 a( _9 ~
, d* \' t& Y8 ?: r
  硬件外设初始化
9 z/ _# E, G1 S% d" A

7 Z. g1 T: I, L硬件外设的初始化是在 bsp.c 文件实现:7 x# M% b  ^( O# V- D/ E; A6 v! \

: _' D$ G: B. c3 N1 P8 m6 U
  1. /*
    # |  K8 W1 L" c# \' E
  2. *********************************************************************************************************
    ( U' n8 Z1 u* _) h9 R8 R# d7 @
  3. *        函 数 名: bsp_Init8 U; N" _/ i8 W
  4. *        功能说明: 初始化所有的硬件设备。该函数配置CPU寄存器和外设的寄存器并初始化一些全局变量。只需要调用一次* S0 Q$ ~' j. R
  5. *        形    参:无
    0 {& v, V& m% q$ [& V  r. g
  6. *        返 回 值: 无# {: L( y8 z! O
  7. *********************************************************************************************************
    # y% a' R! B  t8 e: |
  8. */; z  ~* a% u& ]
  9. void bsp_Init(void)
    8 p" J! G0 B- \; U1 T
  10. {: N# Y% I* r( g0 A# a( m; c" w
  11.     /* 配置MPU */
    ; Y3 z' T8 v( A* e; J
  12.         MPU_Config();
    ( V6 f5 i  b& R" O8 ?& `9 {
  13.         
    4 g8 S( F8 f2 T- p+ Z
  14.         /* 使能L1 Cache */
    & b( s. \1 W$ p) d- v, s
  15.         CPU_CACHE_Enable();  X" [! x8 S7 B* D/ `
  16. : _9 W7 N4 {% p+ D0 L
  17.         /*
    0 S: P9 c6 e% |0 A; b+ d
  18.        STM32H7xx HAL 库初始化,此时系统用的还是H7自带的64MHz,HSI时钟:
    8 }% k; X/ T  }: S
  19.            - 调用函数HAL_InitTick,初始化滴答时钟中断1ms。
    # @7 C8 [1 w/ i3 C( f8 B
  20.            - 设置NVIV优先级分组为4。
    - ~0 b* t) u$ @! l4 O& i: {4 V7 ^1 d
  21.          */0 l4 l% P9 b" s8 [( |- n
  22.         HAL_Init();
    3 l8 g/ k$ d2 Z4 l9 K' N

  23. 7 H, ?# E5 r8 L- m% t( A2 @
  24.         /*
    6 t* N; N  j3 C; l# c
  25.        配置系统时钟到400MHz1 u7 }* U: g# B& i7 N0 [3 n7 H
  26.        - 切换使用HSE。9 M4 H& A' u# i( H
  27.        - 此函数会更新全局变量SystemCoreClock,并重新配置HAL_InitTick。  _5 K4 R- L" J* R2 Q& D
  28.     */
    2 V  f6 ~5 I# T! J4 s6 M$ v
  29.         SystemClock_Config();
    . [7 l0 v, R7 s! h& z& U; j9 j

  30. , ]" J, _) t: L4 m; Y4 n$ N
  31.         /*
    . b2 |8 f0 Q8 E% ]( a2 J
  32.            Event Recorder:' ?0 [- H5 W' l
  33.            - 可用于代码执行时间测量,MDK5.25及其以上版本才支持,IAR不支持。  x0 ]% E0 J8 z5 N/ p: V* P1 i! ^
  34.            - 默认不开启,如果要使能此选项,务必看V7开发板用户手册第xx章( u' A: _# s; T- k* u' B! K
  35.         */        . q5 @! [  y7 Y# S8 P. x9 x
  36. #if Enable_EventRecorder == 1  " w9 R1 Q$ ^$ j6 q* H& t: F# @% L1 j1 V
  37.         /* 初始化EventRecorder并开启 */$ I+ Y8 T& O' u5 @& J( G
  38.         EventRecorderInitialize(EventRecordAll, 1U);
    4 E. R, S2 _* v5 U- O) b( w# V
  39.         EventRecorderStart();
    9 y; E% w" `3 P
  40. #endif: z  |; Z" `  k( |6 {: G
  41.         
    ! A' b4 ~( P% _
  42.         bsp_InitKey();            /* 按键初始化,要放在滴答定时器之前,因为按钮检测是通过滴答定时器扫描 */
    2 v$ U# n8 w' y* s0 x" g
  43.         bsp_InitTimer();          /* 初始化滴答定时器 */
    + m/ L$ t' b: d9 B
  44.         bsp_InitUart();        /* 初始化串口 */
    / ]* m9 H3 L  z+ l
  45.         bsp_InitExtIO();        /* 初始化FMC总线74HC574扩展IO. 必须在 bsp_InitLed()前执行 */        1 O, [5 C$ m+ N; }9 M
  46.         bsp_InitLed();            /* 初始化LED */        
    ) i* b3 s" D) f, a! u; s% [
  47. }
复制代码
% }" l9 J- V( Y8 o# X
  MPU配置和Cache配置:
2 j; R( W% P: E4 S' i
8 a% n& X- f( \8 I
数据Cache和指令Cache都开启。2 y  f# i9 e6 G7 E9 _0 |6 \0 u

. ~. D/ P4 S* S" [) s( JAXI SRAM的MPU属性:
% f! g7 ~: b9 h+ K  X3 ?$ G  w- k6 a# m3 V8 i# N% _
Write back, Read allocate,Write allocate。/ t' c, E* x7 l; }9 |( |! [
' N) a  L* g1 [) [& K3 `+ i, z
FMC的扩展IO的MPU属性:3 z6 k9 ?3 W, M0 e! i; r

, J5 C) b) _6 j必须Device或者Strongly Ordered。3 ?; C& _7 M! m
$ \* r- |  M1 n4 y( |! a
D2 SRAM1,SRAM2和SRAM3的MPU属性:$ Y! p4 q! y: y6 e- S

( }1 H2 s5 u( @" w5 lWrite through, read allocate,no write allocate。
% z0 t# d& a% ~( O: y7 o3 V! X
3 p3 p( @" ?6 t: U. DD3 SRAM4的MPU属性:
6 s0 x* i1 J2 i& m8 `
8 H1 B2 O; p$ M2 U5 U% [- YWrite through, read allocate,no write allocate。% R( P+ C# G  z8 m% z

! G+ w. B' V4 Y  ]2 U) ~/ A" L( u
  1. /*3 |& c. {- O2 p* I5 {6 f2 d% T4 @
  2. *********************************************************************************************************
    , \/ k! w. e: {5 _3 C' }4 G. K
  3. *        函 数 名: MPU_Config, B9 a2 c& A- J! H+ `
  4. *        功能说明: 配置MPU/ l! f8 t/ C, Y+ {. Q) k$ U) k
  5. *        形    参: 无' G1 m- t$ e: [1 a
  6. *        返 回 值: 无9 Y& b& U( ?1 I% v/ e
  7. *********************************************************************************************************- `: V2 l" k, A* `3 f6 ^; n
  8. */
    1 c+ F5 I$ u, F9 ^0 ?: I0 L
  9. static void MPU_Config( void )
    * o% L" m1 ?* q1 L
  10. {8 k; x" Y: P; d1 @; M3 W
  11.         MPU_Region_InitTypeDef MPU_InitStruct;
    & |8 s, f8 U- s; B) I; b/ J0 S
  12. # h# _  r+ s; g
  13.         /* 禁止 MPU */
    7 x. U# D* k% Z; f
  14.         HAL_MPU_Disable();
    ( Y6 P' [4 i( h( u

  15. 6 C+ I, k9 t1 S/ M
  16.         /* 配置AXI SRAM的MPU属性为Write back, Read allocate,Write allocate */
    . A7 w/ f6 E- N
  17.         MPU_InitStruct.Enable           = MPU_REGION_ENABLE;
    8 ?+ T: n0 F% c" d
  18.         MPU_InitStruct.BaseAddress      = 0x24000000;$ Y+ h2 b; i# b% {
  19.         MPU_InitStruct.Size             = MPU_REGION_SIZE_512KB;
    - H% G3 V/ H$ ^
  20.         MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;  A. r: Z4 c; i3 b
  21.         MPU_InitStruct.IsBufferable     = MPU_ACCESS_BUFFERABLE;5 c% a( u( e, j4 o
  22.         MPU_InitStruct.IsCacheable      = MPU_ACCESS_CACHEABLE;
    $ R+ B' R1 I3 x$ y% g9 |7 ?0 q
  23.         MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;
    8 `# A( `+ I5 E
  24.         MPU_InitStruct.Number           = MPU_REGION_NUMBER0;
    / q3 r- t5 u6 K  E3 T/ W7 x* f
  25.         MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL1;) S+ `5 i& D. o4 E1 V
  26.         MPU_InitStruct.SubRegionDisable = 0x00;
    " [! P# H0 v. |- X0 s5 V5 _9 @
  27.         MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;5 f9 ^* `5 K. L; }# `* e

  28. ) P. O+ J$ [" R* K
  29.         HAL_MPU_ConfigRegion(&MPU_InitStruct);
      U+ T7 M: o2 L
  30.         & I* z9 m9 h" M0 d
  31.         
    + Y* m+ U/ R: Y& q, W
  32.         /* 配置FMC扩展IO的MPU属性为Device或者Strongly Ordered */# K! e' U3 D. a3 r
  33.         MPU_InitStruct.Enable           = MPU_REGION_ENABLE;
    6 f! J  a: k5 m! R; k  h
  34.         MPU_InitStruct.BaseAddress      = 0x60000000;! y: D( p( s, r9 h
  35.         MPU_InitStruct.Size             = ARM_MPU_REGION_SIZE_64KB;        9 w, N9 q* b7 d3 G
  36.         MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;& S  a1 v# T9 `& V* {: d. Y
  37.         MPU_InitStruct.IsBufferable     = MPU_ACCESS_BUFFERABLE;
    : H$ J* |# a/ ]
  38.         MPU_InitStruct.IsCacheable      = MPU_ACCESS_NOT_CACHEABLE;
    ) |& O1 h( r5 r. w3 J
  39.         MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;3 E, I- t$ P! ]  @7 Z
  40.         MPU_InitStruct.Number           = MPU_REGION_NUMBER1;
    7 C8 \( J6 h% A% z7 f: H( x9 D
  41.         MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL0;" `: W8 X! q7 \7 l  @
  42.         MPU_InitStruct.SubRegionDisable = 0x00;
      ~' _, p% N/ J  M5 Q
  43.         MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;
    2 h+ s& m/ e/ R+ X
  44.         
    6 o; i. E$ h1 R6 W: q3 A3 ]8 j
  45.         HAL_MPU_ConfigRegion(&MPU_InitStruct);
    5 P5 M: r7 E( s1 E
  46.         
    9 `4 x" Y  r) z; ]% ?# G
  47.         /* 配置SRAM1的属性为Write through, read allocate,no write allocate */
    . i2 y( D2 v0 c1 \0 E  F
  48.     MPU_InitStruct.Enable           = MPU_REGION_ENABLE;
    3 U7 \6 n  ]( c1 F
  49.     MPU_InitStruct.BaseAddress      = 0x30000000;, G9 B7 R6 _* @: H6 M0 [* `
  50.     MPU_InitStruct.Size             = ARM_MPU_REGION_SIZE_128KB;        
    . K1 d  r# _; `7 Y- W' `6 k  b: _
  51.     MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
    ! w; ~  t9 @3 u$ X4 \* Y
  52.     MPU_InitStruct.IsBufferable     = MPU_ACCESS_NOT_BUFFERABLE;
    2 c- T+ ~9 h. k. `! I% y! E' i
  53.     MPU_InitStruct.IsCacheable      = MPU_ACCESS_CACHEABLE;1 ~, m2 i/ Q/ |. H5 T" ]! d' S
  54.     MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;: d+ A1 y6 Q$ R) ?  D8 u& j" a4 Q
  55.     MPU_InitStruct.Number           = MPU_REGION_NUMBER2;
    9 b; `$ ^4 j9 R& F8 u
  56.     MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL0;
    " N& ?: h0 t2 U
  57.     MPU_InitStruct.SubRegionDisable = 0x00;1 a2 a+ ~6 w' J: `  A0 p3 n
  58.     MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;. B+ R, \4 @& \. e8 F  a
  59. 9 s! q$ M5 R2 A4 ]
  60.     HAL_MPU_ConfigRegion(&MPU_InitStruct);
    5 \$ B0 ]+ k" O; q5 y' T5 R3 y7 _" `! r
  61.         
    : R/ @' l% K4 ~3 j9 }2 U
  62.         /* 配置SRAM2的属性为Write through, read allocate,no write allocate */( @4 o; L& g( |" b$ R, {
  63.     MPU_InitStruct.Enable           = MPU_REGION_ENABLE;* g' Y, y1 b& v7 z* y, E1 W
  64.     MPU_InitStruct.BaseAddress      = 0x30020000;
    7 w7 O1 ~; W/ {+ q' x  }& E. k
  65.     MPU_InitStruct.Size             = ARM_MPU_REGION_SIZE_128KB;        8 x4 A' {! O( e
  66.     MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;- q3 E! \: W. B  ~2 n! G/ i
  67.     MPU_InitStruct.IsBufferable     = MPU_ACCESS_NOT_BUFFERABLE;
    4 R& U3 G; e$ S7 J6 S4 g4 x  }3 ~  ^
  68.     MPU_InitStruct.IsCacheable      = MPU_ACCESS_CACHEABLE;  s  j* V8 y$ r) P" T; C/ Z0 i) N
  69.     MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;4 S; z* r7 g3 V
  70.     MPU_InitStruct.Number           = MPU_REGION_NUMBER3;
    % V! _. Q3 ~- @# X& }2 [
  71.     MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL0;; k+ ]- a4 d0 T9 r5 R1 N
  72.     MPU_InitStruct.SubRegionDisable = 0x00;/ j* u2 O' c2 P- i
  73.     MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;; c, f) ]  d- q1 |( H3 q$ R+ m! j
  74. - m& j% X6 k* Y' p# F" t# f2 M6 \+ v
  75.     HAL_MPU_ConfigRegion(&MPU_InitStruct);' H1 Z! F6 J$ G. Q! A1 Z0 v
  76. ; y8 J9 _: |  Q
  77. 8 N% ^# K6 R% n/ g( b) K# B: E1 U
  78.     /* 配置SRAM3的属性为Write through, read allocate,no write allocate */( u) t& h/ [+ q! O
  79.     MPU_InitStruct.Enable           = MPU_REGION_ENABLE;
    + [! x: X) W$ ^4 `4 a$ _
  80.     MPU_InitStruct.BaseAddress      = 0x30040000;7 i: C( l* l' _' H5 v7 O, L
  81.     MPU_InitStruct.Size             = ARM_MPU_REGION_SIZE_32KB;        
    % ?/ ~0 p# D. ]5 F: a7 X
  82.     MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
    0 e5 I4 ]7 [+ e1 D& Y; _# Y  A0 _* A2 D
  83.     MPU_InitStruct.IsBufferable     = MPU_ACCESS_NOT_BUFFERABLE;
    3 @) w0 y8 q5 P% B( ]3 Z" D
  84.     MPU_InitStruct.IsCacheable      = MPU_ACCESS_CACHEABLE;
    + S; m( x5 s- S: r$ _
  85.     MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;
    / g) x( k8 ~6 ]% ~0 g
  86.     MPU_InitStruct.Number           = MPU_REGION_NUMBER4;; b( l1 @5 V2 \6 b4 U
  87.     MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL0;
    2 a7 P5 \4 U! e- ]+ G0 c+ D
  88.     MPU_InitStruct.SubRegionDisable = 0x00;
    3 g1 z0 m' O2 e/ Y, @
  89.     MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;! N5 V% V  N" o" ?0 \& Z9 m

  90. ' J9 S- R3 t  s9 N5 d! P
  91.     HAL_MPU_ConfigRegion(&MPU_InitStruct);
    # {: I( M5 T5 |% w; O7 L+ V* t
  92.         4 p: N4 W. Y4 n) S
  93.         ) q/ f: H3 M. P6 Y/ K" Q% j
  94.         /* 配置SRAM4的属性为Write through, read allocate,no write allocate */
    & @, d' J1 {( n2 h9 Z
  95.     MPU_InitStruct.Enable           = MPU_REGION_ENABLE;2 w' ^' m5 l3 j2 [3 L. i' O# |0 Z
  96.     MPU_InitStruct.BaseAddress      = 0x38000000;: i$ j9 Q# Z. _4 d! ?; R
  97.     MPU_InitStruct.Size             = ARM_MPU_REGION_SIZE_64KB;        / W3 ^. T0 k+ o1 P
  98.     MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;7 O) p4 e6 h" @! P
  99.     MPU_InitStruct.IsBufferable     = MPU_ACCESS_NOT_BUFFERABLE;  N! s5 Q1 g( K2 `, D: `
  100.     MPU_InitStruct.IsCacheable      = MPU_ACCESS_CACHEABLE;9 @0 @# f! G- d$ o4 y& D8 @
  101.     MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;9 O7 [* n; e( A2 x% C* u- y
  102.     MPU_InitStruct.Number           = MPU_REGION_NUMBER5;. L; t; ?& K+ s! h
  103.     MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL0;
    ; E8 z5 O: ~: }: A! u
  104.     MPU_InitStruct.SubRegionDisable = 0x00;
    7 @$ ]" M+ C0 n/ @
  105.     MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;: V% q' k) b) b4 ?$ Q) s; ?" p

  106. % C: O/ X) h, \+ O" @' U5 S3 H
  107.     HAL_MPU_ConfigRegion(&MPU_InitStruct);
    % |- J' Z) V! T3 S8 B" e
  108.         
    6 E3 q0 ~: ?; p1 S; t& I
  109.         /*使能 MPU */
    9 a1 X- c. t6 P8 B: b' v, C
  110.         HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);6 H3 C( ~1 N2 b2 U% \
  111. }
    ' D8 f/ ?; b! k" e
  112. " V- ~7 Y/ i7 \/ B+ B+ [( ^
  113. /** z. Q8 a& R% |7 j8 r
  114. *********************************************************************************************************1 O% K0 h% ?1 N- P* e
  115. *        函 数 名: CPU_CACHE_Enable
    ) L) O# A5 c9 B: ^- B/ Y8 f
  116. *        功能说明: 使能L1 Cache
    $ q1 _$ n. {9 P3 w  S5 V
  117. *        形    参: 无
    " Y* w) i- [7 U+ v; U
  118. *        返 回 值: 无$ a6 }0 y( y) A8 d3 k4 p7 p
  119. *********************************************************************************************************% \" |5 d& f: I" f9 I& y
  120. */1 q! o# W2 \  z0 h
  121. static void CPU_CACHE_Enable(void)
    % v( r% S( N1 P4 _
  122. {
    % `9 l# v: y4 j* c0 t
  123.         /* 使能 I-Cache */
    % L& ?* _0 d' }" M+ x* Y
  124.         SCB_EnableICache();6 l: O2 _, W9 V* M; H) H  u

  125. ) T* e1 c: c7 |. x
  126.         /* 使能 D-Cache */$ e* @, Y& @. @0 t$ ]; `( y- w
  127.         SCB_EnableDCache();4 h  W4 d7 l% n# L
  128. }
复制代码

6 S: P( M0 d. @0 c  主功能:
- K+ g7 g0 y, T: k( n
) W1 Y* t9 b7 C! w# z主程序实现如下操作:
8 m  C* d1 f, p8 V0 D' p6 I: ?) M& K1 m* U+ o8 x* ~
  启动自动重装软件定时器0,每100ms翻转一次LED2。
3 ?) s$ @( x' h2 D5 w) j  K1键按下,从DTCM依次申请280字节,64字节和6111字节。' t$ @0 W& R) _; o7 z
  K1键松开,释放从DTCM申请的空间。: L* ^% K; F- x8 R# q$ L+ Y
  K2键按下,从AXI SRAM依次申请160字节,32字节和2333字节。6 o: G  m0 M' f: t$ z% {( D! _
  K2键松开,释放从AXI SRAM申请的空间。
. z; [1 F9 j% k0 O0 }  K3键按下,从D2域SRAM依次申请200字节,96字节和4111字节。
5 _. q  k5 z6 {+ x. ~' G4 P: N  K3键松开,释放从D2域SRAM申请的空间。
: B0 p6 V' N# k  i2 H  摇杆OK键按下,从D3域SRAM依次申请300字节,128字节和5111字节。
8 ~, E4 b. n: _5 ~9 Y  摇杆OK键松开,释放从D3域SRAM申请的空间。+ t7 o$ w2 _& t  q( c1 p
  1. /*; o; d4 ]  Q1 c9 a
  2. *********************************************************************************************************
    ; c; F5 `* S0 R, E
  3. *        函 数 名: main
    . t5 G- H+ a9 P, R
  4. *        功能说明: c程序入口
    # S5 H% M7 L: N  U. H! O/ U. ]
  5. *        形    参: 无
    0 u) G9 N5 q4 W0 }: Y' c
  6. *        返 回 值: 错误代码(无需处理)1 j/ J! D$ t5 y8 i& Z9 o4 l: t
  7. *********************************************************************************************************; U3 i& H! Z2 L/ _8 C; q
  8. */
    5 g/ Q9 ]$ `3 d
  9. int main(void)) n9 g8 u6 z5 V7 ?
  10. {
    ) b* M( ~* B6 h9 m# d5 p7 _
  11.         uint8_t ucKeyCode;                /* 按键代码 */$ E$ R( m) A! \2 g" c( g6 d) G2 e
  12.         uint32_t *DTCM_Addres0, *AXISRAM_Addres0, *SRAM1_Addres0, *SRAM4_Addres0;
    / J8 @2 ~' Y5 J7 E, o; X
  13.         uint16_t *DTCM_Addres1, *AXISRAM_Addres1, *SRAM1_Addres1, *SRAM4_Addres1;1 V& E% d$ Q1 }! }2 X) m1 V% n
  14.         uint8_t  *DTCM_Addres2, *AXISRAM_Addres2, *SRAM1_Addres2, *SRAM4_Addres2;
    ' z, H* K8 \5 T$ c( M8 j. U
  15. ) g% Y- k3 `! T$ J) M! |
  16. , \- Z8 D; P; E6 C4 E- O
  17.         bsp_Init();                /* 硬件初始化 */' `' r% B+ f* J+ h3 A' Y
  18.         
    # R& h/ v: Y" _& K8 N
  19.         /* 初始化动态内存空间 */2 a; H& i& j% O/ {
  20.         osRtxMemoryInit(AppMallocDTCM,    sizeof(AppMallocDTCM));/ e$ `* y2 P: Y! k1 S, q
  21.         osRtxMemoryInit(AppMallocAXISRAM, sizeof(AppMallocAXISRAM));7 y4 D8 F' w7 U+ O& M) y) Q
  22.         osRtxMemoryInit(AppMallocSRAM1,   sizeof(AppMallocSRAM1));" E/ C2 d1 a$ a
  23.         osRtxMemoryInit(AppMallocSRAM4,   sizeof(AppMallocSRAM4));: U2 J. G% \$ r/ _7 }* z
  24.         2 M" S$ M) s" B8 a; y; T( }% ]
  25.         PrintfLogo();        /* 打印例程名称和版本等信息 */1 u1 [8 |, c+ N( G
  26.         PrintfHelp();        /* 打印操作提示 */
    - u, {" |, i2 x, d
  27. 7 s3 G  B( B8 n" x( ]
  28.         bsp_StartAutoTimer(0, 100);        /* 启动1个100ms的自动重装的定时器 */
    ( i  |1 m- l0 Y$ W# L, B5 s
  29.         ' i8 w# U% W' B, g$ O# e

  30. 1 }6 q' M9 z, k: O' j/ |! ?
  31.         /* 进入主程序循环体 */; i7 O+ x" `. C( W  S) T
  32.         while (1)3 U. f6 D& |  ?' Y- @/ H9 X" L
  33.         {- K8 L+ Q+ [6 w; H" p% F3 o
  34.                 bsp_Idle();                /* 这个函数在bsp.c文件。用户可以修改这个函数实现CPU休眠和喂狗 */$ s& V' `8 V9 P4 ~# I
  35. $ W/ i; }) [8 F( Y6 v8 P0 t
  36.                 /* 判断定时器超时时间 */
    : A. Q+ P8 {, t5 K5 m
  37.                 if (bsp_CheckTimer(0))        
    0 P3 H6 |8 U' o* i! o( N2 Q
  38.                 {
    ! r, ^4 Y( a0 K' a3 w! c- Y
  39.                         /* 每隔100ms 进来一次 */  : k. b& @3 {4 P- c( o
  40.                         bsp_LedToggle(2);2 a2 s. S, N0 b% Z1 N
  41.                 }
    7 G( A( Y+ n' x2 K( U/ d
  42. 4 k$ |% y5 r5 Z. s0 ]! Y% l) }
  43.                 /* 按键滤波和检测由后台systick中断服务程序实现,我们只需要调用bsp_GetKey读取键值即可。 */
    1 Q/ J( b) T7 B6 G0 `: u
  44.                 ucKeyCode = bsp_GetKey();        /* 读取键值, 无键按下时返回 KEY_NONE = 0 */
    + }; G! W3 D5 {' k3 j( x& N" R) K
  45.                 if (ucKeyCode != KEY_NONE)5 q2 e. b) m2 b# `6 N
  46.                 {
    " O5 p: R1 b1 b) g  Q
  47.                         switch (ucKeyCode)
    9 c$ ?: ?% W) W& g* r
  48.                         {* ~; {+ o0 W' ~8 K/ s+ @& F% {
  49.                 /* 从DTCM依次申请280字节,64字节和6111字节 */
    & a* `$ {6 N* x) N% \3 A
  50.                                 case KEY_DOWN_K1:        
    ' N8 m- a% s- [2 }+ c
  51.                     /* 从DTCM申请280字节空间,使用指针变量DTCM_Addres0操作这些空间时不要超过280字节大小 */
    ) d" k; F' o0 j. p. N- m# s
  52.                                         printf("=========================================================\r\n");
    - b- i) I3 b8 s/ |  X
  53.                                         DTCM_Addres0 = osRtxMemoryAlloc(AppMallocDTCM, 280, 0);
    , C$ ^2 K: Z( [  t- v7 F$ X5 [
  54.                                         DTCMUsed = MemHeadPtr(AppMallocDTCM);
    % ^. ?1 V6 v. E- e+ Y
  55.                                         printf("DTCM总大小 = %d字节,申请大小 = 0280字节,当前共使用大小 = %d字节\r\n",
    - R( H+ G' B$ V( t, Q+ C2 U2 K3 L
  56.                                                                                 DTCMUsed->size, DTCMUsed->used);3 I- B7 c* {* d/ Q
  57.                                 
    7 {4 V' v- P* X0 c5 T0 ]& p
  58.                         /* 从DTCM申请64字节空间,使用指针变量DTCM_Addres1操作这些空间时不要超过64字节大小 */        ! {, ], t' {: B' t7 S/ n) b
  59.                                         DTCM_Addres1 = osRtxMemoryAlloc(AppMallocDTCM, 64, 0);
    2 {# g) a) J* S5 [; {7 M. u
  60.                                         DTCMUsed = MemHeadPtr(AppMallocDTCM);
    & v9 H# G! U" [
  61.                                         printf("DTCM总大小 = %d字节,申请大小 = 0064字节,当前共使用大小 = %d字节\r\n",
    1 Q  C- ]; W4 r0 ^; G
  62.                                                                                                            DTCMUsed->size, DTCMUsed->used);7 z; T, h, C4 Z
  63.                                 
    3 i. w( P$ o% o  O. @
  64.                     /* 从DTCM申请6111字节空间,使用指针变量DTCM_Addres2操作这些空间时不要超过6111字节大小 */" a% F3 `! [! f" @$ a$ ?8 _
  65.                                         DTCM_Addres2 = osRtxMemoryAlloc(AppMallocDTCM, 6111, 0);
    : U5 ^! N! `4 ?) M/ W
  66.                                         DTCMUsed = MemHeadPtr(AppMallocDTCM);
    - {! m: P7 T' q9 d/ Z
  67.                                         printf("DTCM总大小 = %d字节,申请大小 = 6111字节,当前共使用大小 = %d字节\r\n", $ c; q$ L6 y( T
  68.                                                                                 DTCMUsed->size, DTCMUsed->used);9 o$ L) e8 R! U, d+ A7 _
  69.                                         break;2 _8 m- _3 c6 {* X* s6 v1 K0 x
  70.                                 1 ]. u+ \5 |0 R; ^; v8 K! e  x/ ^
  71.                                 /* 释放从DTCM申请的空间 */
    3 d6 A3 d8 D2 j7 G0 K. w  v  t
  72.                                 case KEY_UP_K1:        
    ! n4 A* F6 ~1 J2 W$ U
  73.                                         /* 释放从DTCM申请的280字节空间 */0 Y# j6 R, K4 t* L
  74.                                         osRtxMemoryFree(AppMallocDTCM, DTCM_Addres0);
    + @  J/ d$ L! e
  75.                                         DTCMUsed = MemHeadPtr(AppMallocDTCM);5 U! r9 T+ _- R" f/ }! i. O' c
  76.                                         printf("释放DTCM动态内存区申请的0280字节,当前共使用大小 = %d字节\r\n", + _9 a& p' A# n1 I) B
  77. DTCMUsed->used);7 _' G- \; Z/ h/ a$ U4 s$ r# [7 K
  78.                                 
    % S$ o9 d1 d. T  ?; f9 l* N
  79.                                         /* 释放从DTCM申请的64字节空间 */: l- p4 Y* f' \8 |
  80.                                         osRtxMemoryFree(AppMallocDTCM, DTCM_Addres1);
    7 e. m( N, }) B; K$ n# J2 c! `; F
  81.                                         DTCMUsed = MemHeadPtr(AppMallocDTCM);7 d1 v5 j* H7 ^0 ?% h
  82.                                         printf("释放DTCM动态内存区申请的0064字节,当前共使用大小 = %d字节\r\n",
    $ i, X# @/ Y# R* K  g0 G, F6 v
  83. DTCMUsed->used);
    ! X, I" l2 |1 F# K
  84.                                 
    8 X2 E- q* n, L2 x' y2 s
  85.                                         /* 释放从DTCM申请的6111字节空间 */# F% a' u1 j5 ^7 P* U: L6 c9 }
  86.                                         osRtxMemoryFree(AppMallocDTCM, DTCM_Addres2);% J! ]  Y8 p. `5 c3 [4 Y. O
  87.                                         DTCMUsed = MemHeadPtr(AppMallocDTCM);) S, x; ?! E, D+ k3 d. a1 ~  v
  88.                                         printf("释放DTCM动态内存区申请的6111字节,当前共使用大小 = %d字节\r\n",
    * b# y; y! Q& l' i7 Y& r" I/ Q
  89. DTCMUsed->used);
    . c3 h2 B- K, B: Q2 G* f
  90.                                         break;' J7 g  o; g- G/ S+ z; }; T
  91.                                 6 H! F# x: K. r5 X. b8 R
  92.                                 /* 从AXI SRAM依次申请160字节,32字节和2333字节 */5 R3 u8 x* c- [9 d3 d
  93.                                 case KEY_DOWN_K2:        ( S- c$ h9 t8 _; R
  94.             /* 从AXI SRAM 申请160字节空间,使用指针变量AXISRAM_Addres0操作这些空间时不要超过160字节大小 */6 Q+ e& x3 h! C; N) x
  95.                                         printf("=========================================================\r\n");               
    8 x0 e( c3 T+ ]' }' Y
  96.                                         AXISRAM_Addres0 = osRtxMemoryAlloc(AppMallocAXISRAM, 160, 0);5 u1 H0 P7 @7 ], t
  97.                                         AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);8 L4 H9 B- F; A) M, c3 X. K
  98.                                         printf("AXI SRAM总大小 = %d字节,申请大小 = 0162字节,当前共使用大小 = %d字节\r\n", 9 y3 F# g; g" Q+ r$ {! Q
  99.                                                                                 AXISRAMUsed->size, AXISRAMUsed->used);
    + K, N$ ~) i2 B: Y7 q
  100.                                 ( f* r# Y: C3 N8 b
  101.                         /* 从AXI SRAM 申请32字节空间,使用指针变量AXISRAM_Addres1操作这些空间时不要超过32字节大小 */$ `1 }8 `" D$ b7 t5 }4 C( |% z+ W0 X; }
  102.                                         AXISRAM_Addres1 = osRtxMemoryAlloc(AppMallocAXISRAM, 32, 0);
    2 l% I& R# e! o: y) p( ^& u
  103.                                         AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);
    ) K( a6 e: O; Q) l/ i6 Y; `
  104.                                         printf("AXI SRAM总大小 = %d字节,申请大小 = 0032字节,当前共使用大小 = %d字节\r\n", - C7 j  d0 g/ V7 Q. y- w7 t
  105.                                                                                                       AXISRAMUsed->size, AXISRAMUsed->used);; k/ p" o9 {4 A( y( H& ~
  106.                                 
    1 ~6 }: i: ]( ]
  107. /* 从AXI SRAM 申请2333字节空间,使用指针变量AXISRAM_Addres2操作这些空间时不要超过2333字节大小 */          ~; P$ h. d# [) b# S+ c$ N
  108.                                         AXISRAM_Addres2 = osRtxMemoryAlloc(AppMallocAXISRAM, 2333, 0);
    9 g+ p/ T  U' G+ W& Y: B: E
  109.                                         AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);  p8 A1 r5 L: c$ F! \; L
  110.                                         printf("AXI SRAM总大小 = %d字节,申请大小 = 2333字节,当前共使用大小 = %d字节\r\n", 0 |1 l3 h* C5 i4 s0 \- m
  111.                                                                                 AXISRAMUsed->size, AXISRAMUsed->used);  @& t. u; w( r" Y; Z" t4 g
  112.                                         break;; a) k: J, H. ]6 F+ m- w+ w$ f
  113.                                 
    & ^: {( L2 O$ z1 |) B$ ^6 j( X  E% d
  114.                                 /* 释放从AXI SRAM申请的空间 */! V4 `) u) b4 C7 j
  115.                                 case KEY_UP_K2:        
    6 M  |: ?6 o# e4 a5 `9 n, n( x& z# m# @+ S
  116.                                         /* 释放从AXI SRAM申请的160字节空间 */
    ( J3 d6 M/ ~" O3 b
  117.                                         osRtxMemoryFree(AppMallocAXISRAM, AXISRAM_Addres0);
    " J& L3 u4 D6 c% S) \2 ~
  118.                                         AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);2 D' S. H3 o/ a% q* t/ f& [: ]
  119.                                         printf("释放AXI SRAM动态内存区申请的0160字节,当前共使用大小 = %d字节\r\n",% n. @  A% v8 F+ ]+ ~  C6 F$ ^
  120. AXISRAMUsed->used);4 u) ~: y/ @! t. o; K4 {! O
  121.                                 " F; `$ c) @6 L0 v
  122.                                         /* 释放从AXI SRAM申请的32字节空间 */
    - w% d! b0 |, M# s3 C+ w
  123.                                         osRtxMemoryFree(AppMallocAXISRAM, AXISRAM_Addres1);
    , C. n9 K& k# ]- K" n
  124.                                         AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);
    , h1 I# E3 p6 ?8 W" r+ m
  125.                                         printf("释放AXI SRAM动态内存区申请的0032字节,当前共使用大小 = %d字节\r\n",
    + e3 b( Z7 q# V$ }
  126. AXISRAMUsed->used);# n' s' [% v9 N; p" Y1 S9 o
  127.                                 
    ! B2 }; K2 u# C
  128.                                         /* 释放从AXI SRAM申请的2333字节空间 */& a! N! L4 [: ~
  129.                                         osRtxMemoryFree(AppMallocAXISRAM, AXISRAM_Addres2);
    : Q% T, _& M: j+ D* H/ ]
  130.                                         AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);: D' U. ~+ T# J3 e
  131.                                         printf("释放AXI SRAM动态内存区申请的2333字节,当前共使用大小 = %d字节\r\n", ( W$ \: }# @3 w6 f
  132. AXISRAMUsed->used);1 G' y" Z) |7 K8 Y2 t1 k
  133.                                         break;
    8 F  B/ |) Z+ h3 H
  134.                                 
    3 v, R6 e, R4 A# ^  U
  135.                                 /* 从D2域SRAM依次申请200字节,96字节和4111字节 */
    - M9 T( D( s9 v- w- z8 z" E% d4 e
  136.                                 case KEY_DOWN_K3:        # [% y8 {3 _$ [* d" p- X2 Q
  137.         /* 从D2域的SRAM申请200字节空间,使用指针变量SRAM1_Addres0操作这些空间时不要超过200字节大小 */7 ]5 l9 r3 d* ?% ]* l: ?& L
  138.                                         printf("=========================================================\r\n");                + {+ B- o; v1 L& d' h8 i  Y. y
  139.                                         SRAM1_Addres0 = osRtxMemoryAlloc(AppMallocSRAM1, 200, 0);9 x. {% |8 u4 f  v- Y7 r" t
  140.                                         SRAM1Used = MemHeadPtr(AppMallocSRAM1);
    ' x1 \2 W0 J+ j
  141.                                         printf("D2域SRAM总大小 = %d字节,申请大小 = 0200字节,当前共使用大小 = %d字节\r\n",
    " E; H+ Q8 _, V7 B
  142.                                                                                 SRAM1Used->size, SRAM1Used->used);$ T& A9 d, {  t
  143.                                 7 g4 V" X1 |+ e6 ~+ [+ u" P
  144.          /* 从D2域的SRAM申请96字节空间,使用指针变量SRAM1_Addres1操作这些空间时不要超过96字节大小 */        
      V8 ~. X5 {$ ^+ D1 l- y
  145.                                         SRAM1_Addres1 = osRtxMemoryAlloc(AppMallocSRAM1, 96, 0);
    2 q$ B8 b. k( T4 C$ V8 r! L" d
  146.                                         SRAM1Used = MemHeadPtr(AppMallocSRAM1);  T( y5 J% X! ^- m
  147.                                         printf("D2域SRAM总大小 = %d字节,申请大小 = 0096字节,当前共使用大小 = %d字节\r\n",
    % v7 @- y8 ?/ E. b& r
  148.                                                                                                            SRAM1Used->size, SRAM1Used->used);
    ' Q! X1 _+ W! Y# x! X" s
  149.                                 0 P$ @8 P4 b+ Z7 R
  150.          /* 从D2域的SRAM申请4111字节空间,使用指针变量SRAM1_Addres2操作这些空间时不要超过4111字节大小 */: n6 m/ o) P2 G( [1 l3 K9 u
  151.                                         SRAM1_Addres2 = osRtxMemoryAlloc(AppMallocSRAM1, 4111, 0);
    4 _1 s, u* n* E# L' w
  152.                                         SRAM1Used = MemHeadPtr(AppMallocSRAM1);& ?2 \7 ]* V' Y6 H
  153.                                         printf("D2域SRAM总大小 = %d字节,申请大小 = 4111字节,当前共使用大小 = %d字节\r\n", " f& {& w& H$ B- O
  154.                                                                                 SRAM1Used->size, SRAM1Used->used);6 B  l0 G6 Z# V% E! `# \. \
  155.                                         break;
    8 k; ^8 I# H( A1 p' z7 D9 n6 B
  156.                                 
    : D2 e5 c' r( X, m. g
  157.                                 /* 释放从D2域SRAM申请的空间 */
    8 r+ ~  N9 R/ n
  158.                                 case KEY_UP_K3:        
    0 w0 v( `/ Y4 O& @/ ^
  159.                                         /* 释放从D2域的SRAM申请的200字节空间 */
    2 E1 t( B* V0 ]0 l# _' B2 R
  160.                                         osRtxMemoryFree(AppMallocSRAM1, SRAM1_Addres0);5 X2 o  w# Q- M- d& p% Q. d7 B: l
  161.                                         SRAM1Used = MemHeadPtr(AppMallocSRAM1);% I; g* C' V1 N; c% M& ~. ?! H" w
  162.                                         printf("释放D2域SRAM动态内存区申请的0200字节,当前共使用大小 = %d字节\r\n",4 u5 ]+ x0 S  z) m
  163. SRAM1Used->used);8 D0 Q) V2 [9 [) P
  164.                                 
    + c$ ]) n+ }# Z5 A  y
  165.                                         /* 释放从D2域的SRAM申请的96字节空间 */
    - C/ y- n, w! O* }2 p- u% J$ U2 P
  166.                                         osRtxMemoryFree(AppMallocSRAM1, SRAM1_Addres1);
    ' z# X% ?& J/ r) l- b
  167.                                         SRAM1Used = MemHeadPtr(AppMallocSRAM1);
    7 L& T/ p/ r" \8 M$ U
  168.                                         printf("释放D2域SRAM动态内存区申请的0096字节,当前共使用大小 = %d字节\r\n",. i, p0 w" i$ [  J& {
  169. SRAM1Used->used);8 I) S! _/ q" b$ Z; ^! }* w
  170.                                 8 R' |4 i: i. f3 T
  171.                                         /* 释放从D2域的SRAM申请的4111字节空间 */8 W' \- A; J" _
  172.                                         osRtxMemoryFree(AppMallocSRAM1, SRAM1_Addres2);
    % N% @0 j8 J' E7 u4 B* L
  173.                                         SRAM1Used = MemHeadPtr(AppMallocSRAM1);4 _" q7 D* H+ M5 ~: w) r0 \
  174.                                         printf("释放D2域SRAM动态内存区申请的4111字节,当前共使用大小 = %d字节\r\n",
    0 H( h  v! x; Z! u6 V/ x6 ^7 j
  175. SRAM1Used->used);6 n& j( o& T" w8 b- b$ l# G0 |
  176.                                         break;! `% r; }6 L* @% l
  177.                                 5 t1 ^- `1 X# k, K. ^% N
  178.                                 /* 从D3域SRAM依次申请300字节,128字节和5111字节 */
    7 u3 \4 D  C& f% o3 k
  179.                                 case JOY_DOWN_OK:        
    ' ?1 Q! {( l. S+ f, W
  180.             /* 从D3域的SRAM申请300字节空间,使用指针变量SRAM4_Addres0操作这些空间时不要超过300字节大小 */
    4 F2 ]- z1 i1 J- d: d. M
  181.                                         printf("=========================================================\r\n");                & ], A8 r2 N- [
  182.                                         SRAM4_Addres0 = osRtxMemoryAlloc(AppMallocSRAM4, 300, 0);+ o- Z2 |8 Y( H: l! v
  183.                                         SRAM4Used = MemHeadPtr(AppMallocSRAM4);
    6 r  j/ c' d6 B' _
  184.                                         printf("D3域SRAM总大小 = %d字节,申请大小 = 0300字节,当前共使用大小 = %d字节\r\n",
    7 {- x4 p$ o' l' g; e
  185.                                                                                 SRAM4Used->size, SRAM4Used->used);& K1 {% @6 g% w, q3 \9 c
  186.                                 
      s9 l4 _1 P$ v
  187.                 /* 从D3域的SRAM申请96字节空间,使用指针变量SRAM4_Addres1操作这些空间时不要超过96字节大小 */- l2 L* x- b" M6 R
  188.                                         SRAM4_Addres1 = osRtxMemoryAlloc(AppMallocSRAM4, 128, 0);3 \7 V5 ~( p; Y+ p
  189.                                         SRAM4Used = MemHeadPtr(AppMallocSRAM4);
    " f0 y" i$ p# J
  190.                                         printf("D3域SRAM总大小 = %d字节,申请大小 = 0128字节,当前共使用大小 = %d字节\r\n", 2 I( ]& I5 T' E
  191.                                                                                                            SRAM4Used->size, SRAM4Used->used);
      O& p1 i4 {; ^2 ?4 D( j
  192.                                 ' m* I1 b+ o3 F6 \; E1 ~# F6 b! P# J2 x& ~
  193.         /* 从D3域的SRAM申请5111字节空间,使用指针变量SRAM4_Addres2操作这些空间时不要超过5111字节大小 */
    9 B0 Z0 U3 o& |, ]: D% K  l  p
  194.                                         SRAM4_Addres2 = osRtxMemoryAlloc(AppMallocSRAM4, 5111, 0);7 q% H) `0 Q* Y$ J/ l2 K3 c
  195.                                         SRAM4Used = MemHeadPtr(AppMallocSRAM4);9 g& Z+ y8 L0 X8 X+ w8 z/ ]3 z6 ?
  196.                                         printf("D3域SRAM总大小 = %d字节,申请大小 = 5111字节,当前共使用大小 = %d字节\r\n",
    7 x& c* _/ P" }# ]* [/ x3 c' o; V
  197.                                                                                 SRAM4Used->size, SRAM4Used->used);+ r" W, R* D6 h7 c9 Z
  198.                                         break;
    # R. ^' ~6 Q+ R& i$ ^7 k
  199.                                 
    ) S) G: a1 y/ V: S6 s/ W
  200.                                 /* 释放从D3域SRAM申请的空间 */# c  m  d# E3 c6 Y
  201.                                 case JOY_UP_OK:        
    9 T- R: {  t5 a; k. e' l# }2 O
  202.                                         /* 释放从D3域的SRAM申请的300字节空间 */
    ; A: z# }* W" X) y
  203.                                         osRtxMemoryFree(AppMallocSRAM4, SRAM4_Addres0);' b# Z  D4 Y, o4 Y- p+ q6 b
  204.                                         SRAM4Used = MemHeadPtr(AppMallocSRAM4);# ~, \' o1 u  T3 Z8 o$ d5 _- n, L" Q
  205.                                         printf("释放D3域SRAM动态内存区申请的0300字节,当前共使用大小 = %d字节\r\n", ; N6 ]2 D( O6 r2 r$ b
  206. SRAM4Used->used);
    " ^" _5 W* H: I, p$ P, Z5 r3 n0 o6 C
  207.                                 
    8 ?1 r1 M, ^& @6 y! C1 ?
  208.                                         /* 释放从D3域的SRAM申请的128字节空间 */+ N5 G6 ]6 a9 n! r
  209.                                         osRtxMemoryFree(AppMallocSRAM4, SRAM4_Addres1);
    7 a8 l% G+ L2 ?$ k1 v7 S: t
  210.                                         SRAM4Used = MemHeadPtr(AppMallocSRAM4);+ A7 m. }5 m/ ^1 A4 H
  211.                                         printf("释放D3域SRAM动态内存区申请的0128字节,当前共使用大小 = %d字节\r\n",
    # f3 n2 Q5 \* X, ]- O
  212. SRAM4Used->used);
    ! I5 A" v; \$ K" h% n1 z' \; U
  213.                                 3 C; i3 I2 B5 @' L7 o
  214.                                         /* 释放从D3域的SRAM申请的5111字节空间 *// j, o" |/ v. T8 y
  215.                                         osRtxMemoryFree(AppMallocSRAM4, SRAM4_Addres2);
    ' e; _: o1 g" }7 N( s* P+ o3 w
  216.                                         SRAM4Used = MemHeadPtr(AppMallocSRAM4);3 Z( y0 q' `' z$ t2 ^2 [
  217.                                         printf("释放D3域SRAM动态内存区申请的5111字节,当前共使用大小 = %d字节\r\n",+ k+ f# G8 c; ^" w+ }% j& B' c
  218. SRAM4Used->used);8 h0 j2 g2 w5 D8 i; l7 @+ l8 R5 V% g+ t& }
  219.                                         break;
    0 H/ Y5 b. o/ X5 x
  220.                         " e2 B. _0 O; `  Y
  221.                                 default:6 n- @; u$ }6 t' M. A2 U! M! X
  222.                                   /* 其它的键值不处理 */
    5 C5 U- B0 g" w# |9 R% m( F
  223.                                   break;
    - W) H( s4 j# V! e$ C7 X
  224.                         }$ `" {0 K* I- r! x
  225.                 }# ]' n! l4 l1 E' K8 ?6 `: n3 t
  226.         }( }" f4 w/ _. G8 ?1 Q' @
  227. }
复制代码
- U. {8 q' n" ~. D/ u5 i" \
27.6 总结
6 d4 D0 h% F9 L/ K" K4 V本章节就为大家讲解这么多,还是比较有项目实用价值的,特别是MP3编解码,JPEG编解码,视频播放器,矢量字体等需要动态内存的场合。. b+ K# E6 ~1 F" @/ l

( S2 Y) y) x2 t7 a0 W1 r* e* U" Z
2 z7 y- F' D! G; [4 O
  U6 ~5 O7 H* W2 a" c6 P
收藏 评论0 发布时间:2021-12-23 15:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

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