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

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

[复制链接]
STMCU小助手 发布时间:2021-12-23 15:00
27.1 初学者重要提示5 j$ H# h3 m3 e; V3 x. {7 ?
  学习本章节前,务必优先学习了解TCM,SRAM等五块内存区的基础知识,比较重要。6 _7 I5 \! S+ A0 q
  将RTX5系统的动态内存管理整理了出来,可以同时管理多个分区。如果其它RTOS中使用,记得做互斥保护或者加个调度锁均可。8 _2 v9 F9 A# A  l5 A/ F3 S& ]" H. I
  支持动态内存使用情况统计。
+ c. C9 n, g0 {  z2 u. R27.2 动态内存管理移植( y+ ]- b8 |1 U' z
移植比较简单,仅需添加两个文件到工程即可。: M/ u1 a- X, O9 ]! x
. e6 |! h1 }* }+ y1 E5 J' {0 M: u
27.2.1 MDK版的移植
! s8 Y8 q2 G' u* H+ N% }( M  第1步,添加如下两个文件到MDK中
3 i' u5 F4 D! m) H+ H: P' K3 B9 x, \注,以本章配套例子为例,这两个文件的路径\User\malloc。
2 H' U$ Y0 A# j% v9 ?; p
# i3 I) Q- D1 k
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDcvMTM3OTEwNy0yMDE5.png
( c$ s  T( P) t

7 [4 |& K9 F) t: ~9 I- J- h  第2步,添加路径。
8 @9 k# }7 t8 U5 n3 l8 ?7 F. q( ]6 e' v$ g3 D, z5 K: C2 D
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDcvMTM3OTEwNy0yMDE5.png
+ ?. [+ ^& k* T/ ]& n  ^
' y4 v* ^# b2 G! u& x8 t+ I, \
  第3步,添加头文件。" G, p8 u2 e4 v2 u; B/ j
如果哪个源文件要用到动态内存,包含rtx_lib.h即可,本章配套例子是直接将其放在了bsp.h文件里面,哪个源文件要用到动态内存,直接包含bsp.h头文件即可。
0 [4 c3 z2 l, c% V+ _9 u8 L+ ]  q  i8 R
通过这简单的三步就完成了MDK的移植。* p  F6 x9 e/ r$ y

# d0 e2 z' O" M' z& B3 u7 z5 L27.2.2 IAR版的移植
. c- L/ Z! _7 `- a1 F  第1步,添加如下两个文件到IAR中
( T4 P7 ^1 B8 ?- P# u: Y注,以本章配套例子为例,这两个文件的路径\User\malloc。' \1 ^" {, q* W1 G4 t
+ @* y( ?* R2 S9 L7 K
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDcvMTM3OTEwNy0yMDE5.png
3 e0 E4 h! R/ l! Q4 g- P1 R

8 Q8 D$ U0 H' \9 P5 @  第2步,添加路径。
# j1 R+ T- |4 z, d7 a: y5 |1 f, P+ I; z
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDcvMTM3OTEwNy0yMDE5.png

$ X' E$ O0 e- i* g4 Y2 t& ^; m
" Q; }* L6 w3 x( J  第3步,添加头文件。
+ ?8 d6 ]3 y/ h1 T& f1 Q+ u" y如果哪个源文件要用到动态内存,包含rtx_lib.h即可,本章配套例子是直接将其放在了bsp.h文件里面,哪个源文件要用到动态内存,直接包含bsp.h头文件即可。
/ f4 K" l1 M7 o! ~0 G1 G; D
3 G. y3 X  ]3 n6 n  s4 t通过这简单的三步就完成了IAR的移植。
; ?4 E! p4 M1 |/ i2 I2 T2 X/ l# \) r9 O2 I' G9 X% j" T  P4 y6 g6 B
27.3 动态内存的使用方法
$ a2 H' s7 G3 B( V- G下面分别以MDK和IAR为例进行说明:
9 D3 u) J3 V  f. ]0 @4 h) @4 c+ K$ x) H. n4 ~2 d4 F& e. T# v0 K& r' y
27.3.1 MDK上的动态内存用法, ?# ^( [% `% G1 U$ a  r
  定义动态内存区
, R- V; ]4 g0 D% o2 g比如当前的主RAM用的DTCM,我们就可以直接定义一块大的数组作为动态内存空间:
* f0 |) l, O) e$ F! L( [
) ]# n  u1 X& K. l# n% Y5 w( r
  1. /* DTCM, 64KB */
    * W' `0 d2 h% A; }& G$ R0 U
  2. /* 用于获取当前使用的空间大小 */6 F6 R8 R# o0 m% u
  3. mem_head_t *DTCMUsed;
    4 j, s; O* H3 ]" a9 n  O1 K( s' R
  4. /* 定义为64位变量,首地址是8字节对齐 */             " r- L) N; _5 ~
  5. uint64_t AppMallocDTCM[64*1024/8];
复制代码
- m0 l/ U, s8 x7 \
如果要使用AXI SRAM作为动态内存空间,可以使用__attribute__((at( )))指定地址。
- J2 T/ c- s9 e0 d) Q
. b; w/ F% V  E6 o2 |
  1. /* D1域, AXI SRAM, 512KB */
    " p! {& ]4 I8 \; j6 W# R4 Y
  2. /* 用于获取当前使用的空间大小 */
    ! Q4 K( `2 j" @& ^
  3. mem_head_t *AXISRAMUsed;  5 l" V* v! I) U9 j
  4. /* 定义为64位变量,首地址是8字节对齐 */
    3 b6 M* M6 Z3 _; U1 \4 R! ?+ j
  5. uint64_t AppMallocAXISRAM[512*1024/8]__attribute__((at(0x24000000)));
复制代码
+ g6 E* T/ K3 F9 D6 W
  初始化动态内存区2 u; N5 a- u, k) k+ L, V; ^. o
调用动态内存管理提供的函数osRtxMemoryInit即可做初始化:9 V' X3 C! v2 E% _# e1 o
1 _' {& _5 L: q* i/ V
osRtxMemoryInit(AppMallocDTCM,    sizeof(AppMallocDTCM));
' n0 W9 P8 V2 z! yosRtxMemoryInit(AppMallocAXISRAM, sizeof(AppMallocAXISRAM));
* ^  ?+ e/ I& w1 y0 ^% h0 h$ J+ r# y  m! u, N
  申请动态内存+ Y, i) d7 j8 _6 ^) p" ?
通过函数void *osRtxMemoryAlloc (void *mem, uint32_t size, uint32_t type)做动态内存申请。
: B  s5 R# {) m  w$ ^/ S3 O( l/ j6 N- Y$ E6 n' u. }' q4 P
第1个参数填写内存区首地址,比如申请的AppMallocDTCM,就填AppMallocDTCM即可。
8 x9 F! ?  D# J! s# J0 Z' \- Z6 J
$ p6 w3 T6 {& v+ T  _6 E0 A第2个参数填写申请的字节大小,单位字节。
% H- z9 Y, b" |1 ?! w- A4 O; F9 |0 K+ H
第3个参数固定填0即可。
" x$ d6 m% k& o- U- a: K; n& q: C# O# T
返回值是所申请缓冲区的首地址,如果没有空间可用,将返回NULL,这点要特别注意!- l1 f/ u" v- {( C$ _
# A' k3 y  O" _* n& }/ k9 M
举个例子:
0 i; I' w9 |: e0 A0 }+ e3 Y" j' f+ h, |" S" z/ B' m* ~- j1 Z
  1. uint32_t *DTCM_Addres0, *AXISRAM_Addres0;6 i7 {  k9 [4 z: ^7 I

  2. ! ^( F+ X! X& E; V5 B/ E
  3. /* 从DTCM申请280字节空间,使用指针变量DTCM_Addres0操作这些空间时不要超过280字节大小 */        
    1 e& l" [; |& y1 A; o/ H
  4. DTCM_Addres0 = osRtxMemoryAlloc(AppMallocDTCM, 280, 0);4 y# O# ~3 r3 _8 y
  5. DTCMUsed = MemHeadPtr(AppMallocDTCM);1 f) X7 O7 j6 {7 D! A4 o+ u7 u
  6. printf("DTCM总大小 = %d字节,申请大小 = 0280字节,当前共使用大小 = %d字节\r\n",
    - o$ r7 Y. h$ n% l2 x' T) C" r# w
  7.                                                              DTCMUsed->size, DTCMUsed->used);
    6 D% h0 W$ ~' v/ w

  8. 5 D! `  J8 c5 ^. a0 r, r# r8 C' \/ O
  9. /* 从AXI SRAM 申请160字节空间,使用指针变量AXISRAM_Addres0操作这些空间时不要超过160字节大小 */        9 k# Z) Q+ b9 u0 T4 ^. C
  10. AXISRAM_Addres0 = osRtxMemoryAlloc(AppMallocAXISRAM, 160, 0);0 l, d5 @! C1 l; g) i- l, ?7 D
  11. AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);
    6 n6 \# e2 i/ a4 j/ m, Y
  12. printf("AXI SRAM总大小 = %d字节,申请大小 = 0162字节,当前共使用大小 = %d字节\r\n", + J4 U  U. J$ d. l# {' P
  13.                                                             AXISRAMUsed->size, AXISRAMUsed->used);
复制代码
# \$ z5 T; B+ }! m4 |
申请了空间后,就可以直接使用了。另外注意红色字体部分,通过DTCMUsed->used和AXISRAMUsed->used可以获取当前使用的空间大小。
- M. @( e2 J; R) |& V0 j$ `  m4 ]9 y& x9 [! t5 M) n3 e
  释放动态内存
" R/ W# _- T7 P) c$ k通过函数uint32_t osRtxMemoryFree (void *mem, void *block)做动态内存释放。
" p9 Z  P; R6 L( |
5 F+ Z9 a7 c! O7 T! ], K' o- h第1个参数填写内存区首地址,比如释放的AppMallocDTCM,就填AppMallocDTCM即可。
1 H5 q! |; K$ ~8 R6 C# h! S
! A4 ^( {1 d! E% i  ?4 [第2个参数填写申请内存时所获取的内存区首地址,这里用于释放。- @+ A2 N1 R' e' B

( i+ O, R) J3 J5 \返回值,返回1表示成功,返回0表示失败。# M) M' m4 T, Q' A7 P9 j

% l: f; q  k; n: i举个例子:* Z- v( c% F9 q

( I5 E- P( h# ~+ v+ |
  1. /* 释放从DTCM申请的280字节空间 */% Z4 ]5 }( {, f. f  i! \
  2. osRtxMemoryFree(AppMallocDTCM, DTCM_Addres0);0 m" o7 r4 S+ ?0 d3 m
  3. DTCMUsed = MemHeadPtr(AppMallocDTCM);
    ( V4 o4 ^$ `: x$ F. r
  4. printf("释放DTCM动态内存区申请的0280字节,当前共使用大小 = %d字节\r\n", DTCMUsed->used);* R1 `% o' M9 K8 i

  5. " @2 B( [8 l; u8 s9 u
  6. /* 释放从AXI SRAM申请的160字节空间 */
    8 H& d! ?4 W* w+ L+ t( S$ [( f
  7. osRtxMemoryFree(AppMallocAXISRAM, AXISRAM_Addres0);
    ) T. c3 _8 G8 X7 c8 n/ m6 j
  8. AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);
    - I# p! D& u" d$ q0 V9 z! H$ m3 P
  9. printf("释放AXI SRAM动态内存区申请的0160字节,当前共使用大小 = %d字节\r\n", AXISRAMUsed->used);
复制代码
9 v) J( p9 ?% s1 \9 z
27.3.2 IAR上的动态内存用法5 z0 v6 E0 `, E8 y3 R" Y
注:IAR使用这个动态内存管理,仅在定义时跟MDK略有不同,其它地方是一样的。: L- f$ Z; g# K9 A9 c+ }
, o  z0 ?: V- {5 [! v) w
  定义动态内存区
, p: |4 W' u- b1 `& j比如当前的主RAM用的DTCM,我们就可以直接定义一块大的数组作为动态内存空间:
: ]/ V5 `0 H! {1 ^* A# W' ~# g7 k9 H/ T# L# ~4 X# }' r
  1. /* DTCM, 64KB */
    & C+ j: w; h; ?
  2. /* 用于获取当前使用的空间大小 */
    $ P3 q1 n! u. y' p. G
  3. mem_head_t *DTCMUsed; + ?% |* r9 G# ^% g8 N
  4. /* 定义为64位变量,首地址是8字节对齐 */            
    ' w& l1 y7 z6 Q0 }& r# p" J9 v
  5. uint64_t AppMallocDTCM[64*1024/8];
复制代码
* r3 N1 C1 ?) u, m5 w) `- v
如果要使用AXI SRAM作为动态内存空间,可以使用__attribute__((at( )))指定地址。5 t/ c9 o7 _7 a8 {2 J# y0 w; U
' ]. J& c; @; G2 T  ^: y5 s
  1. /* D1域, AXI SRAM, 512KB */
    ( y5 ~1 w: k/ e$ Q
  2. /* 用于获取当前使用的空间大小 */  k, q/ z' B- s+ u3 y4 K  A& L4 K
  3. mem_head_t *AXISRAMUsed;  
    8 r! u( r/ b3 h/ Y4 ]+ a/ \
  4. /* 指定下面数组的地址为0x24000000 */ + [4 h' W1 f0 o" J
  5. #pragma location = 0x240000006 O7 X4 s% h" x$ E3 [% g+ t
  6. uint64_t AppMallocAXISRAM[512*1024/8];
复制代码

0 x3 {0 T. `# X8 R2 |  初始化动态内存区
+ F" G8 t! |  N& [调用动态内存管理提供的函数osRtxMemoryInit即可做初始化:. Y9 l, i) r! N2 L6 q9 B# a; M
- ]9 {( [- u- X9 s0 y
  1. osRtxMemoryInit(AppMallocDTCM,    sizeof(AppMallocDTCM));
    . ~, Q8 A. P. r
  2. osRtxMemoryInit(AppMallocAXISRAM, sizeof(AppMallocAXISRAM));
复制代码

" |9 v+ H: M$ c+ r9 e  申请动态内存
1 Q/ g, D2 w2 w. z通过函数void *osRtxMemoryAlloc (void *mem, uint32_t size, uint32_t type)做动态内存申请。& r, Z0 @7 J; i+ K- y

( c5 ^6 D- r: e# K第1个参数填写内存区首地址,比如申请的AppMallocDTCM,就填AppMallocDTCM即可。# Z- m9 H. N8 R! a

0 n8 f- d# |' E$ Z# E: H! r6 ^5 f第2个参数填写申请的字节大小,单位字节。3 k/ }2 t# h  }( }. B
0 v: ^4 z! M3 [% O8 {5 A. ]
第3个参数固定填0即可。9 Q) ^7 I1 G+ ]# C7 \0 K

  \' J/ W# Z& e  {; T3 ~2 `+ U返回值是所申请缓冲区的首地址,如果没有空间可用,将返回NULL,这点要特别注意!
- N: W5 f  F- H4 `8 R
. b' x9 f) @" B0 e% O3 f; E4 g举个例子:7 ^* f# p* K3 g& H
, B, B( w+ u' g/ z4 o) X
  1. uint32_t *DTCM_Addres0, *AXISRAM_Addres0;- M; t% d+ V* j, M. u: k6 d0 `4 C

  2. . s; c4 r: `0 J5 I% J
  3. /* 从DTCM申请280字节空间,使用指针变量DTCM_Addres0操作这些空间时不要超过280字节大小 */        5 J8 S' t) \* p6 A( P  P
  4. DTCM_Addres0 = osRtxMemoryAlloc(AppMallocDTCM, 280, 0);
    5 N1 @0 `- u* k
  5. DTCMUsed = MemHeadPtr(AppMallocDTCM);# K$ R7 t. _- @( ]8 c+ P
  6. printf("DTCM总大小 = %d字节,申请大小 = 0280字节,当前共使用大小 = %d字节\r\n", 8 \# x+ I8 R& ~# m! z1 h
  7.                                                              DTCMUsed->size, DTCMUsed->used);
    * Z1 n6 B4 y1 m# [; Z

  8. 1 r9 m  f: W1 Z" |1 |1 C; u' j# e' N
  9. /* 从AXI SRAM 申请160字节空间,使用指针变量AXISRAM_Addres0操作这些空间时不要超过160字节大小 */        9 b7 }) _5 q! c5 {
  10. AXISRAM_Addres0 = osRtxMemoryAlloc(AppMallocAXISRAM, 160, 0);
    : x4 e8 \* M0 Z' y' a
  11. AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);
    1 b5 |" K+ F) Q6 n+ Y
  12. printf("AXI SRAM总大小 = %d字节,申请大小 = 0162字节,当前共使用大小 = %d字节\r\n", 4 A7 G! \' Y' Y  f9 s- U* \4 A
  13.                                                             AXISRAMUsed->size, AXISRAMUsed->used);
复制代码

  k+ r/ L4 i% ?' y2 M9 K* K申请了空间后,就可以直接使用了。另外注意红色字体部分,通过DTCMUsed->used和AXISRAMUsed->used可以获取当前使用的空间大小。
6 C, j/ X- S  ?+ }  A
, K$ O/ d. K7 y" f$ V6 s8 l  释放动态内存
0 W& G" A& u- t# k- t1 G6 P. e通过函数uint32_t osRtxMemoryFree (void *mem, void *block)做动态内存释放。
, I' n' I) G1 n( t: A6 T/ U3 A5 J% D' ?% h% [6 u) j# O
第1个参数填写内存区首地址,比如释放的AppMallocDTCM,就填AppMallocDTCM即可。; r& U/ Y  |7 M; |# y
/ N  V1 D1 v) S3 R) ~' M4 v
第2个参数填写申请内存时所获取的内存区首地址,这里用于释放。+ N) k7 ]" ?' F4 N+ g
5 `7 b* K/ F! O, q! m0 c! Q
返回值,返回1表示成功,返回0表示失败。1 V/ ^! E. f4 X8 P
' s9 L. x' Y# m& p) {! g8 v) |
举个例子:  `! H( E8 |6 R

1 V' j6 |. n( `% t4 K
  1. /* 释放从DTCM申请的280字节空间 */
    5 K4 a% M  m. i$ D1 k! {$ V7 H
  2. osRtxMemoryFree(AppMallocDTCM, DTCM_Addres0);9 l' e; |. J' B% m: h4 [$ i! p
  3. DTCMUsed = MemHeadPtr(AppMallocDTCM);8 S  @' |0 q2 [1 D, e
  4. printf("释放DTCM动态内存区申请的0280字节,当前共使用大小 = %d字节\r\n", DTCMUsed->used);: k: J% @: Z/ l2 \) s
  5. 8 S( j( _' V; a
  6. /* 释放从AXI SRAM申请的160字节空间 */+ {% P7 R* }  V
  7. osRtxMemoryFree(AppMallocAXISRAM, AXISRAM_Addres0);* a9 U  d0 y3 \1 p" B
  8. AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);4 F' q# r0 L% e% B( f
  9. printf("释放AXI SRAM动态内存区申请的0160字节,当前共使用大小 = %d字节\r\n", AXISRAMUsed->used)
复制代码
/ a1 `2 L/ p6 E; f" K
27.4 实验例程说明(MDK)
' K2 I2 [6 E5 J1 T3 [% y配套例子:
7 P& t" ?/ v. c8 S& zV7-006_TCM,SRAM等五块内存的动态内存分配实现
) f0 p, P3 b, G, `) s  Z9 V  h/ t2 E8 R7 C) ^
实验目的:# d; A6 W! q5 s
学习TCM,SRAM等五块内存的动态内存分配实现。
8 |3 O! C$ a8 N! U8 c) {8 Q, y" k$ Z* S7 {- Q# z6 n
. U+ @. O% }; Z, q! x4 d  z5 a
实验内容
. I7 |9 F5 n7 `6 l4 r8 B! N启动自动重装软件定时器0,每100ms翻转一次LED2。9 K8 X& ~, `& Z
( {4 `3 T% A* u3 l( @
5 V8 W5 n( {% E, e; F; O: T
实验操作:
$ B: P7 n4 Y+ q, ]* X1 G2 n% H$ T9 PK1键按下,从DTCM依次申请280字节,64字节和6111字节。0 k4 h$ u/ e7 o- ]* L9 m( j
K1键松开,释放从DTCM申请的空间。
7 g" T: V% |4 B8 Z+ k9 hK2键按下,从AXI SRAM依次申请160字节,32字节和2333字节。! L( Z% N; F1 Z, c4 ]
K2键松开,释放从AXI SRAM申请的空间。
9 D% x: l/ g0 ^4 D9 hK3键按下,从D2域SRAM依次申请200字节,96字节和4111字节。
3 W4 l1 o& `8 N$ z5 GK3键松开,释放从D2域SRAM申请的空间。& U3 m1 A7 z9 O- y! ?9 v
摇杆OK键按下,从D3域SRAM依次申请300字节,128字节和5111字节。
' |$ ?4 z( {4 Y* g  s, T摇杆OK键松开,释放从D3域SRAM申请的空间。
' o# E; u; v( `7 R- g4 z3 _# n6 Y  ]' v, D% ^

0 d6 R+ ~! f4 \3 q# X7 P2 F上电后串口打印的信息:# O/ J% p9 P2 B( _# R
7 Z$ T& F8 G7 X; V' n  @. @; @
波特率 115200,数据位 8,奇偶校验位无,停止位 1
1 H8 Z4 {$ A& s& L0 c- F/ O, \$ l$ U9 V4 y
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDcvMTM3OTEwNy0yMDE5.png
3 z9 q9 A2 m4 C* ~/ k: O
2 g  o0 \) t- @% U  ^0 p, B7 J
程序设计:3 K  j3 p: L& X3 G& o+ c1 Y
) S( {" M0 Y' d
  系统栈大小分配:
! _$ n. ?& F7 B4 w' a) F% t! D1 ~  q
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDcvMTM3OTEwNy0yMDE5.png

+ h, J" S+ ~7 x$ W& s, J+ o! K5 `# q9 `/ Z5 \1 S
RAM空间用的DTCM:
/ _# _& ^% m0 `" F8 u
- v% Q! ~4 B$ k3 P3 m7 _
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDcvMTM3OTEwNy0yMDE5.png
0 p: I; V+ L3 S

( `: Z1 d7 D2 k5 h  硬件外设初始化
2 l: X5 Q- Z& n6 ]
6 w4 a# @, P6 }! k9 o! u0 N硬件外设的初始化是在 bsp.c 文件实现:
+ E9 j( N" n2 E" A* {" M+ l
3 `; i6 [, k  o* ?  a, F# M
  1. /*
    2 b- {1 C, h  a' C2 h' Y3 g; {4 J
  2. *********************************************************************************************************
    : \7 g1 B0 ~8 Z
  3. *        函 数 名: bsp_Init- D* l4 ]" ?8 |( R! n- j) l, [$ z
  4. *        功能说明: 初始化所有的硬件设备。该函数配置CPU寄存器和外设的寄存器并初始化一些全局变量。只需要调用一次% q8 |8 |% m) `' {# ?
  5. *        形    参:无
    7 w+ j9 J  O. W2 V/ |, ~
  6. *        返 回 值: 无
    + p2 m  c: y4 e% b$ e$ |8 _: H
  7. *********************************************************************************************************
    8 ^, M+ _6 t3 R4 C7 J
  8. */
    7 }7 Q, I% A" a, G
  9. void bsp_Init(void)
    5 K# F6 J$ w0 `; }; \. H
  10. {
    % ~$ y6 |3 `5 |: k
  11.     /* 配置MPU */0 _% H  v% ~  ^9 `  \3 H( o
  12.         MPU_Config();
    5 t( P/ t3 O* ?; y/ m. V# a, D7 u
  13.         4 p& P3 a. a; G! z4 n! C' I) P
  14.         /* 使能L1 Cache */8 M  N  M; C, b& j, h# F+ U
  15.         CPU_CACHE_Enable();
    ; M. A8 B- B2 w+ W% Z

  16. 2 `7 j" h) D2 r2 J1 M
  17.         /*
    $ W& w  E* `1 I1 Q5 b0 n: W
  18.        STM32H7xx HAL 库初始化,此时系统用的还是H7自带的64MHz,HSI时钟:
    - h+ w/ m0 |* o: W' v: \
  19.            - 调用函数HAL_InitTick,初始化滴答时钟中断1ms。
    , t# _6 R( M5 g4 b% n
  20.            - 设置NVIV优先级分组为4。% Z* X, L4 ]3 V3 G
  21.          */2 F, n3 t7 U* O+ O9 i! }1 H" J
  22.         HAL_Init();* `( G( t( ~5 n, f

  23. ) w" |1 H: U1 J& c( ]9 {
  24.         /* / Q+ H* B, A7 p# \2 N1 x% R& E
  25.        配置系统时钟到400MHz
    0 K  w, E: k& ^' r3 B5 @* B
  26.        - 切换使用HSE。2 ^" X' L+ P+ O" M* y7 N: f* L, v
  27.        - 此函数会更新全局变量SystemCoreClock,并重新配置HAL_InitTick。6 N0 q" C1 ], E2 E; N/ G0 m
  28.     */
    3 M0 T3 `9 e& g  }" a/ b7 ?
  29.         SystemClock_Config();+ S3 I+ D! B6 Y$ L; }, P& G
  30. ; G8 \' H1 i, m; m* y! M
  31.         /*
    7 w! _# R. [3 L, S3 H: V/ ~
  32.            Event Recorder:' H  d6 p! M8 N: x4 d0 o* i
  33.            - 可用于代码执行时间测量,MDK5.25及其以上版本才支持,IAR不支持。" h0 v0 n; \- `
  34.            - 默认不开启,如果要使能此选项,务必看V7开发板用户手册第xx章
    # y- N" a1 [7 ]$ g) F9 r
  35.         */        4 A: \. O2 \! r
  36. #if Enable_EventRecorder == 1  
    # Q* z$ [3 Y' V0 ~1 s
  37.         /* 初始化EventRecorder并开启 */
    ' H9 q& S6 j& \' c. V" Y# W
  38.         EventRecorderInitialize(EventRecordAll, 1U);
    $ m* f4 Y% `6 o
  39.         EventRecorderStart();
    " b$ D7 ]- R" W5 b6 ~% J- [
  40. #endif& w3 Q( ]- f4 n. O
  41.         
    " Q3 }* \/ B3 d7 s
  42.         bsp_InitKey();            /* 按键初始化,要放在滴答定时器之前,因为按钮检测是通过滴答定时器扫描 */
    2 M/ l" Q6 x$ x) L/ |
  43.         bsp_InitTimer();          /* 初始化滴答定时器 */% x" ?1 d/ Q9 ]" F# h/ T
  44.         bsp_InitUart();        /* 初始化串口 */+ S: }0 \) |7 o, V2 Z" l
  45.         bsp_InitExtIO();        /* 初始化FMC总线74HC574扩展IO. 必须在 bsp_InitLed()前执行 */        
    7 x8 Q2 V# Q' {
  46.         bsp_InitLed();            /* 初始化LED */        
    / |  \$ ]) x+ K8 f  d2 Y* v
  47. }
复制代码

1 j) z8 R; [2 c7 {/ o  MPU配置和Cache配置:% |8 M3 o! [; }% I# @& K- K
数据Cache和指令Cache都开启。
/ z5 g; V; z1 t5 Z/ v# _* t& J; P
1 N! ]5 z5 [) A( n7 XAXI SRAM的MPU属性:
6 [+ T, x- U9 k1 H/ {# {) H
, e; M0 R. ?7 \6 v0 y1 sWrite back, Read allocate,Write allocate。  o6 x' X% f6 y, U5 [0 b
2 {# ]1 E' t" q) K
FMC的扩展IO的MPU属性:; p( P9 @& \- h+ Z% g) v" i- J
; S8 Q, S- |! }& O4 A" N6 Q
必须Device或者Strongly Ordered。
( h2 {: B* Z( Y$ R* W" R  D. {+ O5 X, S9 m6 _/ S
D2 SRAM1,SRAM2和SRAM3的MPU属性:
$ l& j2 f7 v. S& G' [; J
7 ^' B, T! J/ ^. u0 B( ZWrite through, read allocate,no write allocate。
' Z* F1 c( Y0 r, b' [
8 ]- Y) q# L4 b% H) p/ f" A6 SD3 SRAM4的MPU属性:- T8 h3 g8 y) N7 m& L4 b" D
9 k/ v( b4 e5 C1 V
Write through, read allocate,no write allocate。
5 A  D8 Y/ e* R) V( T
& ?+ w6 A# V& T- d
  1. /*
    ' m/ B/ I* c! y; g3 s
  2. *********************************************************************************************************
    4 n, m# t2 V6 V8 t; x0 f
  3. *        函 数 名: MPU_Config
    3 r, B8 q, t% a5 c$ N2 N% _$ d
  4. *        功能说明: 配置MPU4 y. W4 i7 G8 o# R' A
  5. *        形    参: 无1 Q& v4 n% W: F0 E  H, ~
  6. *        返 回 值: 无' g9 Q3 }  @' a  R: v
  7. *********************************************************************************************************: ?7 e. Y% _, l! U+ ?) B
  8. */$ {1 ?2 H$ \* b) C! ^
  9. static void MPU_Config( void )1 g0 ?5 ?5 _0 {& y( Z. F
  10. {# [- x& _/ V( Z+ ^7 h0 g# ~! B
  11.         MPU_Region_InitTypeDef MPU_InitStruct;# J; h" \' j' s' @
  12. $ X) Q# i' R1 l" M$ a" d6 X: K
  13.         /* 禁止 MPU */
    7 w4 \6 S' B0 c6 m+ J) l
  14.         HAL_MPU_Disable();
    ( f6 _8 x1 U3 V" ?( T
  15. 7 ~1 q* S+ d0 n2 w% Z0 l* ]( X
  16.         /* 配置AXI SRAM的MPU属性为Write back, Read allocate,Write allocate */
    , I$ i4 l# I8 a  ]1 L! V% h
  17.         MPU_InitStruct.Enable           = MPU_REGION_ENABLE;2 a$ y8 H$ C8 t/ ~6 `9 i
  18.         MPU_InitStruct.BaseAddress      = 0x24000000;; n8 Q$ U- b6 i3 P4 ~
  19.         MPU_InitStruct.Size             = MPU_REGION_SIZE_512KB;" A/ k+ d, B" B+ R. \
  20.         MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;( q) u( c& J5 c, U
  21.         MPU_InitStruct.IsBufferable     = MPU_ACCESS_BUFFERABLE;
    4 U, j2 I3 P4 Z9 r0 P1 I( t
  22.         MPU_InitStruct.IsCacheable      = MPU_ACCESS_CACHEABLE;! r- z  D+ s+ D
  23.         MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;
    1 @- n6 q% G( N# ?& g' b: S5 o( I4 Y
  24.         MPU_InitStruct.Number           = MPU_REGION_NUMBER0;$ L9 W0 [6 |: {$ ?) z
  25.         MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL1;
    % _0 t- U6 c  B# X% t4 |8 c. c. Z
  26.         MPU_InitStruct.SubRegionDisable = 0x00;
    * E- D  T; E1 L, z1 C. L
  27.         MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;
    / l2 s) \( g* x8 T
  28. . b; h( j  P- t. k* S
  29.         HAL_MPU_ConfigRegion(&MPU_InitStruct);1 x4 w" u% g1 m3 W2 U* s
  30.         - _- J, W9 e: S/ E$ I' q
  31.         
    : h- T2 Y9 N0 y6 O4 y- R
  32.         /* 配置FMC扩展IO的MPU属性为Device或者Strongly Ordered */
    ! u  G) D9 _7 x# C: q$ b# Y
  33.         MPU_InitStruct.Enable           = MPU_REGION_ENABLE;
    # u  }3 O) T9 l8 Q
  34.         MPU_InitStruct.BaseAddress      = 0x60000000;
    2 h: E' s6 N+ _* `5 W
  35.         MPU_InitStruct.Size             = ARM_MPU_REGION_SIZE_64KB;        
    ( T+ v+ L$ k7 Z# ?% O/ [
  36.         MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;) x/ P7 h3 d  {6 C5 w
  37.         MPU_InitStruct.IsBufferable     = MPU_ACCESS_BUFFERABLE;% g# p* Z1 _. F; K0 o; d
  38.         MPU_InitStruct.IsCacheable      = MPU_ACCESS_NOT_CACHEABLE;5 k- n" j( K7 H' C+ X; i+ f
  39.         MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;+ O, J/ T7 g3 W4 L
  40.         MPU_InitStruct.Number           = MPU_REGION_NUMBER1;. {2 Z( g! `1 k
  41.         MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL0;9 g/ n% D8 Z8 X# E: q' [* j
  42.         MPU_InitStruct.SubRegionDisable = 0x00;
    9 e- f. X$ R- J2 O! F, T
  43.         MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;6 n5 U% v/ P. T. ^, K" r+ n2 r
  44.         
    2 o# i+ Q3 M0 V# D4 X' g
  45.         HAL_MPU_ConfigRegion(&MPU_InitStruct);
    * ]7 d; ?3 E- W! w+ w2 V2 e: ^* l8 |
  46.         ) s  H/ E+ V! P8 A0 [: x+ i# H
  47.         /* 配置SRAM1的属性为Write through, read allocate,no write allocate */
    ; q8 z$ d$ \& |! o9 G8 s
  48.     MPU_InitStruct.Enable           = MPU_REGION_ENABLE;  L: \  t% V6 `8 k5 S
  49.     MPU_InitStruct.BaseAddress      = 0x30000000;
    $ P$ X6 h! S6 ]8 h  U" L( Z! |
  50.     MPU_InitStruct.Size             = ARM_MPU_REGION_SIZE_128KB;        0 Q5 I/ r. B! I9 g: k7 X
  51.     MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
    0 O, D# v# L( \" k
  52.     MPU_InitStruct.IsBufferable     = MPU_ACCESS_NOT_BUFFERABLE;$ ]$ K: Y) M# |: E
  53.     MPU_InitStruct.IsCacheable      = MPU_ACCESS_CACHEABLE;# Z# r4 B6 ~3 t) H- J, X
  54.     MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;
    & R7 @4 C9 n1 Z# G3 }* T
  55.     MPU_InitStruct.Number           = MPU_REGION_NUMBER2;& x; z; K4 ?7 r; E4 h: q* F) G. \
  56.     MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL0;
    # k1 @+ l2 J7 l7 y) {: [
  57.     MPU_InitStruct.SubRegionDisable = 0x00;( E$ _" C' I6 u& o
  58.     MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;
    ( Q+ T) D. j7 c8 a, D+ {; ~0 s3 e

  59. * {( q, R6 w' T) C- f3 n" j
  60.     HAL_MPU_ConfigRegion(&MPU_InitStruct);
    3 m3 d( u/ E1 c) ^  N; E
  61.         
    ) V! g9 |5 A( h
  62.         /* 配置SRAM2的属性为Write through, read allocate,no write allocate */
    ! Y; C* r5 U6 B/ ~  z& {) A
  63.     MPU_InitStruct.Enable           = MPU_REGION_ENABLE;
    0 @/ d# E: Y! n1 i. B2 h
  64.     MPU_InitStruct.BaseAddress      = 0x30020000;
    4 Q/ i/ {9 E4 \' U
  65.     MPU_InitStruct.Size             = ARM_MPU_REGION_SIZE_128KB;        
    ( I. B% _% R* E+ X% L
  66.     MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
    + i5 j( L6 ~  t" i7 R- b
  67.     MPU_InitStruct.IsBufferable     = MPU_ACCESS_NOT_BUFFERABLE;- ~/ `  P6 K' V6 m
  68.     MPU_InitStruct.IsCacheable      = MPU_ACCESS_CACHEABLE;  U% g8 b! e- K! H6 B) Q- C
  69.     MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;/ i2 O: t9 d2 S* k* c2 F# A
  70.     MPU_InitStruct.Number           = MPU_REGION_NUMBER3;
    * X; ?0 H# `" I% D" m) v+ ~
  71.     MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL0;) Y$ w& x5 b! S
  72.     MPU_InitStruct.SubRegionDisable = 0x00;  b" B" J  h( P% x" d
  73.     MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;
    4 U( z$ \. X( j4 }% ?; l. O/ q- y. ?
  74. 6 \3 O, r% `" H. }+ i. m" m# t
  75.     HAL_MPU_ConfigRegion(&MPU_InitStruct);
    ! ^& p) @  l* U+ \' ]

  76.   }/ k( F( @7 I9 S6 q

  77. 2 n8 W& G$ n1 H' g0 V$ q% H# v
  78.     /* 配置SRAM3的属性为Write through, read allocate,no write allocate */+ B4 a$ H7 r7 I" }& `  N& q2 o" W
  79.     MPU_InitStruct.Enable           = MPU_REGION_ENABLE;
    2 k( z6 E, j1 M" {7 n& U7 U0 ?
  80.     MPU_InitStruct.BaseAddress      = 0x30040000;
    # o7 h5 \5 S- o: O. s
  81.     MPU_InitStruct.Size             = ARM_MPU_REGION_SIZE_32KB;        
    7 t7 Y9 X0 o# z3 T" \! f. s; A+ r
  82.     MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
    . T  F! b1 z% K) k3 C. F
  83.     MPU_InitStruct.IsBufferable     = MPU_ACCESS_NOT_BUFFERABLE;
    ( d4 b. c- }1 ?8 r
  84.     MPU_InitStruct.IsCacheable      = MPU_ACCESS_CACHEABLE;
    ( e( O* J. b- K$ B
  85.     MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;
    , v: y( a% r* X; C- [0 v
  86.     MPU_InitStruct.Number           = MPU_REGION_NUMBER4;8 b) u; @2 I& M5 n
  87.     MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL0;7 d; A: D. E& c) N
  88.     MPU_InitStruct.SubRegionDisable = 0x00;& f" L. }- S/ b- h! |( c" J
  89.     MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;( C( X/ b6 S3 A* `4 M
  90. 7 V: k, Q* u* b; _, s7 [" @; G* ~
  91.     HAL_MPU_ConfigRegion(&MPU_InitStruct);
    8 h5 J; ~0 Z, \* Z, L, ]+ x
  92.         
    * u/ }  H$ i+ h/ e
  93.         
    9 f2 @$ R  M, F- a0 L5 K/ R
  94.         /* 配置SRAM4的属性为Write through, read allocate,no write allocate */
    1 w3 E! v# d, ^+ G
  95.     MPU_InitStruct.Enable           = MPU_REGION_ENABLE;1 I$ o/ N; [$ v3 E* ^
  96.     MPU_InitStruct.BaseAddress      = 0x38000000;
    . N: s! F% C/ }4 r$ l6 g3 s( K
  97.     MPU_InitStruct.Size             = ARM_MPU_REGION_SIZE_64KB;        
    . V6 s' T' l2 U7 M3 M2 N' j: D- _' e0 p
  98.     MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
    ( W+ P' `- Y8 r1 F: n) n; i
  99.     MPU_InitStruct.IsBufferable     = MPU_ACCESS_NOT_BUFFERABLE;# A9 b( r& D# m) Q
  100.     MPU_InitStruct.IsCacheable      = MPU_ACCESS_CACHEABLE;
      p" |9 d1 p0 Z/ E. E7 p7 L2 ]
  101.     MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;( o/ y6 ]& w  H7 j# c
  102.     MPU_InitStruct.Number           = MPU_REGION_NUMBER5;$ N+ j7 a+ |* x( ], B' q
  103.     MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL0;
    3 Y$ S: \) N2 d- T4 W! _- |, O
  104.     MPU_InitStruct.SubRegionDisable = 0x00;
    % z* x1 f2 G* C. M- F1 x2 T6 _
  105.     MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;0 R0 z/ \, q* j) o1 ?
  106. 4 a# f7 z; Z, b' Q) n3 a  B
  107.     HAL_MPU_ConfigRegion(&MPU_InitStruct);
    ' v0 @5 O5 c) T0 M0 P. @6 J
  108.         3 c& D1 e3 B# i2 `$ z
  109.         /*使能 MPU */0 Z8 u( s3 w1 z" f0 a' S
  110.         HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);  D8 a  p% o0 S6 d+ O$ [) B: R
  111. }
    2 |; O  \( L8 i& h& v* z
  112. * j5 t5 z2 |# b9 O2 y# ]
  113. /*2 y* F( I2 j0 d! P1 s& A  A
  114. *********************************************************************************************************4 B4 w/ N' Q; D- j
  115. *        函 数 名: CPU_CACHE_Enable
      n8 O  }% ~7 D' m1 S5 b8 o  r0 j
  116. *        功能说明: 使能L1 Cache. y! F) _- g+ `8 A0 Z
  117. *        形    参: 无
    2 P" U  O; @2 {$ o& d1 [! w, y4 M7 H
  118. *        返 回 值: 无1 I7 s( Z; G* U$ X
  119. *********************************************************************************************************
    6 I4 T* v2 C! o4 S8 v% }9 o$ F- r
  120. */: ~& |; j4 p6 T3 r3 y! \: f& t
  121. static void CPU_CACHE_Enable(void)
    6 w* L/ A" o! }: R4 S' S# {+ t
  122. {/ c; z6 E$ y4 i
  123.         /* 使能 I-Cache */
    1 a8 T" l9 t  e3 |
  124.         SCB_EnableICache();% w9 Q5 ?7 ?# I1 k6 ]# R
  125. * c2 X( o9 K/ l  M
  126.         /* 使能 D-Cache */
    - E, w( c- D6 b, e' X
  127.         SCB_EnableDCache();; J  S( B% R% m. e; A
  128. }
复制代码

# B' G8 t/ k: f0 D5 n  主功能:: C3 a; i) p/ {4 C( \# ^0 N7 ~6 j

* {: _( k$ z6 d, P0 f) O主程序实现如下操作:9 o' S: y: F/ s8 x6 b

- ~+ ]7 w# w, z7 _+ h  启动自动重装软件定时器0,每100ms翻转一次LED2。
/ D4 Z( F& l; M$ ?  K1键按下,从DTCM依次申请280字节,64字节和6111字节。! N4 [6 `$ }" h9 O: o
  K1键松开,释放从DTCM申请的空间。
! a. o4 P$ ~. R9 \7 _$ t  K2键按下,从AXI SRAM依次申请160字节,32字节和2333字节。
# w7 w; s& D8 _' ]  K2键松开,释放从AXI SRAM申请的空间。
- d4 @7 i8 H' G$ [  C  K3键按下,从D2域SRAM依次申请200字节,96字节和4111字节。
5 G1 W  W% Z% Q" R0 B  K3键松开,释放从D2域SRAM申请的空间。- R, z) ~4 W9 T/ w2 U6 K' O6 x
  摇杆OK键按下,从D3域SRAM依次申请300字节,128字节和5111字节。
: B6 S: {7 {# c+ a9 p8 n' V3 ]6 t  摇杆OK键松开,释放从D3域SRAM申请的空间。8 r8 Z4 D4 C8 _4 @2 f9 ]( f
  1. /*
    / F! I* ^5 |- |3 ^+ y
  2. *********************************************************************************************************
    ( {% \7 h4 e7 ?- d7 D, Y/ s
  3. *        函 数 名: main7 G$ G. P4 t, O$ l1 b6 p# E' W
  4. *        功能说明: c程序入口3 b- @. H# O1 |2 g$ U  F% c
  5. *        形    参: 无& @' Y7 i7 w6 j3 }6 v) ?+ `
  6. *        返 回 值: 错误代码(无需处理)& ?; N' R, {7 C: m8 l* b
  7. *********************************************************************************************************
    4 s6 I  @- w7 f) ^
  8. */4 C5 Y8 v5 r7 P3 a+ [
  9. int main(void): f( T$ J' ~/ Y* a  L
  10. {
    6 M- ^  `5 u" ?. i1 n
  11.         uint8_t ucKeyCode;                /* 按键代码 */
    7 B- B$ D7 o3 a& }7 P* s4 F
  12.         uint32_t *DTCM_Addres0, *AXISRAM_Addres0, *SRAM1_Addres0, *SRAM4_Addres0;  y0 I* M6 ]1 j# ?2 o3 ^# l3 O# Z3 _
  13.         uint16_t *DTCM_Addres1, *AXISRAM_Addres1, *SRAM1_Addres1, *SRAM4_Addres1;$ }5 N' K% c9 ~7 w9 R- p0 _! k2 y
  14.         uint8_t  *DTCM_Addres2, *AXISRAM_Addres2, *SRAM1_Addres2, *SRAM4_Addres2;: z* n- ?+ }/ k- e- e
  15. ' _7 Z- n8 h# d6 Z) |
  16. 4 \  w0 w: [  m9 W/ U
  17.         bsp_Init();                /* 硬件初始化 */
    1 M1 l# d; P/ P1 a8 n8 M' R
  18.         
    ' y. B3 S2 \1 s* e# e5 n
  19.         /* 初始化动态内存空间 */, y8 a- k, @' c! H2 e
  20.         osRtxMemoryInit(AppMallocDTCM,    sizeof(AppMallocDTCM));2 O0 ~/ v2 X- J  j
  21.         osRtxMemoryInit(AppMallocAXISRAM, sizeof(AppMallocAXISRAM));
    - }2 h8 V+ G8 o) a
  22.         osRtxMemoryInit(AppMallocSRAM1,   sizeof(AppMallocSRAM1));
    4 A( U, I0 a2 Z& C& A$ x* a" v5 w/ x- T
  23.         osRtxMemoryInit(AppMallocSRAM4,   sizeof(AppMallocSRAM4));1 \: J( H  @, i9 t
  24.         9 M9 J; \6 R8 p  w9 @* U
  25.         PrintfLogo();        /* 打印例程名称和版本等信息 */) w+ x9 y: O! b3 K4 Q3 \  u" X4 A+ I
  26.         PrintfHelp();        /* 打印操作提示 */; t: r/ F: t8 A+ U! \# y

  27. 6 F! w( q" t6 A; ]1 x
  28.         bsp_StartAutoTimer(0, 100);        /* 启动1个100ms的自动重装的定时器 */
    / N" M3 \* b/ O! ^, A$ W
  29.         
    ! Z% I3 H7 R6 [2 H+ w# q
  30. , C" ?  r$ M% B% d6 l
  31.         /* 进入主程序循环体 */
    . ]! c$ k3 _9 L
  32.         while (1)
    & ~0 S5 c8 D3 ^+ p2 y- k1 X
  33.         {' N1 }5 u8 a5 n# j
  34.                 bsp_Idle();                /* 这个函数在bsp.c文件。用户可以修改这个函数实现CPU休眠和喂狗 */( x6 X- C5 Y& m4 |' l8 O$ a  q: O* y* `
  35.   I% z* x& n9 ~7 C# b! A
  36.                 /* 判断定时器超时时间 */- {" s' i% i# \3 o- K: a
  37.                 if (bsp_CheckTimer(0))        
    ) X$ N( a# _* y0 `5 A
  38.                 {1 B( D( n% K6 b( A3 I/ X
  39.                         /* 每隔100ms 进来一次 */  " F; y6 ~4 D0 \& ?6 u# X
  40.                         bsp_LedToggle(2);
    . W4 C/ a0 D8 J4 }
  41.                 }0 U5 n5 V* u( m) p# m  B
  42. ( M, z, e+ j& M; d
  43.                 /* 按键滤波和检测由后台systick中断服务程序实现,我们只需要调用bsp_GetKey读取键值即可。 */1 T9 r. ^% O" f) t5 j
  44.                 ucKeyCode = bsp_GetKey();        /* 读取键值, 无键按下时返回 KEY_NONE = 0 */1 U2 |$ R7 Z/ ~: E( Y7 W7 E
  45.                 if (ucKeyCode != KEY_NONE)
    . I7 d! B/ h2 z. R, l
  46.                 {8 T& i9 I/ Q% N, h0 l6 ~. k
  47.                         switch (ucKeyCode)) a' a- y* J! h4 g: d, B( Q
  48.                         {; E& h2 ]4 a2 L2 }5 E6 }
  49.                 /* 从DTCM依次申请280字节,64字节和6111字节 */
    3 a* k/ H1 u+ D# l) C
  50.                                 case KEY_DOWN_K1:        $ U- ]" B/ D& @8 l. I% p
  51.                     /* 从DTCM申请280字节空间,使用指针变量DTCM_Addres0操作这些空间时不要超过280字节大小 */
    ' t* }: A+ d. X
  52.                                         printf("=========================================================\r\n");
    / e! ?* Q; j) s) w! H8 ?4 j8 z1 `; F
  53.                                         DTCM_Addres0 = osRtxMemoryAlloc(AppMallocDTCM, 280, 0);
    7 F$ `' }5 w6 H# V0 q' ~  `
  54.                                         DTCMUsed = MemHeadPtr(AppMallocDTCM);
    9 g: D1 N. X! i
  55.                                         printf("DTCM总大小 = %d字节,申请大小 = 0280字节,当前共使用大小 = %d字节\r\n",
      \4 |2 o( I2 U0 G) @/ T. G9 a  ?
  56.                                                                                 DTCMUsed->size, DTCMUsed->used);3 f' K3 \7 }0 _  q
  57.                                 $ x7 ^; M8 q' x) T7 C6 T5 Q5 P
  58.                         /* 从DTCM申请64字节空间,使用指针变量DTCM_Addres1操作这些空间时不要超过64字节大小 */        
    1 d4 A0 Z! R$ {
  59.                                         DTCM_Addres1 = osRtxMemoryAlloc(AppMallocDTCM, 64, 0);
    % U4 d1 x4 _- F1 I% y
  60.                                         DTCMUsed = MemHeadPtr(AppMallocDTCM);
    2 o# {. ^- W. h3 {: X
  61.                                         printf("DTCM总大小 = %d字节,申请大小 = 0064字节,当前共使用大小 = %d字节\r\n", 2 n) a( l; U0 e1 ?
  62.                                                                                                            DTCMUsed->size, DTCMUsed->used);$ n& O$ e. w7 Q) E! L1 ]
  63.                                 1 u) n* R, k- h  E& Q6 W
  64.                     /* 从DTCM申请6111字节空间,使用指针变量DTCM_Addres2操作这些空间时不要超过6111字节大小 */3 H7 O" j9 D/ r  G6 W/ f3 [
  65.                                         DTCM_Addres2 = osRtxMemoryAlloc(AppMallocDTCM, 6111, 0);
    & d1 D( l  W) m! f7 w; C. S, n0 u) \
  66.                                         DTCMUsed = MemHeadPtr(AppMallocDTCM);
      [" }6 b- w0 ^; I& t5 m8 L, n, c0 w
  67.                                         printf("DTCM总大小 = %d字节,申请大小 = 6111字节,当前共使用大小 = %d字节\r\n", ) r! ~$ i( q9 d& T- Q
  68.                                                                                 DTCMUsed->size, DTCMUsed->used);8 ~: ^! }$ S. ]$ O+ \! d
  69.                                         break;
    + B6 U5 `3 E- o. @+ A8 K
  70.                                 
    / y" l& b  I; {9 ~7 H# H/ h
  71.                                 /* 释放从DTCM申请的空间 */
    . C/ X% l: z! f) }
  72.                                 case KEY_UP_K1:        
    - b* L3 }0 d3 ~2 G# T0 i7 G
  73.                                         /* 释放从DTCM申请的280字节空间 */
    ( M3 ~) s2 _/ F1 u! a6 B6 M, a
  74.                                         osRtxMemoryFree(AppMallocDTCM, DTCM_Addres0);, x/ F' V4 v+ ^' l
  75.                                         DTCMUsed = MemHeadPtr(AppMallocDTCM);8 P' @! Q0 x. w. \! J" N
  76.                                         printf("释放DTCM动态内存区申请的0280字节,当前共使用大小 = %d字节\r\n",
    2 `& a/ I" D+ i* ?: n
  77. DTCMUsed->used);
    2 q& s$ Y% y" G' a( W- @3 f! `
  78.                                 7 s+ }: m! Z: v5 t  e. F6 }' R
  79.                                         /* 释放从DTCM申请的64字节空间 */$ I' i/ I4 Q! m+ v1 }! q# ^" ~/ s7 b
  80.                                         osRtxMemoryFree(AppMallocDTCM, DTCM_Addres1);/ {( L( H2 `+ b% a4 k! x- u+ p
  81.                                         DTCMUsed = MemHeadPtr(AppMallocDTCM);# E$ t6 h1 \* Z# V: m/ A5 n8 `1 l
  82.                                         printf("释放DTCM动态内存区申请的0064字节,当前共使用大小 = %d字节\r\n",3 ~# W. Z6 L; ?; [* \! T( C) P
  83. DTCMUsed->used);
    , h' J4 n# b5 U! d# [
  84.                                 
    0 |% \9 V5 d9 p$ k) q7 z
  85.                                         /* 释放从DTCM申请的6111字节空间 */
    ; i9 V% u5 l" a
  86.                                         osRtxMemoryFree(AppMallocDTCM, DTCM_Addres2);+ U! _' X# B% |* I$ h
  87.                                         DTCMUsed = MemHeadPtr(AppMallocDTCM);% v* o. K7 d0 y
  88.                                         printf("释放DTCM动态内存区申请的6111字节,当前共使用大小 = %d字节\r\n",
    0 w* t9 n' c# w! J, T
  89. DTCMUsed->used);
    " o  k$ @2 V: ^  D! l+ C
  90.                                         break;8 ]1 [) t- t7 Y& t4 E% L  o
  91.                                 . E1 r0 ^# m. J1 ?/ S
  92.                                 /* 从AXI SRAM依次申请160字节,32字节和2333字节 */
    4 B; Y+ \' u+ ]& {( p, N% G" ^* W% L4 k
  93.                                 case KEY_DOWN_K2:        
    * |0 h5 Y9 @1 t' v# U! D$ i+ B
  94.             /* 从AXI SRAM 申请160字节空间,使用指针变量AXISRAM_Addres0操作这些空间时不要超过160字节大小 */, h2 ~3 Y0 ]2 [( u% i/ Z( s% g9 B
  95.                                         printf("=========================================================\r\n");               
    + [% N2 u) c; W/ z" Q* m
  96.                                         AXISRAM_Addres0 = osRtxMemoryAlloc(AppMallocAXISRAM, 160, 0);) X7 M9 p9 S4 i' l$ i& i" a
  97.                                         AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);
    ) E5 A5 {% L2 `  m# Q  z; }
  98.                                         printf("AXI SRAM总大小 = %d字节,申请大小 = 0162字节,当前共使用大小 = %d字节\r\n",
    + r# V6 L; {$ @$ R
  99.                                                                                 AXISRAMUsed->size, AXISRAMUsed->used);
    , d  C: Y- c' P- ^
  100.                                 
    " d; Z1 y. r$ d# I
  101.                         /* 从AXI SRAM 申请32字节空间,使用指针变量AXISRAM_Addres1操作这些空间时不要超过32字节大小 */
      w1 |/ T! Q/ e) u/ v# t( E8 w
  102.                                         AXISRAM_Addres1 = osRtxMemoryAlloc(AppMallocAXISRAM, 32, 0);
    6 E, h! Z; B' v  L/ ]
  103.                                         AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);
    & V5 N4 n1 m4 Q+ S; \
  104.                                         printf("AXI SRAM总大小 = %d字节,申请大小 = 0032字节,当前共使用大小 = %d字节\r\n", - T# P# o5 f( l( m+ e
  105.                                                                                                       AXISRAMUsed->size, AXISRAMUsed->used);$ I+ f  j) w8 O' D2 B, c& [3 \! W
  106.                                 + R% k9 [& i; R/ Q
  107. /* 从AXI SRAM 申请2333字节空间,使用指针变量AXISRAM_Addres2操作这些空间时不要超过2333字节大小 */          T( Z+ @# V& s% s+ m6 e
  108.                                         AXISRAM_Addres2 = osRtxMemoryAlloc(AppMallocAXISRAM, 2333, 0);
    * `. E, N. E! Z$ i
  109.                                         AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);: v! \- ^2 g& n2 e
  110.                                         printf("AXI SRAM总大小 = %d字节,申请大小 = 2333字节,当前共使用大小 = %d字节\r\n",
    + L6 q3 d$ L- m0 s
  111.                                                                                 AXISRAMUsed->size, AXISRAMUsed->used);1 q& T* p3 N% P# Y( n7 h) _( D" ?
  112.                                         break;
    & q2 @! j% z% i( C2 ~& \
  113.                                 ( k( j+ g/ j" O$ k; l* n( {3 R
  114.                                 /* 释放从AXI SRAM申请的空间 */2 c$ v& k3 W+ V0 K# h
  115.                                 case KEY_UP_K2:        5 O& k9 T& @5 V$ I% L9 C* E6 O
  116.                                         /* 释放从AXI SRAM申请的160字节空间 */3 J% q, X; {) q& u, R
  117.                                         osRtxMemoryFree(AppMallocAXISRAM, AXISRAM_Addres0);
    3 S! H  t9 b) g- C
  118.                                         AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);
    ' z% J5 Q0 L# m3 B6 S, Z
  119.                                         printf("释放AXI SRAM动态内存区申请的0160字节,当前共使用大小 = %d字节\r\n",0 H. r" n4 c, P, b# o
  120. AXISRAMUsed->used);1 ~; t8 ?; M) l. U. ~" j" ^6 M
  121.                                   l8 ~3 k5 t6 p
  122.                                         /* 释放从AXI SRAM申请的32字节空间 *// k# \, s* J$ U$ e% |8 d: D' \4 X3 M
  123.                                         osRtxMemoryFree(AppMallocAXISRAM, AXISRAM_Addres1);, C7 r0 Z3 B0 U5 p" [/ s* d
  124.                                         AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);0 O9 W+ u* g$ i* o3 X  x. O
  125.                                         printf("释放AXI SRAM动态内存区申请的0032字节,当前共使用大小 = %d字节\r\n",. _% y( l7 Q9 s% _4 U
  126. AXISRAMUsed->used);" A  i+ X+ b$ c. l) I
  127.                                 ( m( a- l3 [' D
  128.                                         /* 释放从AXI SRAM申请的2333字节空间 */
    + j: @$ [7 i, w* [5 ^
  129.                                         osRtxMemoryFree(AppMallocAXISRAM, AXISRAM_Addres2);  c2 e8 z0 s. B1 b4 k8 A  q
  130.                                         AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);+ l" f3 j( Z& q9 W0 l+ w" O+ _6 S
  131.                                         printf("释放AXI SRAM动态内存区申请的2333字节,当前共使用大小 = %d字节\r\n", . R3 q( X  ?: h3 ~: k) u& _0 a! H7 d- s
  132. AXISRAMUsed->used);5 b5 t. X8 ^$ ?1 {3 _% h6 t
  133.                                         break;
    + _' d0 @' i& Y3 O& u# G5 v; ^
  134.                                 
    7 z: O' ~) Y$ {$ y: ?
  135.                                 /* 从D2域SRAM依次申请200字节,96字节和4111字节 */+ w  p; ?1 n% R# t5 e3 l
  136.                                 case KEY_DOWN_K3:        
    " h# w; S2 o" r" I& s2 G: _
  137.         /* 从D2域的SRAM申请200字节空间,使用指针变量SRAM1_Addres0操作这些空间时不要超过200字节大小 */
    - X/ M/ P2 O- K3 ?7 k  x) l" u4 D
  138.                                         printf("=========================================================\r\n");                8 L$ i7 k9 ~) n7 Y/ |6 I$ W
  139.                                         SRAM1_Addres0 = osRtxMemoryAlloc(AppMallocSRAM1, 200, 0);
    : y. J) G. @2 y9 ?- N
  140.                                         SRAM1Used = MemHeadPtr(AppMallocSRAM1);
    / d8 W0 d* e; o" J! K3 |
  141.                                         printf("D2域SRAM总大小 = %d字节,申请大小 = 0200字节,当前共使用大小 = %d字节\r\n",
    0 Z, U8 B) B$ M6 {* n0 e( d
  142.                                                                                 SRAM1Used->size, SRAM1Used->used);
    ! D0 q4 ]  d* @( O
  143.                                 7 f+ x2 J% l; ?0 R
  144.          /* 从D2域的SRAM申请96字节空间,使用指针变量SRAM1_Addres1操作这些空间时不要超过96字节大小 */        
    # `' H- H3 N8 a9 h7 ]1 Q
  145.                                         SRAM1_Addres1 = osRtxMemoryAlloc(AppMallocSRAM1, 96, 0);" n& e0 v7 q6 ~, M6 v$ }, l
  146.                                         SRAM1Used = MemHeadPtr(AppMallocSRAM1);
    6 v9 o* s( A! f% X& V
  147.                                         printf("D2域SRAM总大小 = %d字节,申请大小 = 0096字节,当前共使用大小 = %d字节\r\n",
    ; h7 b+ `; l! L" ~$ `+ J2 y% `7 F- f6 S
  148.                                                                                                            SRAM1Used->size, SRAM1Used->used);
    ! O' h% Y, x+ F4 ^
  149.                                 
    9 b0 J6 \2 x, E
  150.          /* 从D2域的SRAM申请4111字节空间,使用指针变量SRAM1_Addres2操作这些空间时不要超过4111字节大小 */
      o# ]) }* I+ s- Y/ M' }: J6 y
  151.                                         SRAM1_Addres2 = osRtxMemoryAlloc(AppMallocSRAM1, 4111, 0);
    ' T3 q4 l! J; ^
  152.                                         SRAM1Used = MemHeadPtr(AppMallocSRAM1);( @% G2 y7 g: ^! o, n1 C2 g
  153.                                         printf("D2域SRAM总大小 = %d字节,申请大小 = 4111字节,当前共使用大小 = %d字节\r\n",
    4 \* w3 C7 Z9 S; z+ H4 I% z
  154.                                                                                 SRAM1Used->size, SRAM1Used->used);3 N/ \$ y& N  p1 v! `5 O* P6 B
  155.                                         break;; z5 B; `3 E( Z/ ~+ v: P
  156.                                 
    & x( C* E& w* I. Y
  157.                                 /* 释放从D2域SRAM申请的空间 */6 g- q" X: `4 Q! m3 h
  158.                                 case KEY_UP_K3:        
    7 f7 g6 `% q! f$ v7 v, O
  159.                                         /* 释放从D2域的SRAM申请的200字节空间 */
    " Z5 T" _4 E, L4 N
  160.                                         osRtxMemoryFree(AppMallocSRAM1, SRAM1_Addres0);4 L2 M0 W8 n" l9 B
  161.                                         SRAM1Used = MemHeadPtr(AppMallocSRAM1);
    6 X" g0 s3 t" W( `
  162.                                         printf("释放D2域SRAM动态内存区申请的0200字节,当前共使用大小 = %d字节\r\n",1 F, u; ^5 h9 E4 B( p, l
  163. SRAM1Used->used);! m" h# f5 _1 K* {; S, Z: R: i
  164.                                 
    $ }7 l; p# d% S) c% j
  165.                                         /* 释放从D2域的SRAM申请的96字节空间 */
    0 L  i6 l( v6 j5 _! r  `- i9 ], p
  166.                                         osRtxMemoryFree(AppMallocSRAM1, SRAM1_Addres1);
    ; ]2 C) G) J: O$ ?
  167.                                         SRAM1Used = MemHeadPtr(AppMallocSRAM1);
    ' N. i/ W8 G0 ^% v3 G9 ^# \7 G% L
  168.                                         printf("释放D2域SRAM动态内存区申请的0096字节,当前共使用大小 = %d字节\r\n",
    4 I$ C& n3 h7 [' O
  169. SRAM1Used->used);
    $ ?; I1 a% c( Q- O$ E$ L( n
  170.                                 : Q, b% k7 E9 O9 l+ \9 A2 f
  171.                                         /* 释放从D2域的SRAM申请的4111字节空间 */; S! D% k) q2 a% V
  172.                                         osRtxMemoryFree(AppMallocSRAM1, SRAM1_Addres2);8 t* Q2 y0 e( y0 ~* C; q4 d6 k& Q% g
  173.                                         SRAM1Used = MemHeadPtr(AppMallocSRAM1);
    " l; y) \$ E+ v) `2 G- l
  174.                                         printf("释放D2域SRAM动态内存区申请的4111字节,当前共使用大小 = %d字节\r\n",
    % l1 C/ \- ]5 I* H6 ^; B5 ^: B
  175. SRAM1Used->used);! K* ?# _0 w1 [  q) t$ X4 n
  176.                                         break;& B" y4 A! w( P  w
  177.                                 
    : D5 x$ ]5 B( I/ m( B5 }
  178.                                 /* 从D3域SRAM依次申请300字节,128字节和5111字节 */
    " L; f4 J( l5 C* R# c8 S6 C( A5 c
  179.                                 case JOY_DOWN_OK:        
    6 [( {3 S. r% H* b( ~1 ?2 E* [
  180.             /* 从D3域的SRAM申请300字节空间,使用指针变量SRAM4_Addres0操作这些空间时不要超过300字节大小 */
    4 f% G7 s! ]1 k3 R
  181.                                         printf("=========================================================\r\n");               
    ) a* L: s2 C1 D5 {8 V3 Q9 y
  182.                                         SRAM4_Addres0 = osRtxMemoryAlloc(AppMallocSRAM4, 300, 0);. v" M! [  R. ]% ^4 H/ B
  183.                                         SRAM4Used = MemHeadPtr(AppMallocSRAM4);2 O9 a. n4 o5 O; Y2 C8 Q
  184.                                         printf("D3域SRAM总大小 = %d字节,申请大小 = 0300字节,当前共使用大小 = %d字节\r\n",
    ! z& N$ K5 M% U2 R
  185.                                                                                 SRAM4Used->size, SRAM4Used->used);
    " d0 w+ ^: p8 ?- q. X
  186.                                 ( f7 k3 l( _2 \$ [+ p) V
  187.                 /* 从D3域的SRAM申请96字节空间,使用指针变量SRAM4_Addres1操作这些空间时不要超过96字节大小 */0 h4 b" M9 V; j7 a- l# i/ \
  188.                                         SRAM4_Addres1 = osRtxMemoryAlloc(AppMallocSRAM4, 128, 0);
    . h5 T6 v/ R. l8 B1 R- x9 `
  189.                                         SRAM4Used = MemHeadPtr(AppMallocSRAM4);
    / ]9 y3 D$ z3 U
  190.                                         printf("D3域SRAM总大小 = %d字节,申请大小 = 0128字节,当前共使用大小 = %d字节\r\n", # B+ Q% \' f. P9 D) F
  191.                                                                                                            SRAM4Used->size, SRAM4Used->used);
    & r3 Z' M$ t( x/ M& Q2 M0 Z& d$ Z8 q
  192.                                 
    , Y& ~9 U/ r! t, ~/ s. _) z% }
  193.         /* 从D3域的SRAM申请5111字节空间,使用指针变量SRAM4_Addres2操作这些空间时不要超过5111字节大小 */
    + z4 f* S5 H7 z7 @/ r
  194.                                         SRAM4_Addres2 = osRtxMemoryAlloc(AppMallocSRAM4, 5111, 0);+ P7 }. Z7 a+ q- |) F
  195.                                         SRAM4Used = MemHeadPtr(AppMallocSRAM4);+ N9 v% l3 b6 p2 L! x" G
  196.                                         printf("D3域SRAM总大小 = %d字节,申请大小 = 5111字节,当前共使用大小 = %d字节\r\n",
    3 a, W; L$ ?- H! f% s
  197.                                                                                 SRAM4Used->size, SRAM4Used->used);
    7 S3 @% N  B9 M. |2 A( G
  198.                                         break;
    $ W5 L' d! w% \9 F7 e! l5 j
  199.                                 
    7 \# w2 x/ S. m; L3 _
  200.                                 /* 释放从D3域SRAM申请的空间 */! H" |& a1 F3 t$ k
  201.                                 case JOY_UP_OK:        
    - o$ E( E* \$ n4 n; H$ |0 n2 N
  202.                                         /* 释放从D3域的SRAM申请的300字节空间 */% A+ Z8 K6 [- ^. l' K
  203.                                         osRtxMemoryFree(AppMallocSRAM4, SRAM4_Addres0);: W/ E3 W9 g, U' X* x
  204.                                         SRAM4Used = MemHeadPtr(AppMallocSRAM4);
    - O& M# ~+ Q% w/ G3 Z# K: [
  205.                                         printf("释放D3域SRAM动态内存区申请的0300字节,当前共使用大小 = %d字节\r\n", 4 F# {1 J$ k8 D4 [( _. {
  206. SRAM4Used->used);4 L: C& _* Q6 p/ F5 P1 d
  207.                                 
    ' }& g0 N" r8 ]1 j0 V
  208.                                         /* 释放从D3域的SRAM申请的128字节空间 */
    1 R0 q! S& G/ e1 K5 [& {
  209.                                         osRtxMemoryFree(AppMallocSRAM4, SRAM4_Addres1);
    " a( X& l! q: |/ j2 p- Y
  210.                                         SRAM4Used = MemHeadPtr(AppMallocSRAM4);
    6 }2 o) V# S3 S- t1 u, n7 |
  211.                                         printf("释放D3域SRAM动态内存区申请的0128字节,当前共使用大小 = %d字节\r\n",4 r+ J; [, s0 k# ^2 i
  212. SRAM4Used->used);
    / j( X2 d" M1 i( ~8 }8 B
  213.                                 
    ) _; n3 U* }  D( D+ J% m
  214.                                         /* 释放从D3域的SRAM申请的5111字节空间 */9 _* u1 o9 N1 Z/ g
  215.                                         osRtxMemoryFree(AppMallocSRAM4, SRAM4_Addres2);
    ) J/ C0 R" q1 w) G; t5 j
  216.                                         SRAM4Used = MemHeadPtr(AppMallocSRAM4);! O. m4 t# Y1 ?- L, v3 q, }4 J. H
  217.                                         printf("释放D3域SRAM动态内存区申请的5111字节,当前共使用大小 = %d字节\r\n",  h/ E: J/ `1 Y" j3 g% D
  218. SRAM4Used->used);
    $ a+ w6 `5 S5 F# [1 G. Y
  219.                                         break;
    6 \/ f$ b, }% K" I' L, Z
  220.                         
    4 q- I. C. ~5 I+ l& k  x/ D
  221.                                 default:
    ( v3 Q7 t7 B% f/ Y; R4 J. K
  222.                                   /* 其它的键值不处理 */6 G7 c) |4 i! [/ g. t
  223.                                   break;  N5 }% N$ }0 u- [- L
  224.                         }) ~  e4 u/ G$ Z$ ^+ x) w; p
  225.                 }- d0 q$ i3 c3 s( z4 S( ^
  226.         }* G6 d. l2 y% m, M( C
  227. }
复制代码
6 D2 O9 ]- V. m) ]! U
27.5 实验例程说明(IAR)! {8 q% z. Q7 v2 U. ~6 ~8 o
配套例子:
! x# [& t; L' x: @V7-006_TCM,SRAM等五块内存的动态内存分配实现: h* s+ X1 x. c

3 Z4 K0 O- P- r2 L- C' Z7 _$ r实验目的:2 r7 f- E  s7 ^: V
学习TCM,SRAM等五块内存的动态内存分配实现。# c: @3 R8 ]- K% v
4 c. w' K* b3 Y5 W5 i7 ?( o9 q4 s
- S2 {7 H) Y3 j4 n+ A/ c7 n# j" `
实验内容:
3 D, F' H9 L% K" X2 @( |启动自动重装软件定时器0,每100ms翻转一次LED2。
+ W' b* j, o+ i4 J( \  t/ C  W
/ H, h( b- R* V% q1 x实验操作:. |0 A, T; O6 J8 F% s$ p2 b, s& o2 s1 y  ~
K1键按下,从DTCM依次申请280字节,64字节和6111字节。6 P' l- t" L# d' a8 A
K1键松开,释放从DTCM申请的空间。
2 W2 m9 f  }  O& s5 hK2键按下,从AXI SRAM依次申请160字节,32字节和2333字节。0 f* l" N" @+ c3 a5 n2 h9 K- p
K2键松开,释放从AXI SRAM申请的空间。/ T2 H: r  \: u- E5 {$ a3 V
K3键按下,从D2域SRAM依次申请200字节,96字节和4111字节。
& a# u, m: k% ]) Q5 ZK3键松开,释放从D2域SRAM申请的空间。3 k9 y0 l  ?& U6 l
摇杆OK键按下,从D3域SRAM依次申请300字节,128字节和5111字节。
# [1 E- |' T1 E2 ^8 t/ E摇杆OK键松开,释放从D3域SRAM申请的空间。
% C5 f. S( E  {' O! w0 ?- A- s' h* c) g# q
上电后串口打印的信息:" J" U2 V) ?5 Z5 v# N
, `& p- d* u9 s2 v6 Y% T
波特率 115200,数据位 8,奇偶校验位无,停止位 13 i% V! Q: Q! I
6 P9 |8 v  ^9 @/ H
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDcvMTM3OTEwNy0yMDE5.png
- r" `* H5 k4 \) C( h0 s0 R3 ~
: l; M3 ~/ [" _- q, E* w8 n
程序设计:
5 ~1 O/ d) B9 v6 _" b0 M
: u' K. ?6 b6 U* E( w( I2 h4 t  系统栈大小分配:7 F2 W- Q7 q1 ]1 F5 K: h

2 Z9 t' I' X# ]& ^' [
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDcvMTM3OTEwNy0yMDE5.png
! S6 Y: `8 u4 t  D+ S6 Y4 @) t/ }

% R- [; H6 Q) S% I  RAM空间用的DTCM:) T" j. l* @% u8 U. \2 o& R

* L0 ?& @1 M! y5 I% I" k
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDcvMTM3OTEwNy0yMDE5.png
, [. Q9 Y# M( a, O, ^
0 _/ s# b+ z7 d- W: ^
  硬件外设初始化

$ v4 J9 s% a8 o* [1 A0 }/ Z
* L! h3 ?3 k* l9 z2 C硬件外设的初始化是在 bsp.c 文件实现:  }, Q+ t( l0 F* d! s( s
7 R& o8 }' c4 g, [
  1. /*
    " c6 ~2 d4 A8 U( \1 C
  2. *********************************************************************************************************, ^* r# S) e: d9 }1 w4 L7 b
  3. *        函 数 名: bsp_Init
    5 w; R) [9 r# [8 F4 C
  4. *        功能说明: 初始化所有的硬件设备。该函数配置CPU寄存器和外设的寄存器并初始化一些全局变量。只需要调用一次6 [, D! p4 e# o1 B1 ?: N( D% I5 K
  5. *        形    参:无; C( j/ N$ H7 a& D8 _/ f0 U! r
  6. *        返 回 值: 无0 b7 o5 H3 u  @( J8 E: B" w
  7. *********************************************************************************************************
    9 H( w$ P- S5 A, N/ z! I
  8. */, {# J. b. ^; W6 E
  9. void bsp_Init(void)
    % K( _5 p4 O/ B) F6 `
  10. {
    , M6 ^5 f: w1 m+ f; g2 z6 S
  11.     /* 配置MPU */
    . d: y# W" x$ c4 r3 s" A  |; i
  12.         MPU_Config();
    & Z9 z& L( i7 H2 a
  13.         
    ' k/ ]' X2 N% u2 T4 S0 O) E) U
  14.         /* 使能L1 Cache *// e+ I1 g: O; ~3 ]7 \8 I
  15.         CPU_CACHE_Enable();
    ; i% W: D0 ]+ ?8 V8 l; A
  16. ( F$ S) V$ f  q7 X
  17.         /*
    ) R$ k2 v3 u( Z- l/ u0 W
  18.        STM32H7xx HAL 库初始化,此时系统用的还是H7自带的64MHz,HSI时钟:
    4 }* ]8 i: m5 p, @8 m
  19.            - 调用函数HAL_InitTick,初始化滴答时钟中断1ms。
    6 j5 T/ h1 z8 i! I# _' E
  20.            - 设置NVIV优先级分组为4。+ F9 c1 |1 P" n" {4 _
  21.          */% c1 X" b$ K" `) }3 G1 |
  22.         HAL_Init();  H4 k1 v& y2 S3 c# \5 Y
  23. ; z9 r1 u& H: j
  24.         /* , w6 Z8 E2 U2 a( i
  25.        配置系统时钟到400MHz
    , }  x0 @6 s9 o& V' m* w4 L
  26.        - 切换使用HSE。
    9 h* U( Q2 |3 r' ~$ i
  27.        - 此函数会更新全局变量SystemCoreClock,并重新配置HAL_InitTick。
    ( C" h, @6 w: B9 X# U/ W, c
  28.     */
    ( w% ]4 B" O0 k+ k# J8 o6 c1 G
  29.         SystemClock_Config();7 n/ x: m( d1 T+ o
  30. 5 E2 h, c4 G- g3 A
  31.         /*
    5 x' r: v/ H( c) M- L
  32.            Event Recorder:. B2 `  I. |) g8 H9 D* y) U6 w
  33.            - 可用于代码执行时间测量,MDK5.25及其以上版本才支持,IAR不支持。
    0 T  {/ Z0 }& w" X5 }7 N
  34.            - 默认不开启,如果要使能此选项,务必看V7开发板用户手册第xx章
    / ?4 l3 R2 k, r; Y' R0 L/ i
  35.         */        
    ; P  M5 Q, y6 k
  36. #if Enable_EventRecorder == 1  ' J0 _) u, n3 `) Y
  37.         /* 初始化EventRecorder并开启 */, E8 q# Q# f9 t, L% o
  38.         EventRecorderInitialize(EventRecordAll, 1U);3 x9 v! Q6 |3 k
  39.         EventRecorderStart();
    9 k/ G$ F7 j) f  Y7 k5 G' i/ E
  40. #endif* c5 l' d2 q  {; [8 f  t8 S7 s
  41.         
    7 F' U! i4 _7 E& F0 s" l, W2 z" k
  42.         bsp_InitKey();            /* 按键初始化,要放在滴答定时器之前,因为按钮检测是通过滴答定时器扫描 */
    / `. y3 b5 R% L& o- o+ h+ Q, u9 G$ r
  43.         bsp_InitTimer();          /* 初始化滴答定时器 */* q8 @- d4 c1 q$ G9 ^) P4 w4 A
  44.         bsp_InitUart();        /* 初始化串口 */
    + s& U2 r% h$ u/ s; ]
  45.         bsp_InitExtIO();        /* 初始化FMC总线74HC574扩展IO. 必须在 bsp_InitLed()前执行 */        
    4 E2 g2 @: i# h* o# r. `' T
  46.         bsp_InitLed();            /* 初始化LED */        : K' S2 j$ S- d3 }  n% e* t: n, s
  47. }
复制代码

( V1 |! R1 C' C/ Q4 R8 P- @  MPU配置和Cache配置:

- L- O' d$ I4 k  o$ ?+ j) i) _6 S2 c
! y( r2 L9 c" q- G: d. u数据Cache和指令Cache都开启。
0 u) n& y. y4 j2 v3 i; K: Z6 ]/ ?$ z6 y0 [
AXI SRAM的MPU属性:7 }( `+ ]% b5 ]

  ?3 E) j& z% t! V! e  t4 JWrite back, Read allocate,Write allocate。. g; Y- F9 W! j; G
2 p8 Z  K& I# J7 k3 d) d2 U& k' b
FMC的扩展IO的MPU属性:
5 I! E- p0 b/ Q$ m4 w. K; m% V2 V2 L
! W6 |8 o! v: [6 m. F. N. `必须Device或者Strongly Ordered。
8 z7 O: V- ]0 P2 Z! m, |- [/ P1 u7 k1 f' H
D2 SRAM1,SRAM2和SRAM3的MPU属性:
+ z  f6 _: s0 h4 {# c1 A
, g: A+ [$ C' X* J/ J' {Write through, read allocate,no write allocate。
8 @# t  M1 C: D1 Q. A
  f; f; w/ P8 H( Q4 {0 _D3 SRAM4的MPU属性:" N2 Q" o4 @6 @; H' b4 e$ D# S% n8 L
  |/ t& ^$ m: W* k. |" H; z* G
Write through, read allocate,no write allocate。
% |7 p* e  J% f8 h5 P/ p! s
9 i! d  {$ t* j9 ]% ~) [! @
  1. /*
    : y4 j; h3 x( |
  2. *********************************************************************************************************
    6 k5 v, j3 A0 G& T* H+ t0 ?4 G
  3. *        函 数 名: MPU_Config* k5 o8 k% C" m& [! `4 q
  4. *        功能说明: 配置MPU
      Y. p0 `. x' t- k4 _
  5. *        形    参: 无
    1 ~9 U8 ?: i5 \0 L# z7 ?
  6. *        返 回 值: 无. g4 ?- s- Y5 h7 S' T& M
  7. *********************************************************************************************************& {+ y+ ]! l  Q! L* g9 ?
  8. */
    ! a" a: I! M8 O% r8 S
  9. static void MPU_Config( void )% p5 a/ C8 x! W* \( A( ~
  10. {
    $ F4 _# s& g8 b
  11.         MPU_Region_InitTypeDef MPU_InitStruct;
    5 [' d  D' ^8 ^: x
  12. 3 X1 f5 Y4 y: U
  13.         /* 禁止 MPU */- \; I* p9 X4 k) F- ?$ z
  14.         HAL_MPU_Disable();
    ! b9 I) q# W7 c1 p" D* m
  15. ; `6 z. p: ?4 D- C; u
  16.         /* 配置AXI SRAM的MPU属性为Write back, Read allocate,Write allocate */
    1 ^. E1 s' c! [  H1 S
  17.         MPU_InitStruct.Enable           = MPU_REGION_ENABLE;
    7 N8 i& M# g, m* q# @% L- |
  18.         MPU_InitStruct.BaseAddress      = 0x24000000;
    + I. b! f$ I* E$ P! l4 `
  19.         MPU_InitStruct.Size             = MPU_REGION_SIZE_512KB;
    ) H( u( w; D! `  e: t( b
  20.         MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;& D7 L# q9 h* d6 ^6 ?) E
  21.         MPU_InitStruct.IsBufferable     = MPU_ACCESS_BUFFERABLE;% ]% T) g' D) P3 e9 H
  22.         MPU_InitStruct.IsCacheable      = MPU_ACCESS_CACHEABLE;
    + P: Y* f) W$ ^  n4 F  q
  23.         MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;6 l/ O! N7 ~" i+ T
  24.         MPU_InitStruct.Number           = MPU_REGION_NUMBER0;
    $ u$ U, [1 V+ z8 ~7 Q9 }* y
  25.         MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL1;  D/ p5 \1 s8 p( d9 }' \/ S
  26.         MPU_InitStruct.SubRegionDisable = 0x00;
    7 ?- h3 o8 L; b' t- ?
  27.         MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;7 c9 p2 j; S+ X; s" H' }; u& Y7 p2 x

  28. $ p7 C: F) \% v0 Q' u; k0 u
  29.         HAL_MPU_ConfigRegion(&MPU_InitStruct);9 i; [% L( \7 d5 R2 p
  30.         & F8 s' X# W. x, O# [$ y2 }
  31.         / E& }) l! ]# `9 Q& ^! c" p' K
  32.         /* 配置FMC扩展IO的MPU属性为Device或者Strongly Ordered */- a9 Q7 w: f: d! u" }
  33.         MPU_InitStruct.Enable           = MPU_REGION_ENABLE;
    * f! W6 x! k) B1 c; g1 v
  34.         MPU_InitStruct.BaseAddress      = 0x60000000;* Y' o8 T# }* B( L$ }1 d
  35.         MPU_InitStruct.Size             = ARM_MPU_REGION_SIZE_64KB;        
    4 a4 {2 @5 Q% }3 i8 `7 M
  36.         MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
    1 |) X' L4 K8 g# _. w
  37.         MPU_InitStruct.IsBufferable     = MPU_ACCESS_BUFFERABLE;+ [* z2 b) ?; a9 i$ A7 M' F5 L
  38.         MPU_InitStruct.IsCacheable      = MPU_ACCESS_NOT_CACHEABLE;
    , b7 \  B8 [" \* g5 x
  39.         MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;
    ( C& U8 O7 z, E* ~& V( M/ S
  40.         MPU_InitStruct.Number           = MPU_REGION_NUMBER1;' }2 ^1 s) R. V& X1 }: \
  41.         MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL0;# O1 m8 w6 @* j8 v
  42.         MPU_InitStruct.SubRegionDisable = 0x00;
    + X! ~% q. o7 F5 d" R7 p: H3 K; N
  43.         MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;
    9 H) A" }& V& ]( b
  44.         
    8 {/ B4 c& k& n2 R! u
  45.         HAL_MPU_ConfigRegion(&MPU_InitStruct);
    ; k0 M8 V6 I! Y2 h& ^0 F1 {- a
  46.         # v- t! G( f6 E/ o# ~
  47.         /* 配置SRAM1的属性为Write through, read allocate,no write allocate */
    7 d1 o' }' a6 L- j. x
  48.     MPU_InitStruct.Enable           = MPU_REGION_ENABLE;6 |1 l) ?, I) O8 R. I4 q& r1 ^
  49.     MPU_InitStruct.BaseAddress      = 0x30000000;# X% H% W  y- {9 y# @- `( D
  50.     MPU_InitStruct.Size             = ARM_MPU_REGION_SIZE_128KB;        
    - w  n+ U5 u: Q
  51.     MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;8 q+ ~6 x& n* W7 v3 H
  52.     MPU_InitStruct.IsBufferable     = MPU_ACCESS_NOT_BUFFERABLE;
    - G0 x9 G. w+ d
  53.     MPU_InitStruct.IsCacheable      = MPU_ACCESS_CACHEABLE;1 N% P$ |# k* }  H' M0 U
  54.     MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;
    7 N. b) v: ]# F5 {5 ^
  55.     MPU_InitStruct.Number           = MPU_REGION_NUMBER2;
    ) Z; M8 w8 L+ C
  56.     MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL0;
    , ~' Z6 }' F5 V0 G
  57.     MPU_InitStruct.SubRegionDisable = 0x00;
    . d# R/ E/ Q  }9 b
  58.     MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;
    . {7 |3 K6 N/ F$ |. @

  59. % B* e( Y" c) q. h( `, n
  60.     HAL_MPU_ConfigRegion(&MPU_InitStruct);+ t! p- m$ S6 f& ?" m
  61.         
    + c, }" k/ g1 X/ O2 ?
  62.         /* 配置SRAM2的属性为Write through, read allocate,no write allocate */
    " ~- @* y# b" g* i/ i7 V1 d) s
  63.     MPU_InitStruct.Enable           = MPU_REGION_ENABLE;
      [1 P# _# V3 T& t
  64.     MPU_InitStruct.BaseAddress      = 0x30020000;
    " I: e3 [0 z6 A3 g! K  l! N
  65.     MPU_InitStruct.Size             = ARM_MPU_REGION_SIZE_128KB;        
    2 W7 ^; _4 e/ c9 I) B
  66.     MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;1 f3 e6 w% G5 s# }& L+ `
  67.     MPU_InitStruct.IsBufferable     = MPU_ACCESS_NOT_BUFFERABLE;
    . i5 O* ?( W/ t- M1 t" k
  68.     MPU_InitStruct.IsCacheable      = MPU_ACCESS_CACHEABLE;
    6 v/ s( q7 q0 N. C$ C* H! D! b& b" {7 G
  69.     MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;
    7 ]5 j* h. s: [8 a3 ?
  70.     MPU_InitStruct.Number           = MPU_REGION_NUMBER3;
    " J" ^: H) _3 D) P
  71.     MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL0;
    9 {( K6 ], U2 U9 _! K) y7 _
  72.     MPU_InitStruct.SubRegionDisable = 0x00;! L: e8 F9 |: v; o' S5 s
  73.     MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;! T8 T: c" ~2 ~& z1 h2 X% d& t

  74. 0 @0 l  F6 P. Q) c5 a1 S. h3 A+ Y
  75.     HAL_MPU_ConfigRegion(&MPU_InitStruct);
    ' T7 u) o0 ~/ m. U' g' g# f- X
  76. 1 t$ q) B# S% v4 i* e2 m
  77. . d. ?' r8 y; y( l
  78.     /* 配置SRAM3的属性为Write through, read allocate,no write allocate */
    # M# o) d& B+ l+ Q
  79.     MPU_InitStruct.Enable           = MPU_REGION_ENABLE;3 g! Y9 y; L/ k
  80.     MPU_InitStruct.BaseAddress      = 0x30040000;9 p2 @+ G4 U' ?9 x( u5 B# S
  81.     MPU_InitStruct.Size             = ARM_MPU_REGION_SIZE_32KB;        % Q* @4 f4 D' X4 k4 J0 }
  82.     MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;/ Q9 k! \" Z" V7 ~3 K+ f
  83.     MPU_InitStruct.IsBufferable     = MPU_ACCESS_NOT_BUFFERABLE;
    ; H  b5 ^' |4 c" S* i; O
  84.     MPU_InitStruct.IsCacheable      = MPU_ACCESS_CACHEABLE;
    . }' p2 Q7 U& P1 A% t( n7 d% ^
  85.     MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;8 f/ ]* b; J; g* V0 K$ Q
  86.     MPU_InitStruct.Number           = MPU_REGION_NUMBER4;
    9 [1 k! w% f7 M, M
  87.     MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL0;$ \+ M* Y& p: h7 B5 l, i1 E& G+ T
  88.     MPU_InitStruct.SubRegionDisable = 0x00;. \7 ?- \5 n+ g4 \3 J) o2 W
  89.     MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;
    / @" T) W) B: X! A* M. \

  90. 5 V0 T4 r5 b2 b
  91.     HAL_MPU_ConfigRegion(&MPU_InitStruct);
    7 v3 ~0 H$ _! y: W+ d" H: Q' P; [
  92.         ; d* K! a- B" k
  93.         
    & |' g) P  N6 |. n8 d2 Y( I
  94.         /* 配置SRAM4的属性为Write through, read allocate,no write allocate */( L9 m* `% Z" N: H8 P1 I
  95.     MPU_InitStruct.Enable           = MPU_REGION_ENABLE;
    8 V5 V! Z  o( ~
  96.     MPU_InitStruct.BaseAddress      = 0x38000000;
    ! ~' f6 ~; {  ?& d9 I& g. }. S
  97.     MPU_InitStruct.Size             = ARM_MPU_REGION_SIZE_64KB;        
    - Y8 Z8 m% U7 B( o9 [, [6 ?- C
  98.     MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;" i3 `  r9 `8 Z8 T9 L4 _
  99.     MPU_InitStruct.IsBufferable     = MPU_ACCESS_NOT_BUFFERABLE;' }- d: f  Y! s1 S% A) i# R9 y
  100.     MPU_InitStruct.IsCacheable      = MPU_ACCESS_CACHEABLE;4 Y  V9 C# ?7 X  I- q9 l
  101.     MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;
    " B6 @. ^$ Z0 v/ \% o4 L
  102.     MPU_InitStruct.Number           = MPU_REGION_NUMBER5;% Y  ~1 U7 f6 L4 H. i$ N" p- n
  103.     MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL0;0 U4 M: ^8 s( I. R
  104.     MPU_InitStruct.SubRegionDisable = 0x00;+ D8 q7 V( T# }
  105.     MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;
    9 A5 n) a2 `& a& _+ o

  106. 6 l1 @, {8 }' [2 W2 P6 G3 ]5 K
  107.     HAL_MPU_ConfigRegion(&MPU_InitStruct);
    9 t4 j8 X4 x# D5 q( Y$ x1 F6 t
  108.         
    2 ~* x7 h% E& ^$ Y) u# X( h
  109.         /*使能 MPU */
    ' S. ^5 z) d9 C
  110.         HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);
    ) n5 Y5 p4 c% e" }. O( c- L" h- v& `5 v
  111. }0 y- J0 j9 V" O" P
  112. , [& Z) X& a8 C1 I& Z) ~4 U
  113. /*% h1 v6 y; q2 |4 W8 }
  114. *********************************************************************************************************
    " |( e6 a+ J; B  t6 c. Z/ t
  115. *        函 数 名: CPU_CACHE_Enable  P0 o( U" b' I; \7 {+ L
  116. *        功能说明: 使能L1 Cache; F8 U- A* j" ~1 R" ?& t
  117. *        形    参: 无
    1 _0 r7 D) `3 t  @
  118. *        返 回 值: 无2 n8 \& y+ d+ G
  119. *********************************************************************************************************
    & k+ [6 M7 b7 C% N, t
  120. */4 b6 ~. q7 a1 Y& h! S2 X' l
  121. static void CPU_CACHE_Enable(void)
    * ^4 [. e, q+ O0 e' y
  122. {9 A2 L3 \& O& O$ ~, v2 V  K! \
  123.         /* 使能 I-Cache */
    2 B6 |' ^0 i: O  K* L
  124.         SCB_EnableICache();
    - R1 D6 f( _% d: C. T8 I
  125. ( _: m7 x& F8 f* y
  126.         /* 使能 D-Cache */
    ; @' S' P; T3 ^% |  b0 ]
  127.         SCB_EnableDCache();
    + S- m! h  j$ U. w( f9 a4 }4 z
  128. }
复制代码
( u) t2 ~5 S) j) s. _
  主功能:
; K( I& K( u5 V" t. @
7 n+ i; y6 X. A/ z' ?3 ]0 U- U3 m0 b主程序实现如下操作:* u  Y* p7 O" K7 z/ r9 C! ?6 t, I

) z6 o+ v3 y& p& r& d1 m, q  启动自动重装软件定时器0,每100ms翻转一次LED2。5 B/ A1 S9 ]" M; h! M
  K1键按下,从DTCM依次申请280字节,64字节和6111字节。) m% N- ]4 v+ L% d; y
  K1键松开,释放从DTCM申请的空间。
& u* L0 x- d6 F2 V- [( N  K2键按下,从AXI SRAM依次申请160字节,32字节和2333字节。1 G# [5 s0 d2 k' I# a. f/ v+ ^
  K2键松开,释放从AXI SRAM申请的空间。
6 l0 N: P" a, u3 j' @  K3键按下,从D2域SRAM依次申请200字节,96字节和4111字节。
: w4 K# w% A- T( p  K3键松开,释放从D2域SRAM申请的空间。
% n5 H+ u: h8 [* Q, f  摇杆OK键按下,从D3域SRAM依次申请300字节,128字节和5111字节。: K& c: K" a! D- m, \% c- I; j
  摇杆OK键松开,释放从D3域SRAM申请的空间。; d, V7 @8 i9 }: t0 L8 r" D7 l( i
  1. /*) v- |& W2 m( U1 C# [% S
  2. *********************************************************************************************************3 I8 ~4 Q, S! L
  3. *        函 数 名: main
    1 v% _: I7 Z3 F  ?0 {- |
  4. *        功能说明: c程序入口/ ?, g- ^8 t2 D1 f; C' U
  5. *        形    参: 无3 I" L0 y' D6 H7 ~1 y: @0 k
  6. *        返 回 值: 错误代码(无需处理). i: B3 J7 Y5 E. f0 W- m% ]: R2 a
  7. *********************************************************************************************************
    . [2 D7 ?- Q3 Q
  8. */9 C4 g4 h3 D% x* c4 @3 b# @, ?
  9. int main(void)8 u& p, ?6 l3 Y! }8 x+ `
  10. {
    9 h! T9 N4 [  U+ E- K' B) B' m
  11.         uint8_t ucKeyCode;                /* 按键代码 */* m& c/ O2 a3 w" q( c2 \" l8 q* k
  12.         uint32_t *DTCM_Addres0, *AXISRAM_Addres0, *SRAM1_Addres0, *SRAM4_Addres0;6 `+ G6 w" [& l* m% G4 g& M% I
  13.         uint16_t *DTCM_Addres1, *AXISRAM_Addres1, *SRAM1_Addres1, *SRAM4_Addres1;7 s, i5 j4 D2 C
  14.         uint8_t  *DTCM_Addres2, *AXISRAM_Addres2, *SRAM1_Addres2, *SRAM4_Addres2;
      s4 o2 m! D2 w8 E% F
  15. 4 w, l0 h* O8 d/ j

  16. ! A- ~$ V" h4 w, D8 v
  17.         bsp_Init();                /* 硬件初始化 */
    ) m9 T* _" i: R3 L3 ]" ?% i
  18.         ' ]1 L0 q+ D/ g$ E' }: E1 E) P
  19.         /* 初始化动态内存空间 */
    6 j! u" W7 g9 K0 q, R8 K
  20.         osRtxMemoryInit(AppMallocDTCM,    sizeof(AppMallocDTCM));
    0 _$ Y& @7 D4 d+ C: u' H* z% f
  21.         osRtxMemoryInit(AppMallocAXISRAM, sizeof(AppMallocAXISRAM));2 x) |! j- D* ]  A; f) j
  22.         osRtxMemoryInit(AppMallocSRAM1,   sizeof(AppMallocSRAM1));" o) o  q, O0 j% G. x" ?
  23.         osRtxMemoryInit(AppMallocSRAM4,   sizeof(AppMallocSRAM4));
    $ ]* s& Z; n5 X
  24.         
    * C* T" @+ P# k3 D6 n
  25.         PrintfLogo();        /* 打印例程名称和版本等信息 */
    - Z3 O" [9 }1 z4 j9 b4 Q+ ?
  26.         PrintfHelp();        /* 打印操作提示 */7 C1 @6 B5 L( e* d

  27. 9 p" ]$ J; W% m# M
  28.         bsp_StartAutoTimer(0, 100);        /* 启动1个100ms的自动重装的定时器 */
    - P0 _$ I- _2 x$ ?6 U
  29.         
    - S6 @* P4 A2 v8 s2 O" b
  30. ' n3 P7 ~* v5 p
  31.         /* 进入主程序循环体 */: W; k. g7 `9 Q; z  p5 y, `
  32.         while (1)9 }* Q5 M4 d) c  v6 U" j. K( r
  33.         {
    / O( a' P( T! ^5 d9 w, k
  34.                 bsp_Idle();                /* 这个函数在bsp.c文件。用户可以修改这个函数实现CPU休眠和喂狗 */
    ; S6 l4 `6 `; n1 j

  35. 8 E% h+ }  N$ ~0 s5 ?8 k
  36.                 /* 判断定时器超时时间 */
    % ^, @2 e9 |! @: E2 n
  37.                 if (bsp_CheckTimer(0))        
    , s6 K) r. `7 D9 ^0 v) D
  38.                 {# I0 [  R1 N! o6 O
  39.                         /* 每隔100ms 进来一次 */  6 p' |4 B$ X6 d# b3 I; e
  40.                         bsp_LedToggle(2);
    9 N; p- Y- F2 I& d. i: \2 ?
  41.                 }+ ]8 V' b. t+ T2 s1 {3 V7 i
  42. & s1 q$ g7 Z: X* v
  43.                 /* 按键滤波和检测由后台systick中断服务程序实现,我们只需要调用bsp_GetKey读取键值即可。 */
    . _2 q' `2 ^5 r) `6 C
  44.                 ucKeyCode = bsp_GetKey();        /* 读取键值, 无键按下时返回 KEY_NONE = 0 */! n5 q& V) o3 }. v5 G: w1 R
  45.                 if (ucKeyCode != KEY_NONE)
    + i+ L6 e- C4 ~. E4 {% W
  46.                 {% P; ]* I5 N" m+ J6 H0 E, J; |
  47.                         switch (ucKeyCode)2 z2 O/ A7 I# e0 g4 g4 S
  48.                         {+ i- Q  _6 \, H* H% K# {
  49.                 /* 从DTCM依次申请280字节,64字节和6111字节 */8 j. I, `" j+ r: v+ l' s! r. M; s
  50.                                 case KEY_DOWN_K1:        
    ) ~) k9 A+ O9 T: p+ e
  51.                     /* 从DTCM申请280字节空间,使用指针变量DTCM_Addres0操作这些空间时不要超过280字节大小 */
    7 ~/ e2 C* L: [2 \: ]! L) l5 m
  52.                                         printf("=========================================================\r\n");' k  N+ e6 y  }7 H+ u
  53.                                         DTCM_Addres0 = osRtxMemoryAlloc(AppMallocDTCM, 280, 0);0 s) H* K! O" ~
  54.                                         DTCMUsed = MemHeadPtr(AppMallocDTCM);
    * `6 C( _/ K- g
  55.                                         printf("DTCM总大小 = %d字节,申请大小 = 0280字节,当前共使用大小 = %d字节\r\n",
    ' @" K3 d5 V; E5 a: ]( G6 r
  56.                                                                                 DTCMUsed->size, DTCMUsed->used);, E9 p& Q+ ^: V3 d" o: _; g
  57.                                 
    & I0 h! E$ ?  r5 q$ p4 k  i9 V
  58.                         /* 从DTCM申请64字节空间,使用指针变量DTCM_Addres1操作这些空间时不要超过64字节大小 */        / B" B! p4 a8 D% J# h+ l$ }- m
  59.                                         DTCM_Addres1 = osRtxMemoryAlloc(AppMallocDTCM, 64, 0);
    5 |" b6 x' \8 }) ~: {5 c- g
  60.                                         DTCMUsed = MemHeadPtr(AppMallocDTCM);
    ; v  j) r! s$ l1 }  c1 Q# p# M
  61.                                         printf("DTCM总大小 = %d字节,申请大小 = 0064字节,当前共使用大小 = %d字节\r\n",
    ! g7 }" E8 W' n/ ?8 m; x
  62.                                                                                                            DTCMUsed->size, DTCMUsed->used);
    3 v3 K% }7 i% I* k% u# F
  63.                                 
    # ]; g$ @+ _* }8 i( X* w* s- t
  64.                     /* 从DTCM申请6111字节空间,使用指针变量DTCM_Addres2操作这些空间时不要超过6111字节大小 */
    . R( y* N1 C4 m/ b; C' L
  65.                                         DTCM_Addres2 = osRtxMemoryAlloc(AppMallocDTCM, 6111, 0);
    ' }$ v/ f& O, j3 `
  66.                                         DTCMUsed = MemHeadPtr(AppMallocDTCM);5 {0 L: Z, k; x& T# Q
  67.                                         printf("DTCM总大小 = %d字节,申请大小 = 6111字节,当前共使用大小 = %d字节\r\n", 0 t% y# k# {) _  Q4 h6 S5 N, v* D
  68.                                                                                 DTCMUsed->size, DTCMUsed->used);
    : |. @. I9 ^& x
  69.                                         break;+ |  g  J3 ~2 P6 @: }" c
  70.                                 
    4 ?( n- F% Y9 b
  71.                                 /* 释放从DTCM申请的空间 */8 j# @! \' B/ [8 E8 {5 l
  72.                                 case KEY_UP_K1:        $ H* Q, Z- [$ R: A% X4 @9 @1 c
  73.                                         /* 释放从DTCM申请的280字节空间 */; w; L4 y! k4 d
  74.                                         osRtxMemoryFree(AppMallocDTCM, DTCM_Addres0);
    0 W' i" N+ D: B9 `+ Z6 P8 x
  75.                                         DTCMUsed = MemHeadPtr(AppMallocDTCM);) B- x7 A3 P8 h! n
  76.                                         printf("释放DTCM动态内存区申请的0280字节,当前共使用大小 = %d字节\r\n",
    ; b) @6 E! S( w, e( C
  77. DTCMUsed->used);, |" L: D6 a( g& o* v- f' a7 X
  78.                                 
    ( V  b7 z, f$ [! C7 s  w9 G. r# d
  79.                                         /* 释放从DTCM申请的64字节空间 */5 E8 C. u8 z# R$ c1 W
  80.                                         osRtxMemoryFree(AppMallocDTCM, DTCM_Addres1);) ~1 g" ]3 [$ A. f# L3 ?% x. H
  81.                                         DTCMUsed = MemHeadPtr(AppMallocDTCM);! T3 r9 L( Y/ A$ U
  82.                                         printf("释放DTCM动态内存区申请的0064字节,当前共使用大小 = %d字节\r\n",
    3 b2 R& R& ~# E- G/ R" C; y0 C
  83. DTCMUsed->used);
    ! n1 F9 e' G4 m- v9 g8 ~
  84.                                 
    7 ?' I- u( ]- |1 {" c3 _, w
  85.                                         /* 释放从DTCM申请的6111字节空间 */- |9 ~! @9 y, y& q7 [. m: F& ]1 N
  86.                                         osRtxMemoryFree(AppMallocDTCM, DTCM_Addres2);( y) I1 O/ c) ]# @9 {' a$ t$ E
  87.                                         DTCMUsed = MemHeadPtr(AppMallocDTCM);
    ' m: m9 ?% O$ \/ v. m5 M! D
  88.                                         printf("释放DTCM动态内存区申请的6111字节,当前共使用大小 = %d字节\r\n",: G' f7 N' w% S, V( U
  89. DTCMUsed->used);
      k! R. R9 ~$ u
  90.                                         break;
    ! p9 P( U/ J5 u0 ]4 H4 E
  91.                                 
    6 e/ ^4 i, O: t( i$ I' V$ g
  92.                                 /* 从AXI SRAM依次申请160字节,32字节和2333字节 */
    7 U" e: T2 `( M8 ?9 u5 _
  93.                                 case KEY_DOWN_K2:        
    4 F% }; K' J, L, t0 T3 H3 N
  94.             /* 从AXI SRAM 申请160字节空间,使用指针变量AXISRAM_Addres0操作这些空间时不要超过160字节大小 */
    & h6 c1 h/ _* z
  95.                                         printf("=========================================================\r\n");               
    ' n9 R, E* ]9 _1 P
  96.                                         AXISRAM_Addres0 = osRtxMemoryAlloc(AppMallocAXISRAM, 160, 0);
    * U4 f# ?! `6 o  X/ j$ d
  97.                                         AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);8 O4 g2 V/ S8 H. Q
  98.                                         printf("AXI SRAM总大小 = %d字节,申请大小 = 0162字节,当前共使用大小 = %d字节\r\n",
    8 h; P- C8 o. o7 K
  99.                                                                                 AXISRAMUsed->size, AXISRAMUsed->used);) }" ~  x! ~6 ^. d/ T
  100.                                 
    : E, ~3 K9 C% |, j* N# M+ \9 m
  101.                         /* 从AXI SRAM 申请32字节空间,使用指针变量AXISRAM_Addres1操作这些空间时不要超过32字节大小 */6 ~1 A9 R0 N8 |* G
  102.                                         AXISRAM_Addres1 = osRtxMemoryAlloc(AppMallocAXISRAM, 32, 0);
    $ e- b" x7 T' s+ Z  I! Y
  103.                                         AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);4 h' r" y) y9 ^+ v
  104.                                         printf("AXI SRAM总大小 = %d字节,申请大小 = 0032字节,当前共使用大小 = %d字节\r\n",
    ) A: ]. s7 j1 J2 Y
  105.                                                                                                       AXISRAMUsed->size, AXISRAMUsed->used);
    & _/ X" w7 ?+ b* y6 v( e8 D. f; W
  106.                                 . u# O. O; e( C* @- T
  107. /* 从AXI SRAM 申请2333字节空间,使用指针变量AXISRAM_Addres2操作这些空间时不要超过2333字节大小 */        $ k" E6 S. ^% d' B& R
  108.                                         AXISRAM_Addres2 = osRtxMemoryAlloc(AppMallocAXISRAM, 2333, 0);& H- J5 u8 A! }0 h1 d1 R) ^
  109.                                         AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);4 T' b, {+ Q. N7 p- D
  110.                                         printf("AXI SRAM总大小 = %d字节,申请大小 = 2333字节,当前共使用大小 = %d字节\r\n",
    ; o7 ~9 T& K7 `+ `. \
  111.                                                                                 AXISRAMUsed->size, AXISRAMUsed->used);
    ! }: O- ?) b* w
  112.                                         break;- Z6 }  p" U/ y& p0 ~+ ~' k4 e- ?
  113.                                   e% n( G5 W" W7 l* x4 p
  114.                                 /* 释放从AXI SRAM申请的空间 */
    , P0 }# u  x6 f- |. A2 g* q
  115.                                 case KEY_UP_K2:        ( S3 y* d0 }, ]2 Q7 }9 U4 c
  116.                                         /* 释放从AXI SRAM申请的160字节空间 */$ d( ~# F( X0 [
  117.                                         osRtxMemoryFree(AppMallocAXISRAM, AXISRAM_Addres0);
    6 T- F% F+ U0 B7 q2 p
  118.                                         AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);
    7 T" \3 G9 \% A. l$ V* r
  119.                                         printf("释放AXI SRAM动态内存区申请的0160字节,当前共使用大小 = %d字节\r\n",
    * e7 B! J& e9 C3 r% @1 D2 `- f+ U$ L
  120. AXISRAMUsed->used);
    ! `" V. U6 e- ^! |
  121.                                 
    * S3 b5 A6 L/ g
  122.                                         /* 释放从AXI SRAM申请的32字节空间 */
    / b$ E% I% G3 @1 _
  123.                                         osRtxMemoryFree(AppMallocAXISRAM, AXISRAM_Addres1);
    1 f% k) I/ ]0 p# i( F+ ^
  124.                                         AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);) x" ^; U7 c* |- j2 o* `& _
  125.                                         printf("释放AXI SRAM动态内存区申请的0032字节,当前共使用大小 = %d字节\r\n",
    " U% Y- H9 ^4 |, [5 I7 k' l7 ?
  126. AXISRAMUsed->used);
    & n+ t, T6 @0 }3 V
  127.                                 ' b# W" E8 m# i2 L
  128.                                         /* 释放从AXI SRAM申请的2333字节空间 */
    & g0 A7 n7 }! B; p. Z5 s
  129.                                         osRtxMemoryFree(AppMallocAXISRAM, AXISRAM_Addres2);1 `  T/ j) J; V3 Z/ ?) Q; c
  130.                                         AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);0 G3 g/ Y% N% I4 c* r- ?
  131.                                         printf("释放AXI SRAM动态内存区申请的2333字节,当前共使用大小 = %d字节\r\n",
    9 F0 _6 D; m! X- r5 x1 Q" }
  132. AXISRAMUsed->used);
    - _7 t- i- a* G  }' }
  133.                                         break;( V4 y+ Y) Z8 j
  134.                                 
    * B: W2 G+ U5 O
  135.                                 /* 从D2域SRAM依次申请200字节,96字节和4111字节 */' b- R  g& f$ N
  136.                                 case KEY_DOWN_K3:        
    8 [0 ], n* G- N, L# K$ d+ S
  137.         /* 从D2域的SRAM申请200字节空间,使用指针变量SRAM1_Addres0操作这些空间时不要超过200字节大小 */
    2 f* E7 f# o3 S4 @" a, H
  138.                                         printf("=========================================================\r\n");               
    , U! ]: ?% L" c6 [
  139.                                         SRAM1_Addres0 = osRtxMemoryAlloc(AppMallocSRAM1, 200, 0);
    # W( o. C- O# V( O+ K- [1 I7 l$ b
  140.                                         SRAM1Used = MemHeadPtr(AppMallocSRAM1);# r% ?6 E) s( G9 J9 w
  141.                                         printf("D2域SRAM总大小 = %d字节,申请大小 = 0200字节,当前共使用大小 = %d字节\r\n", 9 A8 m* ]$ q* r- `; B( D% w$ ~$ X: p
  142.                                                                                 SRAM1Used->size, SRAM1Used->used);  m" [3 A; ?7 |5 i' i
  143.                                 / w7 i+ j/ z$ \
  144.          /* 从D2域的SRAM申请96字节空间,使用指针变量SRAM1_Addres1操作这些空间时不要超过96字节大小 */        ! Q. x1 O* c% }' T9 q4 f* l
  145.                                         SRAM1_Addres1 = osRtxMemoryAlloc(AppMallocSRAM1, 96, 0);
    & }; l8 y/ o" @. k  X  q* |$ r& {
  146.                                         SRAM1Used = MemHeadPtr(AppMallocSRAM1);4 r* m0 l, [5 ~6 W2 m
  147.                                         printf("D2域SRAM总大小 = %d字节,申请大小 = 0096字节,当前共使用大小 = %d字节\r\n", 2 \# F. k6 ?4 e" `7 }4 {9 P* ]
  148.                                                                                                            SRAM1Used->size, SRAM1Used->used);
    2 A% n1 _0 T/ n/ T* \) w0 c0 ?$ m  I
  149.                                 
    : p: O$ v9 N; ]) E1 P7 Q
  150.          /* 从D2域的SRAM申请4111字节空间,使用指针变量SRAM1_Addres2操作这些空间时不要超过4111字节大小 */& N6 h& F+ `! y4 Q% c2 e
  151.                                         SRAM1_Addres2 = osRtxMemoryAlloc(AppMallocSRAM1, 4111, 0);
    - ^2 f% ~  g) e# I1 G# @( H
  152.                                         SRAM1Used = MemHeadPtr(AppMallocSRAM1);
    , N2 Y% n# B: F+ M
  153.                                         printf("D2域SRAM总大小 = %d字节,申请大小 = 4111字节,当前共使用大小 = %d字节\r\n",
    / ?& a3 ^. c0 n' ^9 M2 I( ?6 a* }
  154.                                                                                 SRAM1Used->size, SRAM1Used->used);  x* D0 g9 T% [5 O
  155.                                         break;; v% E' s% J7 G2 E) K
  156.                                 & e; w2 e* Z" h
  157.                                 /* 释放从D2域SRAM申请的空间 */
    % @, J6 B4 v9 V4 ~6 N$ P- v
  158.                                 case KEY_UP_K3:        & r# _5 t. h% v( G# y0 O9 q
  159.                                         /* 释放从D2域的SRAM申请的200字节空间 */
    3 e  Z; `- {. H. W
  160.                                         osRtxMemoryFree(AppMallocSRAM1, SRAM1_Addres0);8 |$ [) ~7 k' }" S$ ?3 ~0 Y- s
  161.                                         SRAM1Used = MemHeadPtr(AppMallocSRAM1);6 F0 I' b; L) G7 `4 e  u, \
  162.                                         printf("释放D2域SRAM动态内存区申请的0200字节,当前共使用大小 = %d字节\r\n",
    0 n* V6 R' c$ F& D1 J: S5 E
  163. SRAM1Used->used);
    2 v/ G; a, q2 e& L4 g. ~
  164.                                 
    : ^2 J4 j) G  r( N8 u0 J
  165.                                         /* 释放从D2域的SRAM申请的96字节空间 *// f# W, R. N) c( ~2 }0 l
  166.                                         osRtxMemoryFree(AppMallocSRAM1, SRAM1_Addres1);
    2 A! r! L+ K; H6 L2 w; Q
  167.                                         SRAM1Used = MemHeadPtr(AppMallocSRAM1);% e9 Y% Q$ q, q! k: Y
  168.                                         printf("释放D2域SRAM动态内存区申请的0096字节,当前共使用大小 = %d字节\r\n",7 J9 E" _5 V( o5 [: I
  169. SRAM1Used->used);4 C/ _! ~1 S% \. F! O+ [
  170.                                 
    6 Q. ^1 m3 M& g: k
  171.                                         /* 释放从D2域的SRAM申请的4111字节空间 */  j5 l: F  l& V$ @" m& P
  172.                                         osRtxMemoryFree(AppMallocSRAM1, SRAM1_Addres2);
    0 P/ {  z* Y' M  m& J- G5 N1 ]
  173.                                         SRAM1Used = MemHeadPtr(AppMallocSRAM1);
    4 h$ S2 n, `) W# R+ ?) ~, B
  174.                                         printf("释放D2域SRAM动态内存区申请的4111字节,当前共使用大小 = %d字节\r\n",, l. f3 l* J6 p
  175. SRAM1Used->used);
    , a% Q2 A6 @, V7 r2 g4 F
  176.                                         break;* p; k4 `2 G/ q7 ]- h* o
  177.                                 
    5 |  F# f4 M: B/ J  L2 N9 L
  178.                                 /* 从D3域SRAM依次申请300字节,128字节和5111字节 */+ e* n! y  t8 ]3 `; o5 Q
  179.                                 case JOY_DOWN_OK:        
    7 z) K& T: b; E8 f: Q8 K
  180.             /* 从D3域的SRAM申请300字节空间,使用指针变量SRAM4_Addres0操作这些空间时不要超过300字节大小 */
      ]+ t  m% E! |9 U2 s
  181.                                         printf("=========================================================\r\n");               
    & O4 M$ m; p& l5 s2 ~+ f
  182.                                         SRAM4_Addres0 = osRtxMemoryAlloc(AppMallocSRAM4, 300, 0);/ u  C6 X- K* @, ?& h( ~& j
  183.                                         SRAM4Used = MemHeadPtr(AppMallocSRAM4);
    ' K+ L# U+ X, r2 _+ t8 h
  184.                                         printf("D3域SRAM总大小 = %d字节,申请大小 = 0300字节,当前共使用大小 = %d字节\r\n",
    0 S+ o+ M9 i0 n$ W8 R, S' m
  185.                                                                                 SRAM4Used->size, SRAM4Used->used);3 N$ E; k- F, Q# s" n) U$ K" r1 v
  186.                                 , @- t1 u: q+ B6 q" K
  187.                 /* 从D3域的SRAM申请96字节空间,使用指针变量SRAM4_Addres1操作这些空间时不要超过96字节大小 */' T2 |+ b* }' W# i
  188.                                         SRAM4_Addres1 = osRtxMemoryAlloc(AppMallocSRAM4, 128, 0);7 M& r8 T2 i( C# w% q% h8 m
  189.                                         SRAM4Used = MemHeadPtr(AppMallocSRAM4);; Q2 A9 s; w8 Q; @! r+ G
  190.                                         printf("D3域SRAM总大小 = %d字节,申请大小 = 0128字节,当前共使用大小 = %d字节\r\n", - N" a3 s; g! I  L" Z' R# X
  191.                                                                                                            SRAM4Used->size, SRAM4Used->used);& X* ?! {' N4 ?, d+ l, n" R
  192.                                 
    + ?, N* L- a* H' R) h
  193.         /* 从D3域的SRAM申请5111字节空间,使用指针变量SRAM4_Addres2操作这些空间时不要超过5111字节大小 */! D9 E  f1 r; m9 k% R! c* g
  194.                                         SRAM4_Addres2 = osRtxMemoryAlloc(AppMallocSRAM4, 5111, 0);
    # B/ R1 R- c6 i
  195.                                         SRAM4Used = MemHeadPtr(AppMallocSRAM4);/ U0 X7 U, n; l1 e' f. ?) C" n8 f
  196.                                         printf("D3域SRAM总大小 = %d字节,申请大小 = 5111字节,当前共使用大小 = %d字节\r\n",
    0 r0 J" r; N! m# y! R% {
  197.                                                                                 SRAM4Used->size, SRAM4Used->used);1 t4 Q- p1 p- }; x4 ]
  198.                                         break;
    8 G& ~7 M  Z/ m6 H
  199.                                 
    $ A% f( A( u$ F; R
  200.                                 /* 释放从D3域SRAM申请的空间 */
    7 t: `# y' S* t2 O
  201.                                 case JOY_UP_OK:        ( G, z! Z/ @3 U# ^* k
  202.                                         /* 释放从D3域的SRAM申请的300字节空间 */
    " U6 i* ~0 V2 }1 g) f% a2 j. U* a7 A
  203.                                         osRtxMemoryFree(AppMallocSRAM4, SRAM4_Addres0);
    4 B) P. F9 @5 V
  204.                                         SRAM4Used = MemHeadPtr(AppMallocSRAM4);
    / _* U6 c6 P/ g* X
  205.                                         printf("释放D3域SRAM动态内存区申请的0300字节,当前共使用大小 = %d字节\r\n",
    % f. g8 F+ d% G4 {: v9 y* q
  206. SRAM4Used->used);  d' r* c- A9 H8 e
  207.                                 
    * P1 J/ g  s: x% ^4 `7 T
  208.                                         /* 释放从D3域的SRAM申请的128字节空间 */
    - m2 a" r& R" g: G' t
  209.                                         osRtxMemoryFree(AppMallocSRAM4, SRAM4_Addres1);6 q/ B1 U# G) c9 x" E0 s3 K
  210.                                         SRAM4Used = MemHeadPtr(AppMallocSRAM4);: d# @7 ]+ A& [7 E+ F, Z9 ^3 w; M$ B
  211.                                         printf("释放D3域SRAM动态内存区申请的0128字节,当前共使用大小 = %d字节\r\n",. x1 B2 l5 _, i+ m  ~+ F
  212. SRAM4Used->used);
    + K; w% O: @, {+ b
  213.                                 
    2 g/ t* [& V9 D$ ?% K0 j8 z
  214.                                         /* 释放从D3域的SRAM申请的5111字节空间 */1 O' Z& u' z1 s: |6 H: A
  215.                                         osRtxMemoryFree(AppMallocSRAM4, SRAM4_Addres2);
    0 p, R$ q) x4 |8 ^4 A7 M
  216.                                         SRAM4Used = MemHeadPtr(AppMallocSRAM4);
    % N8 p2 S1 }0 {( f9 R
  217.                                         printf("释放D3域SRAM动态内存区申请的5111字节,当前共使用大小 = %d字节\r\n",4 p2 W$ ^2 d$ |# ?+ t  Z% v
  218. SRAM4Used->used);
    $ J1 X4 Y6 ^# _8 Z* U" x2 L
  219.                                         break;! N3 m9 c% u) ~5 `6 }; ?
  220.                         
    ) l7 b/ s# i3 l
  221.                                 default:
    8 f0 Q9 [4 u# `1 m+ ^8 b7 I% n
  222.                                   /* 其它的键值不处理 */( Z% k2 V) \  M1 p* R  w
  223.                                   break;
    + R/ [' D9 C0 F$ {, b- b- W
  224.                         }* M  m. x( C: b7 u+ Y3 M
  225.                 }7 q2 Z9 S! M6 Y/ w
  226.         }( \/ t" Q- l+ K" H" Z+ v
  227. }
复制代码

/ z; |0 t/ n" o27.6 总结6 L7 \" n3 K  n6 N6 I8 b+ d; O
本章节就为大家讲解这么多,还是比较有项目实用价值的,特别是MP3编解码,JPEG编解码,视频播放器,矢量字体等需要动态内存的场合。
# w" g" S+ z( D
8 S& }& J1 [5 {$ F7 ]8 a
% t0 \2 k5 x( U+ ]7 l& V
; J9 |" K/ P2 p; @2 V  C- g
收藏 评论0 发布时间:2021-12-23 15:00

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版