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

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

[复制链接]
STMCU小助手 发布时间:2021-12-23 15:00
27.1 初学者重要提示
. q3 s4 b5 d; w1 T& Z# ^  学习本章节前,务必优先学习了解TCM,SRAM等五块内存区的基础知识,比较重要。# _" l" w, s. ~
  将RTX5系统的动态内存管理整理了出来,可以同时管理多个分区。如果其它RTOS中使用,记得做互斥保护或者加个调度锁均可。
5 P" ^. d1 m" q# G8 k2 F  支持动态内存使用情况统计。
$ I' V8 a+ r/ L! R' ~" d! `1 ]27.2 动态内存管理移植& `- `5 r4 Q1 W/ B" \% e& r# I
移植比较简单,仅需添加两个文件到工程即可。
0 U5 T$ z2 ]/ j( E+ o+ {7 ^* e( z* ]' G' l
27.2.1 MDK版的移植
! f9 {& E+ ?/ Z* k6 f  第1步,添加如下两个文件到MDK中
, H. W9 A6 c) `. ]; h0 G' r注,以本章配套例子为例,这两个文件的路径\User\malloc。  z8 k( ]* l: a% [! Q4 J( @

' i) z# }; C7 e1 ~
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDcvMTM3OTEwNy0yMDE5.png
2 g7 T/ M. Q- K

4 x- O. Y3 Q2 T5 M/ }$ S6 U  第2步,添加路径。* N, m! k! `; e  c
# e- {6 Q; I- n$ R0 u* g& |
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDcvMTM3OTEwNy0yMDE5.png

: M; w" g  O- y/ t" ?  [: h, o: n
* L0 R2 L( ?' I  第3步,添加头文件。% X% \8 F; Q+ a; Z, ^5 S
如果哪个源文件要用到动态内存,包含rtx_lib.h即可,本章配套例子是直接将其放在了bsp.h文件里面,哪个源文件要用到动态内存,直接包含bsp.h头文件即可。
: @* y. T9 U4 g2 I; _2 ~" f) v. C/ h0 B2 |! T+ Y# K2 S
通过这简单的三步就完成了MDK的移植。  d. A$ e. `9 E& E

3 I: K* e3 B, e: t% b3 Y( L27.2.2 IAR版的移植. \- J1 V2 c1 H
  第1步,添加如下两个文件到IAR中  g' e; Z- J5 q7 a7 C$ e
注,以本章配套例子为例,这两个文件的路径\User\malloc。
7 B$ k' y5 W2 U2 e; ~
* K1 @) N5 a  Y% a, k' r% H
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDcvMTM3OTEwNy0yMDE5.png

: h; F. ^# S" h
3 N, y/ Y; P6 x3 q( {' U; D' N, z  第2步,添加路径。
9 f8 l  j; g* g# T( T# a5 [: ?; W$ g1 \# K5 L; X
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDcvMTM3OTEwNy0yMDE5.png

) D' X) N$ w+ L& ^. y! N8 Q+ `* L- T
  第3步,添加头文件。; u  V: u$ |* r8 j
如果哪个源文件要用到动态内存,包含rtx_lib.h即可,本章配套例子是直接将其放在了bsp.h文件里面,哪个源文件要用到动态内存,直接包含bsp.h头文件即可。
/ k- R' R, j7 x: e9 P' R
' p6 P8 H1 Q1 I/ C通过这简单的三步就完成了IAR的移植。, p% o  Z5 U/ v# a. \2 ~) h

" s' j' K$ A5 u# D1 p27.3 动态内存的使用方法
- [: W2 P0 Y: b3 |下面分别以MDK和IAR为例进行说明:
; _8 T- E. I+ E- l/ }  z
. e- W: M8 B3 S6 K. L* V27.3.1 MDK上的动态内存用法
0 I: ~$ I: u: m( }% L$ }( b2 A  定义动态内存区
" U2 H; L3 T) e+ M# h$ t比如当前的主RAM用的DTCM,我们就可以直接定义一块大的数组作为动态内存空间:/ P6 O1 `- u6 }- b  Y* O
- F' P6 ^' W# X( D5 m7 O
  1. /* DTCM, 64KB */
    ' o+ m, f, F$ [  _0 Q2 r% j$ M
  2. /* 用于获取当前使用的空间大小 */3 d$ ~0 o3 k$ a  @) A3 w
  3. mem_head_t *DTCMUsed; - {# [: Y3 I( Q4 D. i- d- K
  4. /* 定义为64位变量,首地址是8字节对齐 */            
    ( f% h6 ?0 [: |( ]; U0 z2 x
  5. uint64_t AppMallocDTCM[64*1024/8];
复制代码

, A4 T0 r# y. Y2 v, }如果要使用AXI SRAM作为动态内存空间,可以使用__attribute__((at( )))指定地址。) m4 W# b) J, @% z) G* r; D

0 }% _2 f! x2 |$ W; `- S
  1. /* D1域, AXI SRAM, 512KB */2 @+ b4 ?- _, h; v9 h
  2. /* 用于获取当前使用的空间大小 */
    ' W( s. `/ K; u3 |, i
  3. mem_head_t *AXISRAMUsed;  # K* L2 u0 w4 h; b. D: F6 S
  4. /* 定义为64位变量,首地址是8字节对齐 */
    ! o( v4 H/ _* U5 B, I9 a$ T* K
  5. uint64_t AppMallocAXISRAM[512*1024/8]__attribute__((at(0x24000000)));
复制代码
; ~9 F1 N! n  o
  初始化动态内存区, `4 o! a$ r+ a+ `
调用动态内存管理提供的函数osRtxMemoryInit即可做初始化:
6 h3 B/ ?2 G# M  ^1 k7 R
9 O. `" B+ ~6 E( z: j1 b! I  a9 josRtxMemoryInit(AppMallocDTCM,    sizeof(AppMallocDTCM));" J* d% G' s$ y7 c: Z5 v
osRtxMemoryInit(AppMallocAXISRAM, sizeof(AppMallocAXISRAM));" M8 \! P7 i, q; l' p' b

1 k: i1 I8 B2 Q' A& _+ c1 _8 l  申请动态内存7 ~$ X! g- x$ \6 A: U; ]4 P
通过函数void *osRtxMemoryAlloc (void *mem, uint32_t size, uint32_t type)做动态内存申请。; m6 g9 Y/ Z+ t. c
* s- c. x) J3 ]
第1个参数填写内存区首地址,比如申请的AppMallocDTCM,就填AppMallocDTCM即可。" |( t8 n: S7 r: Y% Q
5 U' P/ Q: I, W+ P* n1 b5 R
第2个参数填写申请的字节大小,单位字节。
( p- Z  d- u& t) q: p+ s. @
& N5 K4 c% t; ]- q第3个参数固定填0即可。
4 ?7 F& q6 T2 K3 W
; X# e7 t& F( Y3 m. Y返回值是所申请缓冲区的首地址,如果没有空间可用,将返回NULL,这点要特别注意!7 H$ r3 P; c1 o, q
9 w$ z$ ^. n) u& F  y, T
举个例子:
( W" J8 G& ?; V5 W$ U. s: j! h' a" [' g6 I% d- f- h4 ~* N6 |
  1. uint32_t *DTCM_Addres0, *AXISRAM_Addres0;! H$ a* I' o7 m; o* O1 x$ ~! ~
  2. 4 V' I. m  l) L% I8 R5 M  R! {  K
  3. /* 从DTCM申请280字节空间,使用指针变量DTCM_Addres0操作这些空间时不要超过280字节大小 */        % o; F8 n$ f1 `# @6 U. i* T
  4. DTCM_Addres0 = osRtxMemoryAlloc(AppMallocDTCM, 280, 0);, }* h& N* r. _, W8 x0 S6 r0 D# ]
  5. DTCMUsed = MemHeadPtr(AppMallocDTCM);
    2 y  }2 {% e5 S/ B6 u# N% k1 \, [; s6 x
  6. printf("DTCM总大小 = %d字节,申请大小 = 0280字节,当前共使用大小 = %d字节\r\n",
    * D: D! x* x# V- @) E
  7.                                                              DTCMUsed->size, DTCMUsed->used);
    6 `# ~9 Q! \! L" h

  8. 4 ?2 J) x: U' i2 ^: B
  9. /* 从AXI SRAM 申请160字节空间,使用指针变量AXISRAM_Addres0操作这些空间时不要超过160字节大小 */        
    # b6 C% F8 i- q+ c7 w4 U
  10. AXISRAM_Addres0 = osRtxMemoryAlloc(AppMallocAXISRAM, 160, 0);
    $ y/ O1 z% C, `% h- v( R+ F
  11. AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);
    * a, x0 E; K" ^$ v1 v) Y
  12. printf("AXI SRAM总大小 = %d字节,申请大小 = 0162字节,当前共使用大小 = %d字节\r\n",
    4 O% M* G% u" x" h9 y
  13.                                                             AXISRAMUsed->size, AXISRAMUsed->used);
复制代码
- P; K, C& o1 S  U
申请了空间后,就可以直接使用了。另外注意红色字体部分,通过DTCMUsed->used和AXISRAMUsed->used可以获取当前使用的空间大小。
# B) R8 E6 b9 r- e' R0 i' W0 M& f; ?* z9 Z1 k
  释放动态内存2 q* t$ w. c) T6 x% `) t
通过函数uint32_t osRtxMemoryFree (void *mem, void *block)做动态内存释放。
( a1 s! o0 S& H/ S  Z. \
: H& P( s8 \0 U第1个参数填写内存区首地址,比如释放的AppMallocDTCM,就填AppMallocDTCM即可。
; v% a; d6 `8 g  G2 u3 ~
, l, g, O5 ^  p5 ]2 \" G# D& V) b第2个参数填写申请内存时所获取的内存区首地址,这里用于释放。
1 g& j. X6 `9 o- P9 p$ F- [0 X1 m- j+ O. M1 d% [
返回值,返回1表示成功,返回0表示失败。
6 d" i/ e& P( Q: l& D: R( M% V# [2 M1 _8 B
举个例子:: P& x; l  C6 A$ Q3 r/ N6 t3 f* M
; z* i) r; A9 K; o) H
  1. /* 释放从DTCM申请的280字节空间 */
    & h+ r5 o# o' E0 N" l- p  n
  2. osRtxMemoryFree(AppMallocDTCM, DTCM_Addres0);
    5 d4 k+ T0 z7 L1 X
  3. DTCMUsed = MemHeadPtr(AppMallocDTCM);' r5 G$ X3 S; C) c& u
  4. printf("释放DTCM动态内存区申请的0280字节,当前共使用大小 = %d字节\r\n", DTCMUsed->used);7 U+ b3 t% K# @7 Y8 t. m3 n+ D

  5. ' w$ T( [% r- X; b
  6. /* 释放从AXI SRAM申请的160字节空间 */1 P6 X8 u1 S0 D) V, E
  7. osRtxMemoryFree(AppMallocAXISRAM, AXISRAM_Addres0);
    ! c( t4 r) z0 }* e8 q
  8. AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);
    - E) y2 u4 Q7 S1 |4 R
  9. printf("释放AXI SRAM动态内存区申请的0160字节,当前共使用大小 = %d字节\r\n", AXISRAMUsed->used);
复制代码

! w9 G- r# B1 c1 Z) l& G# v27.3.2 IAR上的动态内存用法
: |: ]5 X6 K. R3 ?8 p注:IAR使用这个动态内存管理,仅在定义时跟MDK略有不同,其它地方是一样的。
1 y+ m7 E; ^$ @1 |4 C! f& D8 c; W% f3 G+ `0 p  s
  定义动态内存区
! X: a& v5 i1 Y4 f' R+ n: U7 U比如当前的主RAM用的DTCM,我们就可以直接定义一块大的数组作为动态内存空间:, x; p3 ]* B) g) q5 R# G4 n2 W

, T; x3 N! c9 H- v. S. i
  1. /* DTCM, 64KB */1 }2 W* m& }6 v+ }: L! B4 X
  2. /* 用于获取当前使用的空间大小 */
    * i4 {% J  i- p, [
  3. mem_head_t *DTCMUsed; ' j+ ~; l7 J) I$ h: w
  4. /* 定义为64位变量,首地址是8字节对齐 */             + x7 b/ r2 A$ m6 V
  5. uint64_t AppMallocDTCM[64*1024/8];
复制代码
& X6 C+ e- z4 R9 t" _) O- y
如果要使用AXI SRAM作为动态内存空间,可以使用__attribute__((at( )))指定地址。& d3 @3 n. n/ u# x  K

7 K; p# ?% [& ]3 s, v' P4 b
  1. /* D1域, AXI SRAM, 512KB */& ?( A& Z1 X$ I" d. c
  2. /* 用于获取当前使用的空间大小 */% x, t; {# y! R: K7 j
  3. mem_head_t *AXISRAMUsed;  0 u+ }" r- W! b% [+ |* Z
  4. /* 指定下面数组的地址为0x24000000 */ 0 I. [; z$ X* h/ w% L9 Q4 I/ y
  5. #pragma location = 0x24000000, r  ?9 G1 q! i! y4 q9 \% a
  6. uint64_t AppMallocAXISRAM[512*1024/8];
复制代码

: d5 I4 s) ~. ^  初始化动态内存区
2 z- k6 g( [! N' o1 I调用动态内存管理提供的函数osRtxMemoryInit即可做初始化:  n! i! J' }: ?) p2 h

+ A5 D- B& |1 V
  1. osRtxMemoryInit(AppMallocDTCM,    sizeof(AppMallocDTCM));
    & S1 ~7 P) w: Q5 P
  2. osRtxMemoryInit(AppMallocAXISRAM, sizeof(AppMallocAXISRAM));
复制代码
: H% x8 Q7 M+ w  y8 H4 g$ t
  申请动态内存/ C+ k# U1 d) M
通过函数void *osRtxMemoryAlloc (void *mem, uint32_t size, uint32_t type)做动态内存申请。
" D3 N3 }- ~  I+ I
7 J2 P, g' W4 ?) _" J; K2 \: x第1个参数填写内存区首地址,比如申请的AppMallocDTCM,就填AppMallocDTCM即可。
% ^$ w7 G" l8 z* i! c
5 G* w1 G: e% P/ g' F5 G/ P# v第2个参数填写申请的字节大小,单位字节。
7 \+ D; n# B3 I- z: K5 t" Q/ R, I& k5 s8 X. x; G4 U  l
第3个参数固定填0即可。, K0 Q0 k5 \" L

; S0 x( A& R0 u% u7 V返回值是所申请缓冲区的首地址,如果没有空间可用,将返回NULL,这点要特别注意!
& e4 A8 P" `7 s5 K+ F. }$ i6 o8 s
举个例子:  f  o; l! @! I' B* W4 a
* C: k( u) `$ O( M* F! z; B
  1. uint32_t *DTCM_Addres0, *AXISRAM_Addres0;
    ) Z1 Q0 j/ i$ V! ~

  2. 5 U' [1 K# M" ^( [
  3. /* 从DTCM申请280字节空间,使用指针变量DTCM_Addres0操作这些空间时不要超过280字节大小 */        
    3 `3 E6 ^+ Y3 c2 m$ E" U! c
  4. DTCM_Addres0 = osRtxMemoryAlloc(AppMallocDTCM, 280, 0);: @/ s% p4 l7 O
  5. DTCMUsed = MemHeadPtr(AppMallocDTCM);
    - f1 y8 K* A& P9 {' ?! h
  6. printf("DTCM总大小 = %d字节,申请大小 = 0280字节,当前共使用大小 = %d字节\r\n", 8 m" k8 P' l. u# z* H
  7.                                                              DTCMUsed->size, DTCMUsed->used);, S9 w& q' W1 i- F- X" \
  8. ! f6 w1 x$ ?! \2 b0 W4 v1 P
  9. /* 从AXI SRAM 申请160字节空间,使用指针变量AXISRAM_Addres0操作这些空间时不要超过160字节大小 */        
    1 I0 z* F% D, L0 S+ ~& a
  10. AXISRAM_Addres0 = osRtxMemoryAlloc(AppMallocAXISRAM, 160, 0);
      R5 ?. f$ U$ v+ B0 `, j
  11. AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);
    7 \- R5 y9 p/ c$ I5 F) C7 n
  12. printf("AXI SRAM总大小 = %d字节,申请大小 = 0162字节,当前共使用大小 = %d字节\r\n", 0 y. m1 K- ~+ A- Z
  13.                                                             AXISRAMUsed->size, AXISRAMUsed->used);
复制代码

! V* U* A. C: z' X4 z申请了空间后,就可以直接使用了。另外注意红色字体部分,通过DTCMUsed->used和AXISRAMUsed->used可以获取当前使用的空间大小。
9 |2 w: q% s  c. C: H* p3 _2 N! i5 T# d3 J* }+ S# w
  释放动态内存2 _# B8 b3 i& ]4 Z- @% n
通过函数uint32_t osRtxMemoryFree (void *mem, void *block)做动态内存释放。" I/ J1 R* p, V: I' d- R( `0 S
! [- j6 O6 m/ e) Q
第1个参数填写内存区首地址,比如释放的AppMallocDTCM,就填AppMallocDTCM即可。1 ]/ ~+ ?7 i/ [7 r0 @
* W& e$ V3 v2 @2 N& |. W, ?
第2个参数填写申请内存时所获取的内存区首地址,这里用于释放。+ e& ~6 E% r" X, r/ S0 c

) E4 z* V" v" M) w9 O返回值,返回1表示成功,返回0表示失败。
- b" T* E8 r! }" J8 W) C9 `2 s3 l
举个例子:
# H# @4 N3 F2 X; M. ]6 U4 y3 o2 P5 B- Z) j3 f
  1. /* 释放从DTCM申请的280字节空间 *// U, w5 Y% W1 |# z0 n
  2. osRtxMemoryFree(AppMallocDTCM, DTCM_Addres0);
    % `% a9 _( z7 w1 [7 W3 W
  3. DTCMUsed = MemHeadPtr(AppMallocDTCM);5 X) m* z) }! _3 z. S
  4. printf("释放DTCM动态内存区申请的0280字节,当前共使用大小 = %d字节\r\n", DTCMUsed->used);
    ! k+ G7 M4 s$ v6 K
  5. 3 P* S4 z: e2 F  I" }) l
  6. /* 释放从AXI SRAM申请的160字节空间 */0 w- d8 |. |1 k: R' t' b4 ]
  7. osRtxMemoryFree(AppMallocAXISRAM, AXISRAM_Addres0);& Z+ G7 }$ F  a5 y
  8. AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);3 |8 l, r! ]! F# T4 q% Z! m, q
  9. printf("释放AXI SRAM动态内存区申请的0160字节,当前共使用大小 = %d字节\r\n", AXISRAMUsed->used)
复制代码

4 e6 |* v7 F' t' t8 {5 {27.4 实验例程说明(MDK)
/ h: C, R* f# |, h: i; F# x配套例子:4 q# v+ x& b7 t& o$ ^  D0 _# ~
V7-006_TCM,SRAM等五块内存的动态内存分配实现
5 v! D8 x6 d, ^$ I# D5 R7 [( W- V( O2 x1 t! i" l8 Z$ M( {% R7 i
实验目的:
$ d& {9 O/ y: i3 ?, i学习TCM,SRAM等五块内存的动态内存分配实现。
: B' X7 Y5 `0 K! T& x) \0 E* ~5 n7 `$ p% s7 o3 n" f2 s
9 b  p" @7 e, x- Q& h+ _, `5 V
实验内容
* ]1 ?1 r9 ?; V9 m启动自动重装软件定时器0,每100ms翻转一次LED2。' j+ R" m. ?. m+ M! Z# A
& S8 Z7 w, J: R7 }. I

  P% {, l8 Z3 U- k& |实验操作:
' T7 v7 y* i2 e6 x3 \, D6 @5 KK1键按下,从DTCM依次申请280字节,64字节和6111字节。
* H3 _/ _  v- B# y2 T9 [% rK1键松开,释放从DTCM申请的空间。+ I$ P8 c0 Q- R7 a$ I
K2键按下,从AXI SRAM依次申请160字节,32字节和2333字节。
; O/ ], c; H9 Q% m+ hK2键松开,释放从AXI SRAM申请的空间。
5 ?" |  S4 [7 g9 @9 X/ y5 R8 P* ?K3键按下,从D2域SRAM依次申请200字节,96字节和4111字节。
% b2 f& V* ^( W/ `* M* U4 r/ @K3键松开,释放从D2域SRAM申请的空间。
0 v( D( O2 {4 i; p摇杆OK键按下,从D3域SRAM依次申请300字节,128字节和5111字节。
5 ?# n' e6 |. P5 Y. D0 E0 s" Y* [摇杆OK键松开,释放从D3域SRAM申请的空间。4 r3 p! @; G7 N; I
6 o3 n! i" _  v6 o/ r8 @3 F' J" J
% O1 `1 q8 G, O3 T* W
上电后串口打印的信息:
7 B5 @, \) j- U& c/ p% [8 Y, k; X
3 F" `  N  a1 B波特率 115200,数据位 8,奇偶校验位无,停止位 1+ O( s! i% m- B% `

1 l  R, i* |8 D+ a% y+ w+ l. t/ N; H
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDcvMTM3OTEwNy0yMDE5.png

+ C/ i; V8 |# b# b9 B& p! }; G2 }. @& J2 ~
程序设计:
9 p$ i2 Y  K( P& m* y, V
3 |/ J4 Z2 F5 k% Q" m; w  系统栈大小分配:) d# O9 v# O8 x( \0 k

! y9 `5 i- W- [
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDcvMTM3OTEwNy0yMDE5.png

* [# j- G. ~1 @
* R0 S- x. p) |) K1 G! XRAM空间用的DTCM:
" F7 L6 @' E4 d# e/ n
3 T  C* R0 |' W' e5 L
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDcvMTM3OTEwNy0yMDE5.png

, W7 Y9 }( H# W2 Y9 r8 o# Y5 M. A8 S  s. L
  硬件外设初始化
6 l' e" Z1 I& g2 ]( Y* p! x3 f
硬件外设的初始化是在 bsp.c 文件实现:3 g. H, f0 X8 R0 ~" J4 @

5 R, m& r* {, b" E4 W. F1 A
  1. /*
    % X) X8 |! K0 d0 Y7 s# h
  2. *********************************************************************************************************
    % ?7 }4 n4 w+ J
  3. *        函 数 名: bsp_Init/ y, I7 n+ j; {( t& @3 }9 I
  4. *        功能说明: 初始化所有的硬件设备。该函数配置CPU寄存器和外设的寄存器并初始化一些全局变量。只需要调用一次/ l, _9 n$ A8 P" L; X. o" u
  5. *        形    参:无  Q3 s$ Q, o# V% A' d& p
  6. *        返 回 值: 无% {# n) @, X$ N0 G2 S; \: N
  7. *********************************************************************************************************
    ! U8 o( c; B1 s. l0 j- |
  8. */
    6 C' N+ \/ ~- q
  9. void bsp_Init(void)/ k" X5 D: f  Y3 }9 B! I" N7 D2 {
  10. {
    & d3 ~% t2 X" x0 c: v$ U( O
  11.     /* 配置MPU */5 t6 H' W" j" M9 W  Y" [+ d2 e
  12.         MPU_Config();6 N2 Q7 ~* K4 f% k1 m1 n
  13.         
    ! j3 d+ I# H2 n# u
  14.         /* 使能L1 Cache */7 h# d! P0 i9 G# W0 i6 ?5 x! J3 n
  15.         CPU_CACHE_Enable();
    . e, C' b6 B2 @' H" C

  16. + r9 l( \' W5 @7 H" W0 O- Y
  17.         /*
    7 q9 ]% B5 g7 w# x6 J+ c) F
  18.        STM32H7xx HAL 库初始化,此时系统用的还是H7自带的64MHz,HSI时钟:
    3 o5 t7 v( m9 Z9 J6 x% o, ]
  19.            - 调用函数HAL_InitTick,初始化滴答时钟中断1ms。
    ! x, e& H+ C% M
  20.            - 设置NVIV优先级分组为4。# |; g4 L& M% y; u+ ?0 I
  21.          */
    ( _4 C' I- K7 p  l6 ?
  22.         HAL_Init();! I" }, @* u0 y8 |! Y

  23. , I  n) u5 d0 N) O7 w
  24.         /* ' n- F8 z# }5 ]1 X" x
  25.        配置系统时钟到400MHz: v4 \9 i9 P8 E# X" }" R
  26.        - 切换使用HSE。
    ) t7 F+ t4 B) o' L* y4 h. L% m( x
  27.        - 此函数会更新全局变量SystemCoreClock,并重新配置HAL_InitTick。/ R; l3 V  x, d7 }( b! `: c* S
  28.     */, W% `7 Y7 c* f& P( M
  29.         SystemClock_Config();* c2 G+ K4 ]7 ]. T5 x: h* E# b0 _

  30. + S* ?% U, P0 b/ @* o2 Z, e
  31.         /*
    ! x" u/ U; X& X7 x
  32.            Event Recorder:
    - T( m- ]2 I) o* I' B9 X
  33.            - 可用于代码执行时间测量,MDK5.25及其以上版本才支持,IAR不支持。
    & c( e( `7 l9 C* [# H) e" v# r
  34.            - 默认不开启,如果要使能此选项,务必看V7开发板用户手册第xx章
    # O# ^1 t* t5 h" w: U) S2 [
  35.         */        2 z8 }- K7 A1 E5 Y( x+ s4 I, \# {
  36. #if Enable_EventRecorder == 1  9 u  p5 A9 J! p: ?
  37.         /* 初始化EventRecorder并开启 */
    3 d! L, ~1 P, W$ s3 m2 K: O. s
  38.         EventRecorderInitialize(EventRecordAll, 1U);5 S1 {" b6 l" Z
  39.         EventRecorderStart();; L$ p7 g  g+ y# M# s
  40. #endif
    % Y0 h  m& O: C' S3 w. p. m* e0 ^6 v5 u
  41.         
    ) L9 }7 U, k. ^# O0 e/ T0 S
  42.         bsp_InitKey();            /* 按键初始化,要放在滴答定时器之前,因为按钮检测是通过滴答定时器扫描 */
    ! @9 I! m9 h% F. {7 p, h7 H
  43.         bsp_InitTimer();          /* 初始化滴答定时器 */& E  [7 f  d) Z0 j  n: U
  44.         bsp_InitUart();        /* 初始化串口 */
    1 T0 s8 D: D7 q! R1 O; ?4 g- @
  45.         bsp_InitExtIO();        /* 初始化FMC总线74HC574扩展IO. 必须在 bsp_InitLed()前执行 */        9 i2 }3 v2 ~% i  ?( ]5 }, D, G
  46.         bsp_InitLed();            /* 初始化LED */        
    ) T. |# x/ O$ m4 n9 K% S# P7 P; M
  47. }
复制代码

- a' E* g+ i( w) p( w. g7 n- F  MPU配置和Cache配置:
' ]' [4 t- o1 q6 ]数据Cache和指令Cache都开启。7 a) H. `5 {% v1 `% {

% d4 h& T7 [: a1 E% @4 ?AXI SRAM的MPU属性:% N2 o$ V! r/ d' p
5 m( @* s7 q) ^6 }7 z* p) ]& w
Write back, Read allocate,Write allocate。
& M1 z6 ?0 R1 I6 F0 r* y; V5 B$ {1 ?- q3 d
FMC的扩展IO的MPU属性:" o" W3 z* D& i4 R( n* D, w1 \
: Z) f. X9 H! q0 E& B. G, _4 ]
必须Device或者Strongly Ordered。, u2 |' a  L8 _
8 B+ p1 y! A4 ~0 W, j% G' D  S
D2 SRAM1,SRAM2和SRAM3的MPU属性:
1 h5 k$ f$ N5 t8 E5 @' X5 }% ?
$ ]. a! e0 q3 gWrite through, read allocate,no write allocate。
: {* [( Q3 r2 c6 I- t
6 K! b( s: k$ {D3 SRAM4的MPU属性:
. ^4 G/ D! [) B2 x' c% X7 z. Y$ |$ ^! c! r+ J9 R8 f. W
Write through, read allocate,no write allocate。  e/ r4 X" d" Y- n

+ v' Q7 ?+ ?. z; E4 ^
  1. /*
    8 O# S4 j4 Y2 p/ {
  2. *********************************************************************************************************% x) {! k9 ?0 ~! l2 Y) ?( s- a4 C, @  H2 W
  3. *        函 数 名: MPU_Config
      o4 u* h6 H9 Z( m  B! T
  4. *        功能说明: 配置MPU% P! V* g  D1 F9 `
  5. *        形    参: 无: s# Y) k# P( R+ P" g
  6. *        返 回 值: 无% d, j# u5 [7 T/ E
  7. *********************************************************************************************************$ v7 o7 @1 i$ S0 B
  8. */& \# j( k, X# L
  9. static void MPU_Config( void )
    - s# }$ ]( [( S; y5 j3 i
  10. {
    1 `/ l7 A, W4 n5 e! w4 O/ D6 Z
  11.         MPU_Region_InitTypeDef MPU_InitStruct;
    / ~, T" M  \3 p2 k/ k. r( D

  12. 4 o$ j/ k2 Q4 v8 a; u5 @- j
  13.         /* 禁止 MPU */( B2 ]: u. p: G& `9 P5 q
  14.         HAL_MPU_Disable();
    9 k) b# N) w3 S
  15. & ?8 }; k! S: n
  16.         /* 配置AXI SRAM的MPU属性为Write back, Read allocate,Write allocate */
    7 p; V" G: b( N: X
  17.         MPU_InitStruct.Enable           = MPU_REGION_ENABLE;
    % y8 o! b( n& o7 w$ n4 k( A# V( }
  18.         MPU_InitStruct.BaseAddress      = 0x24000000;; O# b! _# D$ f/ A
  19.         MPU_InitStruct.Size             = MPU_REGION_SIZE_512KB;0 Y9 p: U) M# B" D* S, r& g
  20.         MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
    ( H6 o2 h/ |. ?: e- @+ M
  21.         MPU_InitStruct.IsBufferable     = MPU_ACCESS_BUFFERABLE;( D4 @# q# W9 x- M
  22.         MPU_InitStruct.IsCacheable      = MPU_ACCESS_CACHEABLE;
    * t$ f8 J0 g' U2 _$ g: j) a& H! X
  23.         MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;
    % ]) s% F+ C1 e+ y5 R9 k- p
  24.         MPU_InitStruct.Number           = MPU_REGION_NUMBER0;
    0 H* h# F# j6 |9 G" E2 ^
  25.         MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL1;
    % u0 N7 J7 Z9 I4 H7 ?- N6 m* G4 l" ?
  26.         MPU_InitStruct.SubRegionDisable = 0x00;: P5 t4 v% f/ k/ _( `
  27.         MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;
    * L$ D- F/ r' b" }( _

  28. ! ?6 F" v3 h  V3 [/ B. U
  29.         HAL_MPU_ConfigRegion(&MPU_InitStruct);
    $ g) G' O/ n. G
  30.         # ^- Z, ?: z6 o7 M6 @( h7 o$ Q$ _
  31.         
    ( m' `, T  d: f3 ?4 C8 g
  32.         /* 配置FMC扩展IO的MPU属性为Device或者Strongly Ordered */
    , n$ m0 K2 s) y
  33.         MPU_InitStruct.Enable           = MPU_REGION_ENABLE;
    . R* O, l! e, Y$ j5 t' \% ~
  34.         MPU_InitStruct.BaseAddress      = 0x60000000;
    , \% \# B! v& j  l* {4 p
  35.         MPU_InitStruct.Size             = ARM_MPU_REGION_SIZE_64KB;        $ C0 p# W/ j1 K- {/ X
  36.         MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;! K" v* \8 j! J8 T" Q2 {
  37.         MPU_InitStruct.IsBufferable     = MPU_ACCESS_BUFFERABLE;
      d" j9 c1 b( r' L
  38.         MPU_InitStruct.IsCacheable      = MPU_ACCESS_NOT_CACHEABLE;
    ! b. `, L$ V: o' ~8 n
  39.         MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;7 D0 O: C+ v9 C
  40.         MPU_InitStruct.Number           = MPU_REGION_NUMBER1;6 N( Q2 R" T- H! Q: }. A9 y! e
  41.         MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL0;
    & A7 I- b# _  T) a9 `6 g+ U; l
  42.         MPU_InitStruct.SubRegionDisable = 0x00;% }& Y% a/ j) F# c# t- M; m- b0 [& ?
  43.         MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;6 y, b5 V% e: F2 ?
  44.         
    : m5 {2 g: h# D( f; k$ y
  45.         HAL_MPU_ConfigRegion(&MPU_InitStruct);
    / t9 I! v0 ?1 s4 h8 T* p" X, {
  46.         / N; r: l. K3 n- m9 q0 Y
  47.         /* 配置SRAM1的属性为Write through, read allocate,no write allocate */1 _( M$ G: _1 s/ {9 ^
  48.     MPU_InitStruct.Enable           = MPU_REGION_ENABLE;. r2 W, L% G0 f% W
  49.     MPU_InitStruct.BaseAddress      = 0x30000000;
    $ d1 V( h1 F" p$ P/ S; w  Q! z
  50.     MPU_InitStruct.Size             = ARM_MPU_REGION_SIZE_128KB;        
    ; c! w$ Q8 ^8 e# D1 R
  51.     MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
    0 q  x; _$ O0 J) n: I: t! t0 b. J
  52.     MPU_InitStruct.IsBufferable     = MPU_ACCESS_NOT_BUFFERABLE;
    2 K5 Y; w- k- }; K/ c
  53.     MPU_InitStruct.IsCacheable      = MPU_ACCESS_CACHEABLE;1 `5 B3 c9 {. T+ K3 p2 R
  54.     MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;
    ! D- C% t* l/ W/ \$ U
  55.     MPU_InitStruct.Number           = MPU_REGION_NUMBER2;
    % H. B) o) B+ h8 A) T
  56.     MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL0;! f$ _4 r* X" }" m$ O7 ]
  57.     MPU_InitStruct.SubRegionDisable = 0x00;
    / H" }) u) k0 q/ l' {. A) s" z
  58.     MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;  T% H: ]6 B0 {* {9 L8 b- `3 Z
  59. " e- }, H3 `3 i  N# D
  60.     HAL_MPU_ConfigRegion(&MPU_InitStruct);
    , O6 }4 k# p+ J  M+ B
  61.         
    * {  c9 S8 U% q& s4 M
  62.         /* 配置SRAM2的属性为Write through, read allocate,no write allocate */3 I) L$ i: ~% M# f- ^% k
  63.     MPU_InitStruct.Enable           = MPU_REGION_ENABLE;
    " J# O  x  W# ?$ e+ ]6 _' O
  64.     MPU_InitStruct.BaseAddress      = 0x30020000;! V& m. e9 g* o( r5 l) W
  65.     MPU_InitStruct.Size             = ARM_MPU_REGION_SIZE_128KB;        ! S' J* A' y$ {- e5 n9 J8 l6 t
  66.     MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
    7 T  E2 r& a3 S2 ?+ {
  67.     MPU_InitStruct.IsBufferable     = MPU_ACCESS_NOT_BUFFERABLE;
    ; u& N. J  @  A, w! J
  68.     MPU_InitStruct.IsCacheable      = MPU_ACCESS_CACHEABLE;. o0 w$ o) D, a/ b7 ]1 r
  69.     MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;
    + s! b& @5 j: S
  70.     MPU_InitStruct.Number           = MPU_REGION_NUMBER3;7 o7 d, E4 |3 f7 M' t
  71.     MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL0;7 d$ y' t% [( Y/ X
  72.     MPU_InitStruct.SubRegionDisable = 0x00;7 X& o4 T6 p+ X( p
  73.     MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;. Q" \% [6 [4 G/ ]* v5 s, v% Y

  74. 1 _5 R0 B/ l( S# D, h3 h3 d" @. V
  75.     HAL_MPU_ConfigRegion(&MPU_InitStruct);
    - r% w- E6 K& @3 I! x7 E
  76. / ?7 b" b3 Z, h  ?9 c

  77. ! C* Q8 p  I: @- m: {
  78.     /* 配置SRAM3的属性为Write through, read allocate,no write allocate */
    % k% q5 o. M4 B  k: M- ]
  79.     MPU_InitStruct.Enable           = MPU_REGION_ENABLE;, \; X+ h! P# Z5 C# P7 Q
  80.     MPU_InitStruct.BaseAddress      = 0x30040000;
    4 c. V7 A- v2 Q, M
  81.     MPU_InitStruct.Size             = ARM_MPU_REGION_SIZE_32KB;        
    / `& m" H8 s% l- y8 ~, k: R
  82.     MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;% Z; ~/ [9 W  w
  83.     MPU_InitStruct.IsBufferable     = MPU_ACCESS_NOT_BUFFERABLE;
    0 H. I+ H: T6 D6 f( k6 N! h& J3 h
  84.     MPU_InitStruct.IsCacheable      = MPU_ACCESS_CACHEABLE;
    0 n0 x1 O7 C, }0 a
  85.     MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;. x% N5 v" P6 |, f( c
  86.     MPU_InitStruct.Number           = MPU_REGION_NUMBER4;3 q( u  p% Z( K4 U
  87.     MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL0;
    0 w( v$ W  v- W9 R
  88.     MPU_InitStruct.SubRegionDisable = 0x00;
    4 i$ [% d& `9 g' v+ N  k  I# d
  89.     MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;( k! ^; v, p' {

  90. & D" K: D" H+ R$ g; K+ x- ]: l
  91.     HAL_MPU_ConfigRegion(&MPU_InitStruct);: o: X! X: H: ]0 U
  92.         7 Z5 R7 {+ [* }6 g$ x8 u0 u' ?1 {
  93.         
    3 p$ t( v& V9 ^  A2 m) N: K* B2 u) t
  94.         /* 配置SRAM4的属性为Write through, read allocate,no write allocate */
    ' h- w3 T  G; {) O
  95.     MPU_InitStruct.Enable           = MPU_REGION_ENABLE;
    # }# t( i2 F% m# r
  96.     MPU_InitStruct.BaseAddress      = 0x38000000;
    : h5 v$ x: b' ^8 J4 e6 b
  97.     MPU_InitStruct.Size             = ARM_MPU_REGION_SIZE_64KB;        # t: T* y1 r7 ]) f" x
  98.     MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
    & W. ], H: r, G4 a, A) _% B
  99.     MPU_InitStruct.IsBufferable     = MPU_ACCESS_NOT_BUFFERABLE;
    $ F; V& S( A0 J: v2 r/ R6 y8 V" O) j
  100.     MPU_InitStruct.IsCacheable      = MPU_ACCESS_CACHEABLE;/ ^: V1 u( @/ t
  101.     MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;% }; W1 S* o% V9 X% i$ E  T; E8 u) I
  102.     MPU_InitStruct.Number           = MPU_REGION_NUMBER5;
    2 w7 p8 Y+ p% |1 b! @
  103.     MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL0;
    8 k$ n4 g5 q- V  c" k% z
  104.     MPU_InitStruct.SubRegionDisable = 0x00;- Y6 @% `5 E1 {% l& t
  105.     MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;
    7 O) F5 o/ S% W4 n# }
  106. # y( `2 ?) }. T% A& q# j
  107.     HAL_MPU_ConfigRegion(&MPU_InitStruct);
      q( j( X0 Y8 N3 ^& N! N; f
  108.         
    + |2 f6 S$ m! |
  109.         /*使能 MPU */
      w2 I% G7 B( E4 E) L4 e# j- i' i6 c; u
  110.         HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);3 }' \2 r! b) I1 p1 d" C& X
  111. }$ e2 l# ]/ e; o- W

  112. 6 h; O7 D% @. R9 V8 \
  113. /*" d/ E* E) N( W' F. i5 L! W' e
  114. *********************************************************************************************************
    % l' ]6 m5 U8 ~# g9 n+ X9 J) ~& |
  115. *        函 数 名: CPU_CACHE_Enable
    ; l! N! I6 a; G7 u& V7 P9 b; ^8 o
  116. *        功能说明: 使能L1 Cache9 P/ E9 e! f4 d7 _4 d2 l8 R2 q
  117. *        形    参: 无# W; Z0 l* C& Z: E
  118. *        返 回 值: 无4 g4 s& a8 H: `9 J
  119. *********************************************************************************************************
    4 O3 j: z6 P- }  ]" V7 m# G
  120. */) ~0 `* s- m7 M7 k$ }  B
  121. static void CPU_CACHE_Enable(void)
    " ?5 P) k9 W' p' f& L. T+ K6 l
  122. {
    . f! Y  |7 s4 l% s# e
  123.         /* 使能 I-Cache */
    ; Q% H0 W0 ]; V
  124.         SCB_EnableICache();
    4 m# c2 ]; j- s! W* Q; j8 G

  125. # Q+ a0 S, @0 z% w
  126.         /* 使能 D-Cache */% j& E% p* S! W; R0 R
  127.         SCB_EnableDCache();- d; M3 g: m! C
  128. }
复制代码

  z% H. [& H% k/ P2 \, O$ \1 _  主功能:
6 ^; H& k7 u2 w  N
* ^5 m* N3 i: `1 w5 J$ b; ~主程序实现如下操作:+ j( O( Q4 w( n' \2 `6 R, _% w
" L1 B: c. [# I6 j: U
  启动自动重装软件定时器0,每100ms翻转一次LED2。7 s5 |6 k  u' [* I
  K1键按下,从DTCM依次申请280字节,64字节和6111字节。
: e1 t! K% r, [  K1键松开,释放从DTCM申请的空间。/ b, w! |8 r! U& ^' A9 i  P
  K2键按下,从AXI SRAM依次申请160字节,32字节和2333字节。: a, e7 v8 x5 F+ W
  K2键松开,释放从AXI SRAM申请的空间。
: E1 E5 T( N2 S; l: ]4 |8 P/ H! |  o  K3键按下,从D2域SRAM依次申请200字节,96字节和4111字节。
/ v  V2 i: f0 F9 l9 F$ C  K3键松开,释放从D2域SRAM申请的空间。8 }8 x8 d# Q/ l" A( s  d% y1 K
  摇杆OK键按下,从D3域SRAM依次申请300字节,128字节和5111字节。
/ @" i1 |# Q8 l: ^7 S4 V  摇杆OK键松开,释放从D3域SRAM申请的空间。
+ _* f' o) \( n/ j5 d. n/ ]
  1. /*- E1 p) m* m7 L& h( r: H
  2. *********************************************************************************************************
    # o: u) V: w9 j! L8 A
  3. *        函 数 名: main
    3 m! F9 ~5 K2 u4 t. n
  4. *        功能说明: c程序入口( h% {1 `- `# f
  5. *        形    参: 无
    * {  X1 ~1 ^' ]& [0 C
  6. *        返 回 值: 错误代码(无需处理)
    - ~8 G* n6 T; k' }
  7. *********************************************************************************************************$ A# f" T; c6 C  c- n( n0 d  O
  8. */
    1 n8 l3 c$ S$ r- h7 @
  9. int main(void)' V  c( Q7 k/ v, A; q# d/ n
  10. {
    * C: W; {; ?! j6 q: n2 G* v4 B. f
  11.         uint8_t ucKeyCode;                /* 按键代码 */
    6 E* `# C  O: V: p
  12.         uint32_t *DTCM_Addres0, *AXISRAM_Addres0, *SRAM1_Addres0, *SRAM4_Addres0;' D9 N9 |  [% o
  13.         uint16_t *DTCM_Addres1, *AXISRAM_Addres1, *SRAM1_Addres1, *SRAM4_Addres1;. D  u6 c5 U4 \, }
  14.         uint8_t  *DTCM_Addres2, *AXISRAM_Addres2, *SRAM1_Addres2, *SRAM4_Addres2;* A* ?3 A1 ~6 j  L& j6 |
  15. 3 g# g% A; {4 w( ?& [9 R* r: F
  16. 0 }6 T; f7 G' ^% V* O7 x. c
  17.         bsp_Init();                /* 硬件初始化 */
    + E2 s9 c  @& c3 a( Q2 X
  18.         
      l5 U5 Y" ^+ ]4 i
  19.         /* 初始化动态内存空间 */
    0 w; H* H8 J; e6 u0 o
  20.         osRtxMemoryInit(AppMallocDTCM,    sizeof(AppMallocDTCM));( x/ r* P+ ~  n/ S
  21.         osRtxMemoryInit(AppMallocAXISRAM, sizeof(AppMallocAXISRAM));4 g% x1 x' j5 q7 S1 J
  22.         osRtxMemoryInit(AppMallocSRAM1,   sizeof(AppMallocSRAM1));
    8 J) R) W; Z9 w2 h- D, v
  23.         osRtxMemoryInit(AppMallocSRAM4,   sizeof(AppMallocSRAM4));' i. D: M) d( H3 m
  24.         
    ( i1 \% _7 q9 S3 k' B/ P
  25.         PrintfLogo();        /* 打印例程名称和版本等信息 */2 x2 P4 ?; S+ ?' U
  26.         PrintfHelp();        /* 打印操作提示 */
    3 `6 X* i/ |+ d* {+ p: q8 R% ^
  27. / e* H' Q- F- Q' p9 r( e2 D
  28.         bsp_StartAutoTimer(0, 100);        /* 启动1个100ms的自动重装的定时器 */
    0 V) R" L% e/ w( {
  29.         , j3 Z) V  `; w3 b& D
  30. - n' A# Y( Z5 o: x
  31.         /* 进入主程序循环体 */
    8 o: J* c7 b" g4 ~: X
  32.         while (1)8 [7 i% }- G: ?0 z
  33.         {
    $ m( C) [; ^, g6 w
  34.                 bsp_Idle();                /* 这个函数在bsp.c文件。用户可以修改这个函数实现CPU休眠和喂狗 */
    8 B1 ~( Y, U! h

  35. 3 w! W: \: O+ Y4 e8 C! q) p
  36.                 /* 判断定时器超时时间 */
    7 k- y" D" K' {  g" g% I+ j
  37.                 if (bsp_CheckTimer(0))        4 p4 P- B$ L' `
  38.                 {
    1 R1 L* W7 @2 B6 r: T' Q! X  \
  39.                         /* 每隔100ms 进来一次 */  ( r' L$ i4 Y; Q" p% B
  40.                         bsp_LedToggle(2);! z$ }/ Z! T$ }
  41.                 }
    ( L+ ?6 g6 v* B0 \' ~

  42. 6 Y2 n, I6 k! {  X( W' |
  43.                 /* 按键滤波和检测由后台systick中断服务程序实现,我们只需要调用bsp_GetKey读取键值即可。 */
    3 J- V+ Z4 h8 R8 J/ n
  44.                 ucKeyCode = bsp_GetKey();        /* 读取键值, 无键按下时返回 KEY_NONE = 0 */
    # P9 T9 j, D" r3 L: R
  45.                 if (ucKeyCode != KEY_NONE)/ t' J& ?4 o. o6 F8 k
  46.                 {
    1 h) }$ j; @$ Y1 B4 k. X, V! d+ Q
  47.                         switch (ucKeyCode)
    + j4 O2 Q9 T  c  C* M5 K
  48.                         {! J) _  c0 p6 a3 q) x
  49.                 /* 从DTCM依次申请280字节,64字节和6111字节 */
    4 {0 P% D& ]5 d6 }6 p4 d
  50.                                 case KEY_DOWN_K1:        " k! o* y0 E& E, w& H3 c5 y& M
  51.                     /* 从DTCM申请280字节空间,使用指针变量DTCM_Addres0操作这些空间时不要超过280字节大小 */
    , I% J/ r" h9 m
  52.                                         printf("=========================================================\r\n");
    ' \) F4 ~& U6 M. a, \
  53.                                         DTCM_Addres0 = osRtxMemoryAlloc(AppMallocDTCM, 280, 0);( ^" C0 _, G6 e6 D
  54.                                         DTCMUsed = MemHeadPtr(AppMallocDTCM);
    2 c; H6 a' A8 |3 \$ F4 ~- j) e
  55.                                         printf("DTCM总大小 = %d字节,申请大小 = 0280字节,当前共使用大小 = %d字节\r\n", ' |; B$ q9 J! n" }* ]
  56.                                                                                 DTCMUsed->size, DTCMUsed->used);5 e8 C3 ^( a; o8 l$ Z5 m
  57.                                 5 p/ W  j: \+ W9 F; U
  58.                         /* 从DTCM申请64字节空间,使用指针变量DTCM_Addres1操作这些空间时不要超过64字节大小 */        7 K& {. N- E0 l9 g
  59.                                         DTCM_Addres1 = osRtxMemoryAlloc(AppMallocDTCM, 64, 0);# e8 G/ U& c  E5 l% }' I
  60.                                         DTCMUsed = MemHeadPtr(AppMallocDTCM);
    : p4 d! i& ?5 o
  61.                                         printf("DTCM总大小 = %d字节,申请大小 = 0064字节,当前共使用大小 = %d字节\r\n",
    ' n& P" j" ^, V% A) L
  62.                                                                                                            DTCMUsed->size, DTCMUsed->used);
    ' L7 ?7 Q9 L7 y5 F# N! a
  63.                                 ; a4 r. l5 v7 r% p# ]
  64.                     /* 从DTCM申请6111字节空间,使用指针变量DTCM_Addres2操作这些空间时不要超过6111字节大小 */
    1 y$ u6 P9 W% ~" H3 R" h  [
  65.                                         DTCM_Addres2 = osRtxMemoryAlloc(AppMallocDTCM, 6111, 0);0 S, K9 r  Z. w  B7 a
  66.                                         DTCMUsed = MemHeadPtr(AppMallocDTCM);
    + o9 v5 f9 B  e6 Y+ S
  67.                                         printf("DTCM总大小 = %d字节,申请大小 = 6111字节,当前共使用大小 = %d字节\r\n", 9 F- G) H* B- t% n
  68.                                                                                 DTCMUsed->size, DTCMUsed->used);
    $ \0 }1 b/ X( i3 \! ?
  69.                                         break;
    , O; S$ Y  ]' |; h
  70.                                 8 H' i/ P, U9 S& w2 D6 o
  71.                                 /* 释放从DTCM申请的空间 */0 D' l  T; K7 A7 Q" l
  72.                                 case KEY_UP_K1:        * b+ H2 u; O+ j9 @7 T. u2 R
  73.                                         /* 释放从DTCM申请的280字节空间 */  m# G8 U# K# r
  74.                                         osRtxMemoryFree(AppMallocDTCM, DTCM_Addres0);
    9 A) g, D; R- v5 M0 S6 W
  75.                                         DTCMUsed = MemHeadPtr(AppMallocDTCM);; x* I- g4 U$ V/ m- ?8 X3 E+ a
  76.                                         printf("释放DTCM动态内存区申请的0280字节,当前共使用大小 = %d字节\r\n",
    ' U9 j2 l: P) E/ r
  77. DTCMUsed->used);2 ?3 V. p- W1 h% t" [7 M" G6 {
  78.                                 6 J! l( ]  o* t& V
  79.                                         /* 释放从DTCM申请的64字节空间 */
    0 U: W4 Q% c/ F$ T- R
  80.                                         osRtxMemoryFree(AppMallocDTCM, DTCM_Addres1);; }( W# d: H* R- ?9 H/ J' c
  81.                                         DTCMUsed = MemHeadPtr(AppMallocDTCM);
    2 D% z! a9 U+ [( Y/ B
  82.                                         printf("释放DTCM动态内存区申请的0064字节,当前共使用大小 = %d字节\r\n",
    & K; V0 Y) g0 X# Z+ j
  83. DTCMUsed->used);
    0 ], L/ @- D3 a4 F; ~
  84.                                 
      V7 B0 o2 A3 g; t* ~
  85.                                         /* 释放从DTCM申请的6111字节空间 */
    0 L) D$ r, \9 J6 v- y) q
  86.                                         osRtxMemoryFree(AppMallocDTCM, DTCM_Addres2);
    $ k' _- Y+ v; U4 e6 `' \; P2 E, G
  87.                                         DTCMUsed = MemHeadPtr(AppMallocDTCM);
    - O8 j9 N2 {% j+ b8 a/ l# h( [3 q
  88.                                         printf("释放DTCM动态内存区申请的6111字节,当前共使用大小 = %d字节\r\n",) x* a7 S, i. z1 o
  89. DTCMUsed->used);% c8 f- U8 m0 G1 M. c- R& x$ O5 U
  90.                                         break;8 G0 T$ J3 {+ ~2 ?9 R
  91.                                 $ g5 W' t0 L% K1 X* `
  92.                                 /* 从AXI SRAM依次申请160字节,32字节和2333字节 */
    - N8 @( m; X2 C: e& F
  93.                                 case KEY_DOWN_K2:        
    - ^" o  x5 E/ M/ c" o/ |" J2 S
  94.             /* 从AXI SRAM 申请160字节空间,使用指针变量AXISRAM_Addres0操作这些空间时不要超过160字节大小 */7 g3 n2 t: i( u/ ]0 ]3 }
  95.                                         printf("=========================================================\r\n");                3 [  \$ L" t6 Y9 k" r" ^
  96.                                         AXISRAM_Addres0 = osRtxMemoryAlloc(AppMallocAXISRAM, 160, 0);! ^: `' R% r7 b; r+ ?7 Q4 _3 i! G
  97.                                         AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);
    : _2 l0 o' Y" u% Z8 X4 K6 K" ]
  98.                                         printf("AXI SRAM总大小 = %d字节,申请大小 = 0162字节,当前共使用大小 = %d字节\r\n",
    3 y: O+ |( y8 o3 G) M6 t$ h
  99.                                                                                 AXISRAMUsed->size, AXISRAMUsed->used);8 s* T6 K; x) p
  100.                                 1 [5 l/ G2 ~& r6 ]6 P
  101.                         /* 从AXI SRAM 申请32字节空间,使用指针变量AXISRAM_Addres1操作这些空间时不要超过32字节大小 */
    ; H; ?  {7 b1 e# n2 p
  102.                                         AXISRAM_Addres1 = osRtxMemoryAlloc(AppMallocAXISRAM, 32, 0);
    & ?/ Y' r, X+ m: I! X. |; K
  103.                                         AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);+ X6 V# n( B7 B8 t. R
  104.                                         printf("AXI SRAM总大小 = %d字节,申请大小 = 0032字节,当前共使用大小 = %d字节\r\n",
    5 E7 \2 [4 K! b# a: T9 ^, N
  105.                                                                                                       AXISRAMUsed->size, AXISRAMUsed->used);
    " X, \0 r4 j+ A2 q! G/ w: Z
  106.                                 7 b5 b8 m) u, o
  107. /* 从AXI SRAM 申请2333字节空间,使用指针变量AXISRAM_Addres2操作这些空间时不要超过2333字节大小 */        
    5 c9 i. U% }! o6 t: B- D  i+ A
  108.                                         AXISRAM_Addres2 = osRtxMemoryAlloc(AppMallocAXISRAM, 2333, 0);' N5 c- k( ^  z5 ?2 \
  109.                                         AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);
    & i& s2 f0 U* O! w6 g& A+ M
  110.                                         printf("AXI SRAM总大小 = %d字节,申请大小 = 2333字节,当前共使用大小 = %d字节\r\n",
    7 ]: [3 [+ v( h( h
  111.                                                                                 AXISRAMUsed->size, AXISRAMUsed->used);7 H8 n. |6 w! L
  112.                                         break;
    ! ?! _' k: y, L/ e
  113.                                 1 P# ~- M, v  p# a2 N3 T
  114.                                 /* 释放从AXI SRAM申请的空间 */
      J! [$ w- C, M+ u
  115.                                 case KEY_UP_K2:        
    # S- s, V! U: K8 n
  116.                                         /* 释放从AXI SRAM申请的160字节空间 */7 y3 P; `) p) o  j
  117.                                         osRtxMemoryFree(AppMallocAXISRAM, AXISRAM_Addres0);
    ; e, J2 ^( `3 B: c- h' S+ Z
  118.                                         AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);
    : u, p% G" K; B5 ]& Q  l8 G; I
  119.                                         printf("释放AXI SRAM动态内存区申请的0160字节,当前共使用大小 = %d字节\r\n",
    / ?# ?1 @+ _- H1 z
  120. AXISRAMUsed->used);
    0 C1 P5 l. d( l: e% E  g9 \4 Y' i2 ^
  121.                                 4 `( g' n* {3 _: k! `# g3 x
  122.                                         /* 释放从AXI SRAM申请的32字节空间 */& a9 \" G( s) x; H) D/ B
  123.                                         osRtxMemoryFree(AppMallocAXISRAM, AXISRAM_Addres1);
    + s. K3 ~( M+ T$ p2 D5 {) |
  124.                                         AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);
    ; p# a& o, B, M# J6 {4 T4 e
  125.                                         printf("释放AXI SRAM动态内存区申请的0032字节,当前共使用大小 = %d字节\r\n",
    $ k- b/ E. s: ?
  126. AXISRAMUsed->used);& E! |) B4 G; n8 @
  127.                                 
    9 z) |- H$ \4 Q% x
  128.                                         /* 释放从AXI SRAM申请的2333字节空间 */
    " [& E- `4 V2 l2 e. N3 m
  129.                                         osRtxMemoryFree(AppMallocAXISRAM, AXISRAM_Addres2);& O: \1 {" W9 A3 d  \
  130.                                         AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);# D* B7 c1 I* Z  J/ @9 L
  131.                                         printf("释放AXI SRAM动态内存区申请的2333字节,当前共使用大小 = %d字节\r\n", . a' o- n' x" c' `1 G: B' w) ^
  132. AXISRAMUsed->used);
    $ F* H4 {- @: k# i- F0 Q: E, F
  133.                                         break;( k; C8 ^+ T* y6 B) g
  134.                                 
    9 n8 _) _1 T5 }
  135.                                 /* 从D2域SRAM依次申请200字节,96字节和4111字节 */
    , `7 Y/ j& ~1 \/ R& K- i
  136.                                 case KEY_DOWN_K3:        
    5 n3 ^  p+ d* F2 W1 H0 p  B, I
  137.         /* 从D2域的SRAM申请200字节空间,使用指针变量SRAM1_Addres0操作这些空间时不要超过200字节大小 */
    8 \6 ?2 l, {) X. e8 _# G7 R. }
  138.                                         printf("=========================================================\r\n");                - o9 z5 C; Q! C* n
  139.                                         SRAM1_Addres0 = osRtxMemoryAlloc(AppMallocSRAM1, 200, 0);
    , D6 z0 x. Z4 }/ Y; \* d, B
  140.                                         SRAM1Used = MemHeadPtr(AppMallocSRAM1);% A" A. n; Z3 O: p  W3 V
  141.                                         printf("D2域SRAM总大小 = %d字节,申请大小 = 0200字节,当前共使用大小 = %d字节\r\n", ) ?% x4 A- P7 D
  142.                                                                                 SRAM1Used->size, SRAM1Used->used);
    % B5 b; i* W. r) C; ]7 ?
  143.                                 6 J! t. F/ i: w5 W, d: R9 D
  144.          /* 从D2域的SRAM申请96字节空间,使用指针变量SRAM1_Addres1操作这些空间时不要超过96字节大小 */        
    1 N5 t0 O  u  s. B, s
  145.                                         SRAM1_Addres1 = osRtxMemoryAlloc(AppMallocSRAM1, 96, 0);
    6 A0 y- s. ^! v; |8 }2 M
  146.                                         SRAM1Used = MemHeadPtr(AppMallocSRAM1);
    4 ]; e7 v7 @! c5 \. l
  147.                                         printf("D2域SRAM总大小 = %d字节,申请大小 = 0096字节,当前共使用大小 = %d字节\r\n",
    : G2 U& Z: J! X
  148.                                                                                                            SRAM1Used->size, SRAM1Used->used);/ M0 ~. Y( p8 G' l& D
  149.                                 ) I3 r8 y! A2 @: J+ E9 e
  150.          /* 从D2域的SRAM申请4111字节空间,使用指针变量SRAM1_Addres2操作这些空间时不要超过4111字节大小 */
    ) N9 [; x0 H# N  A  i# t
  151.                                         SRAM1_Addres2 = osRtxMemoryAlloc(AppMallocSRAM1, 4111, 0);
    - F3 F+ R! D% r+ k3 I0 y
  152.                                         SRAM1Used = MemHeadPtr(AppMallocSRAM1);0 S# }  M: B; Y6 U# ^/ q2 Y* w
  153.                                         printf("D2域SRAM总大小 = %d字节,申请大小 = 4111字节,当前共使用大小 = %d字节\r\n",
    ' c% t4 U7 k! M* ?5 d6 @4 P
  154.                                                                                 SRAM1Used->size, SRAM1Used->used);$ G* S# m1 |2 \
  155.                                         break;
    % U/ v1 T% ], i3 P) L$ R
  156.                                 
    ! o4 m# _# w5 z$ C' P
  157.                                 /* 释放从D2域SRAM申请的空间 */( _- r2 u6 E5 O+ D5 u
  158.                                 case KEY_UP_K3:        
    3 ~/ }2 a) {9 K8 K4 `5 {+ `8 `
  159.                                         /* 释放从D2域的SRAM申请的200字节空间 */4 K, \% ^+ N. p5 B! c5 C8 V
  160.                                         osRtxMemoryFree(AppMallocSRAM1, SRAM1_Addres0);
    2 X$ D( f& s6 Z$ S6 @. ~
  161.                                         SRAM1Used = MemHeadPtr(AppMallocSRAM1);! y  C! j  `$ a+ S3 S' I
  162.                                         printf("释放D2域SRAM动态内存区申请的0200字节,当前共使用大小 = %d字节\r\n",
    1 y8 V, O# ^  p7 U
  163. SRAM1Used->used);, }1 X2 V5 {2 l: {: e0 G
  164.                                 
    - j7 I/ Y# k- |9 B4 ]/ q9 o
  165.                                         /* 释放从D2域的SRAM申请的96字节空间 */
    % S- }' Y7 \7 |& h! _
  166.                                         osRtxMemoryFree(AppMallocSRAM1, SRAM1_Addres1);
    3 E7 ?* Z& n. z0 k2 R
  167.                                         SRAM1Used = MemHeadPtr(AppMallocSRAM1);' w7 N; H6 a* w* j6 X
  168.                                         printf("释放D2域SRAM动态内存区申请的0096字节,当前共使用大小 = %d字节\r\n",
    & g0 u/ f$ g0 b! K* c$ [2 r
  169. SRAM1Used->used);) Q! f1 S2 F( j" p; S8 E
  170.                                 
    2 f1 {5 f9 N1 u3 B
  171.                                         /* 释放从D2域的SRAM申请的4111字节空间 */' I; x1 C7 H& G; P- l
  172.                                         osRtxMemoryFree(AppMallocSRAM1, SRAM1_Addres2);9 }1 B! M2 p9 S! F# C: w. ?' F
  173.                                         SRAM1Used = MemHeadPtr(AppMallocSRAM1);
    8 R+ ^2 [( L" R+ G8 m8 ^9 _. U  {
  174.                                         printf("释放D2域SRAM动态内存区申请的4111字节,当前共使用大小 = %d字节\r\n"," F( z0 ]# p! K0 H
  175. SRAM1Used->used);. t8 z) X) M4 B- J% F5 z% t( L$ F4 Y
  176.                                         break;
    ( e% i, ~0 L1 j% j: \! s
  177.                                 
    3 Y1 a+ Z6 m! q. x/ W: F. y  a
  178.                                 /* 从D3域SRAM依次申请300字节,128字节和5111字节 */
    * @2 }. _5 o+ i1 d
  179.                                 case JOY_DOWN_OK:        
    " r: u) q7 ?) N
  180.             /* 从D3域的SRAM申请300字节空间,使用指针变量SRAM4_Addres0操作这些空间时不要超过300字节大小 */
    5 m! O: A( F9 g/ c( s
  181.                                         printf("=========================================================\r\n");               
    3 a0 D, Z( \/ Y9 I0 ?& |2 M
  182.                                         SRAM4_Addres0 = osRtxMemoryAlloc(AppMallocSRAM4, 300, 0);
    $ P* k8 q0 p, q
  183.                                         SRAM4Used = MemHeadPtr(AppMallocSRAM4);
    ! ~8 i9 f/ H& s( q0 ?1 U4 K
  184.                                         printf("D3域SRAM总大小 = %d字节,申请大小 = 0300字节,当前共使用大小 = %d字节\r\n",
    $ y+ X  L2 ?% s3 a% _
  185.                                                                                 SRAM4Used->size, SRAM4Used->used);, m4 R# P( C+ |/ ^* ?! ~; P- z
  186.                                 - {! `# t0 n0 o% t
  187.                 /* 从D3域的SRAM申请96字节空间,使用指针变量SRAM4_Addres1操作这些空间时不要超过96字节大小 */. @/ o! n; \; E& W' h
  188.                                         SRAM4_Addres1 = osRtxMemoryAlloc(AppMallocSRAM4, 128, 0);) r' Z' r8 x7 h9 I
  189.                                         SRAM4Used = MemHeadPtr(AppMallocSRAM4);
    0 P+ n5 ^8 w. e" E3 v& G8 F: z& ~
  190.                                         printf("D3域SRAM总大小 = %d字节,申请大小 = 0128字节,当前共使用大小 = %d字节\r\n", * A. T9 @6 o7 a% j
  191.                                                                                                            SRAM4Used->size, SRAM4Used->used);
    $ R/ u( w0 }# O4 S. t- G6 c
  192.                                 ; c/ v: l: g/ |, s- q( X( [# Q' N' J7 J
  193.         /* 从D3域的SRAM申请5111字节空间,使用指针变量SRAM4_Addres2操作这些空间时不要超过5111字节大小 */4 C# h! H6 X+ n  ]& ~9 \
  194.                                         SRAM4_Addres2 = osRtxMemoryAlloc(AppMallocSRAM4, 5111, 0);& ?' T) c& K" }2 Y) J- }+ I/ L
  195.                                         SRAM4Used = MemHeadPtr(AppMallocSRAM4);; S7 h( Y0 Y2 P- b4 j3 H! |
  196.                                         printf("D3域SRAM总大小 = %d字节,申请大小 = 5111字节,当前共使用大小 = %d字节\r\n",
    ( c4 _/ {$ ?1 a' Z
  197.                                                                                 SRAM4Used->size, SRAM4Used->used);
    6 ^! s! H: f1 O3 |- B
  198.                                         break;
    ; H( U$ p  d% C4 X8 c+ D$ N
  199.                                 
    9 x! h8 h% }2 S
  200.                                 /* 释放从D3域SRAM申请的空间 */1 F; h+ u9 k, t' D% C& }% f! w
  201.                                 case JOY_UP_OK:        
    / q2 p, V2 ~# G
  202.                                         /* 释放从D3域的SRAM申请的300字节空间 */
    2 w1 Z! p1 Q* x6 n2 i
  203.                                         osRtxMemoryFree(AppMallocSRAM4, SRAM4_Addres0);+ |0 O) I. B8 \
  204.                                         SRAM4Used = MemHeadPtr(AppMallocSRAM4);, g# R$ m0 n. M1 l* V8 a
  205.                                         printf("释放D3域SRAM动态内存区申请的0300字节,当前共使用大小 = %d字节\r\n", # O& k9 R$ o0 q6 I* _
  206. SRAM4Used->used);( q3 O2 r" s. Z, O. P
  207.                                 
    ; j6 n; ^3 g* B- R" a
  208.                                         /* 释放从D3域的SRAM申请的128字节空间 */
    & ~9 ^8 j6 ~# K) x, Z. b5 Z
  209.                                         osRtxMemoryFree(AppMallocSRAM4, SRAM4_Addres1);
    4 R! Q' R* c9 K% o
  210.                                         SRAM4Used = MemHeadPtr(AppMallocSRAM4);
      _4 x6 y+ u8 N0 m: }- }
  211.                                         printf("释放D3域SRAM动态内存区申请的0128字节,当前共使用大小 = %d字节\r\n",4 p0 U$ F' z; O4 {  z; A
  212. SRAM4Used->used);" {9 |5 Q, q4 {3 ^
  213.                                 1 ?' |2 P. g# P1 A% P
  214.                                         /* 释放从D3域的SRAM申请的5111字节空间 */& c3 W" h1 n# S1 F
  215.                                         osRtxMemoryFree(AppMallocSRAM4, SRAM4_Addres2);
    - @% X- x% H3 v' a5 u7 s5 R
  216.                                         SRAM4Used = MemHeadPtr(AppMallocSRAM4);: Q) g1 \+ O# P  C( ]: ^0 n; H
  217.                                         printf("释放D3域SRAM动态内存区申请的5111字节,当前共使用大小 = %d字节\r\n",, m. s5 ?' u( G; \- ~
  218. SRAM4Used->used);
    ( y! C' C( J& c/ P
  219.                                         break;
    0 J- W! T0 |% X2 S: H) b% {) X
  220.                         
    - r) t+ C2 U% w: v% O
  221.                                 default:
    3 E" i. O6 b4 G* h1 U6 m
  222.                                   /* 其它的键值不处理 */
    ! n6 [5 u1 i. Q: K. L* t9 D, ]
  223.                                   break;
    9 h0 b+ Y! S( h$ P; _: q
  224.                         }) c2 {: s. H) D' Q& ~# G
  225.                 }
    ! S7 G) K" I5 `5 A* g
  226.         }- Q8 d- U$ y% K9 F
  227. }
复制代码

. s. Q" k  d5 r7 i5 E/ J27.5 实验例程说明(IAR)4 t* I1 E$ A7 [( v/ ^& P
配套例子:
9 ]  t3 ~& I; [- `2 N& M. i8 |V7-006_TCM,SRAM等五块内存的动态内存分配实现9 y4 A* x4 g. V7 T+ H

# s# q9 s/ v/ U( l6 a实验目的:* o; a' J, \& R9 }8 I- j
学习TCM,SRAM等五块内存的动态内存分配实现。6 J- }5 K% X, R5 Z' C
7 s2 T; M& K8 x+ W/ D  J
+ C( a; A* M! {/ V1 e
实验内容:: G1 x" m# A* y9 Q3 O/ p
启动自动重装软件定时器0,每100ms翻转一次LED2。5 {1 s2 b: J2 M0 X0 o$ Y

6 _; ~' ?; H/ Q  V7 `' l# z  m实验操作:
$ n& Z1 _  O+ z3 PK1键按下,从DTCM依次申请280字节,64字节和6111字节。
, Q, ]6 o$ n: s) j8 d# c6 cK1键松开,释放从DTCM申请的空间。
* x8 x! ?6 W7 ^+ b! N# l6 ZK2键按下,从AXI SRAM依次申请160字节,32字节和2333字节。
+ [% ~5 n) |! Z7 @1 OK2键松开,释放从AXI SRAM申请的空间。* c8 p1 q% R& p3 S/ p
K3键按下,从D2域SRAM依次申请200字节,96字节和4111字节。/ q6 ~9 L; d+ R! Q/ v7 ]
K3键松开,释放从D2域SRAM申请的空间。
. p/ `; r9 e  h$ t摇杆OK键按下,从D3域SRAM依次申请300字节,128字节和5111字节。
. g* y  A/ c' ]1 h% @: z' ?3 p# b! N" b摇杆OK键松开,释放从D3域SRAM申请的空间。1 y; S! M7 r* O) y3 w9 A1 e
: U: ^4 |7 \! |% w8 ?
上电后串口打印的信息:- P5 I2 w1 S# u
0 W6 A( {5 P$ n/ Y0 F5 A
波特率 115200,数据位 8,奇偶校验位无,停止位 1( C4 V; }; i# a0 O: l& }

2 V( |! W0 c* T2 A4 l7 H# \
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDcvMTM3OTEwNy0yMDE5.png

3 }2 ?; D9 N4 x' U
5 k7 [3 f& a" O2 T8 u程序设计:
, [0 C) S# g+ S& {  K& P) e
% \5 s# [9 X5 k- p) T$ ^. R  Q; O  系统栈大小分配:& q) b# c1 f* ^# }0 X5 v; j
( T9 \" X/ J- P( x& l! l: ]
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDcvMTM3OTEwNy0yMDE5.png
7 C0 N; M) v& t, H6 {5 q1 `! S

9 y- I% U' Q4 l6 f  V% B  RAM空间用的DTCM:
5 T2 g: z# o3 A# W  E: m
2 d% j9 L. G6 b( T  a' W! m3 _
aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDcvMTM3OTEwNy0yMDE5.png
1 w8 \% N1 i2 k. Z: Y& F5 i  J& u* ^

. c% a) g# A$ A& g* L  硬件外设初始化
; c& I7 O  @' c7 v$ z. r

# v, S" \# Q- H4 c/ Z硬件外设的初始化是在 bsp.c 文件实现:8 M/ s3 T7 [6 c6 H3 ]5 U
& i- n$ l3 b: b6 Z
  1. /*, d# @  z2 B6 [4 N( }. R' S, q
  2. *********************************************************************************************************
    9 l4 j7 c" z6 e6 X! i
  3. *        函 数 名: bsp_Init
    * b9 I  w: _5 [" H: ~1 @
  4. *        功能说明: 初始化所有的硬件设备。该函数配置CPU寄存器和外设的寄存器并初始化一些全局变量。只需要调用一次
    ( v  O6 i; i, k& m- `
  5. *        形    参:无- r7 i+ r! Z) h7 C1 K, q
  6. *        返 回 值: 无
    5 U% c8 _0 r5 g2 t) t( h6 k% {/ Z
  7. *********************************************************************************************************
    2 q3 D0 z6 p( {! c5 d9 q0 M) {0 m
  8. */
    & x/ @/ P' b. R1 t
  9. void bsp_Init(void)
    % j8 f7 a3 \! |" o7 @9 ^6 j$ m
  10. {
    ' y2 y, B" h- N* E
  11.     /* 配置MPU */
    7 @* ?+ K  ^- j9 P* K1 B
  12.         MPU_Config();
      z/ J* b. Z" q. J+ K& G; V/ E7 p4 y
  13.         
    9 Y) }7 C' n( _
  14.         /* 使能L1 Cache */
    % ]  o+ {& o6 P" `2 Y
  15.         CPU_CACHE_Enable();- k/ t3 i) t7 @% G+ `
  16. / f  c& R' R' I
  17.         /* ) B, E3 `% k" J. r. T
  18.        STM32H7xx HAL 库初始化,此时系统用的还是H7自带的64MHz,HSI时钟:+ \9 n5 W7 E* K. ~& ?0 o2 _
  19.            - 调用函数HAL_InitTick,初始化滴答时钟中断1ms。5 t3 b3 |, |+ F. k
  20.            - 设置NVIV优先级分组为4。7 `0 Y- R% \  n) \- s
  21.          */; ?8 n$ K5 S, L$ X, _2 E" Y
  22.         HAL_Init();
    1 w  c- C7 c# _9 Q5 s  b
  23. 0 ]+ b+ T2 B3 P
  24.         /*
    , k/ e' ?. f# |. n2 B  T
  25.        配置系统时钟到400MHz
    ! L: u( H% s6 B* k: e/ A. \
  26.        - 切换使用HSE。
    . m' i2 v$ a/ L2 h3 u$ {- g, d, s" d
  27.        - 此函数会更新全局变量SystemCoreClock,并重新配置HAL_InitTick。6 X) z5 Q( B5 U& @* X/ R: E: x
  28.     */
    5 N8 N- g* P! p- J. t; c" h
  29.         SystemClock_Config();
    ( `+ w- K- e5 `8 ^

  30. 6 a4 \# F9 T! B
  31.         /* 2 g) y1 P0 a: {# F& D8 r3 B
  32.            Event Recorder:
    2 d0 l5 m, c3 `
  33.            - 可用于代码执行时间测量,MDK5.25及其以上版本才支持,IAR不支持。
    ; t! T9 D$ O2 k2 M% Q. D+ j5 o9 R
  34.            - 默认不开启,如果要使能此选项,务必看V7开发板用户手册第xx章6 a/ Y. L) D) y# b# t
  35.         */        
    ! p6 Y: ?( I0 A7 \" g4 G* h
  36. #if Enable_EventRecorder == 1  5 l$ }2 f6 @& o. x( S2 D
  37.         /* 初始化EventRecorder并开启 */- C7 e# `9 X, o6 n
  38.         EventRecorderInitialize(EventRecordAll, 1U);
    * o* U& V; g, p9 }  ?8 t
  39.         EventRecorderStart();
    " ~  W& }8 X! C  m) R
  40. #endif
    ) T* `4 Z) K1 I; G0 p$ S7 @+ T
  41.         
    * J+ ^0 Z8 W+ T  @5 I& J
  42.         bsp_InitKey();            /* 按键初始化,要放在滴答定时器之前,因为按钮检测是通过滴答定时器扫描 */8 A( k/ h) R; s
  43.         bsp_InitTimer();          /* 初始化滴答定时器 */
    2 C) W) j+ C9 ~4 [/ y+ t
  44.         bsp_InitUart();        /* 初始化串口 */3 Y- P  E  T6 x
  45.         bsp_InitExtIO();        /* 初始化FMC总线74HC574扩展IO. 必须在 bsp_InitLed()前执行 */        8 r5 ?  O6 l' F' e7 w
  46.         bsp_InitLed();            /* 初始化LED */        2 R( a# u- h" s
  47. }
复制代码

2 v" R1 c+ {' |! Z2 Y  MPU配置和Cache配置:
. m1 o, i) Z' Y. U0 u* p
* O+ e$ n0 N4 W$ y* v2 s) E- X
数据Cache和指令Cache都开启。% V, s* e6 b' T+ K3 u% c

9 h5 ^5 Q4 n0 L( }4 z  J/ O4 MAXI SRAM的MPU属性:$ c& L# {" j7 D  C
, k( ~8 Q3 X- `: |: F+ J+ {, K
Write back, Read allocate,Write allocate。- T1 [- o* r8 s2 T7 B( C
# J+ d* A% s% L$ c( _8 S
FMC的扩展IO的MPU属性:
; E1 ~; {7 C) _" D6 T$ n
7 S+ `# {: `% l8 B+ g  A必须Device或者Strongly Ordered。+ `7 \& Z* A; X
3 W' W- H5 O: H! k
D2 SRAM1,SRAM2和SRAM3的MPU属性:
' y/ Y$ v  N( g+ l2 w4 d! g4 i; Q1 [; r$ C6 ~1 W* O# M4 |
Write through, read allocate,no write allocate。' m5 r* v" L# a; i0 _8 F

* \; t  L7 P& W. R- G" YD3 SRAM4的MPU属性:# ^! q" j' q5 a1 T* g: i" Q

$ w8 M% Q) u# LWrite through, read allocate,no write allocate。
$ d  g& g. S5 G/ j9 J% @+ t" V7 U3 x2 a) A) o# A% [9 u
  1. /*) h- t4 g( w0 p  R: X9 J) M
  2. *********************************************************************************************************
    7 o0 P1 h* Z' |3 b
  3. *        函 数 名: MPU_Config
    ; W/ \* ^- y8 ]1 g  }
  4. *        功能说明: 配置MPU3 m- n* }0 Q/ F* \" ]. q' a/ l
  5. *        形    参: 无! n* w. W% ^9 X, z5 P9 V( B
  6. *        返 回 值: 无
    7 M% Z  k! D: x) k- o  Q- t! Q
  7. *********************************************************************************************************' ^0 Z2 I0 g) l( G+ ~$ A
  8. */
    1 Z: N3 ]4 ^2 `& W1 A8 ^
  9. static void MPU_Config( void )
    - O: B; d8 O1 n: w+ [7 ~5 J* Z
  10. {% D% U* r# x" e4 S
  11.         MPU_Region_InitTypeDef MPU_InitStruct;
      P* q$ D( @% H/ e
  12. + R. V8 i! K. _  p/ g
  13.         /* 禁止 MPU */: }& a1 k$ F9 B, ?- l4 x% U% n
  14.         HAL_MPU_Disable();
    " m4 T" Z5 {' ]1 z4 P% @# }' t; U

  15. . d1 M" t) T- G/ F0 h
  16.         /* 配置AXI SRAM的MPU属性为Write back, Read allocate,Write allocate */+ a0 ?/ \; z) I- x! N2 F$ p
  17.         MPU_InitStruct.Enable           = MPU_REGION_ENABLE;
    # `. D4 C, r4 R2 }& D. P3 y; ^
  18.         MPU_InitStruct.BaseAddress      = 0x24000000;
    ( i+ V. x, @7 }  Q) d  [, }
  19.         MPU_InitStruct.Size             = MPU_REGION_SIZE_512KB;
    5 S" a# X3 `5 }
  20.         MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;5 J3 r0 f; \3 v9 ~7 [: X
  21.         MPU_InitStruct.IsBufferable     = MPU_ACCESS_BUFFERABLE;
    % F! @6 H+ ?8 G% ~( n8 R  \
  22.         MPU_InitStruct.IsCacheable      = MPU_ACCESS_CACHEABLE;
    ( E+ b5 C- p5 R+ W# h1 e
  23.         MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;
    , D& k, i, b1 s
  24.         MPU_InitStruct.Number           = MPU_REGION_NUMBER0;) v2 Q, L: i$ A( |4 I9 [
  25.         MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL1;
    0 z0 w( P/ s! r( d% F9 }
  26.         MPU_InitStruct.SubRegionDisable = 0x00;
    , v  o4 F, F2 X+ N* r( y4 C
  27.         MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;& ^: y6 Q( G6 H( I. V+ a
  28. & f6 M! r3 P# y- [5 y7 S
  29.         HAL_MPU_ConfigRegion(&MPU_InitStruct);
    . X$ n" X) A' i0 o( M/ c
  30.         ! u& ?$ w1 A2 S% u1 l) h
  31.         
    * l* F- u$ x% b2 o4 q* P
  32.         /* 配置FMC扩展IO的MPU属性为Device或者Strongly Ordered */# |* y8 a2 s6 S' E; [
  33.         MPU_InitStruct.Enable           = MPU_REGION_ENABLE;
    ; ^& Y9 Y6 a/ h
  34.         MPU_InitStruct.BaseAddress      = 0x60000000;
    - V) _# u& l8 `) T- {  F
  35.         MPU_InitStruct.Size             = ARM_MPU_REGION_SIZE_64KB;        
    ; {/ S5 K: J  ?6 d( G+ X/ h$ A7 B8 ]
  36.         MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;+ a: N6 I9 Q; t
  37.         MPU_InitStruct.IsBufferable     = MPU_ACCESS_BUFFERABLE;6 k' U& I, P% e- x3 T4 P! d
  38.         MPU_InitStruct.IsCacheable      = MPU_ACCESS_NOT_CACHEABLE;
    + |/ H9 L$ ?  z' _2 }$ U# A
  39.         MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;+ K# q0 w8 D4 B! i% K
  40.         MPU_InitStruct.Number           = MPU_REGION_NUMBER1;
    % D2 r2 t4 ~/ o& k% L$ j/ O6 g
  41.         MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL0;) I( [  l2 i$ H9 e2 E- z
  42.         MPU_InitStruct.SubRegionDisable = 0x00;
    . a6 f& [1 |  d4 J
  43.         MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;
    1 X2 }2 K" X; J9 ?7 N  }1 g
  44.         
    4 ^# `7 h' u: q, j# e+ q5 o: A; G. G1 U
  45.         HAL_MPU_ConfigRegion(&MPU_InitStruct);
    2 }0 q( r( u! X* b3 Q
  46.         
    : V3 F% c! h$ x" A
  47.         /* 配置SRAM1的属性为Write through, read allocate,no write allocate */
    ( V2 h% m* J' r7 z* O5 X
  48.     MPU_InitStruct.Enable           = MPU_REGION_ENABLE;
    ( v7 |/ [, f3 s' }* {# Y: W
  49.     MPU_InitStruct.BaseAddress      = 0x30000000;9 [, U9 o! z$ B9 E- A% z; c0 b
  50.     MPU_InitStruct.Size             = ARM_MPU_REGION_SIZE_128KB;        
    0 t4 q$ I" X; s5 C0 R
  51.     MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;0 \3 o1 Q! B4 o( z/ g+ p
  52.     MPU_InitStruct.IsBufferable     = MPU_ACCESS_NOT_BUFFERABLE;- v+ w  ~6 Z, k* P1 T- b/ K+ a
  53.     MPU_InitStruct.IsCacheable      = MPU_ACCESS_CACHEABLE;
    9 b) B2 `: T, w  h
  54.     MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;2 S* W% w. q# O
  55.     MPU_InitStruct.Number           = MPU_REGION_NUMBER2;+ Q/ D5 V* k" D
  56.     MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL0;
    & t! S) {/ d4 |( a
  57.     MPU_InitStruct.SubRegionDisable = 0x00;; i6 `, T; V5 t) z  D+ E/ `
  58.     MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;
    ; G7 J  A1 t0 L' h
  59. , k* Z9 G- Z" S3 a' i
  60.     HAL_MPU_ConfigRegion(&MPU_InitStruct);$ I$ R% r# L( a; B' p7 c" J
  61.         
    5 k/ t  E1 ]* ^$ h3 o2 G( x9 t" C% V
  62.         /* 配置SRAM2的属性为Write through, read allocate,no write allocate */
      G- v  P/ L+ @) x* |' I
  63.     MPU_InitStruct.Enable           = MPU_REGION_ENABLE;4 `4 x4 g8 ^* A9 G8 c( T' g6 p
  64.     MPU_InitStruct.BaseAddress      = 0x30020000;& R% J2 C4 y( K) ]6 x1 M5 Y
  65.     MPU_InitStruct.Size             = ARM_MPU_REGION_SIZE_128KB;        
    * w5 m* O' M0 u) c- w5 T' T
  66.     MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
    + r9 Q0 \, F% T/ E$ a* J
  67.     MPU_InitStruct.IsBufferable     = MPU_ACCESS_NOT_BUFFERABLE;% b, t6 q2 e! X5 d" A  T7 h7 X! y
  68.     MPU_InitStruct.IsCacheable      = MPU_ACCESS_CACHEABLE;' `& V. U: B( M& _
  69.     MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;3 D8 b. @0 R+ X' r: U! O# c; Q
  70.     MPU_InitStruct.Number           = MPU_REGION_NUMBER3;  k: J- K3 K9 l+ F6 L9 d- |
  71.     MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL0;
    , l9 Q. J8 O6 G) R
  72.     MPU_InitStruct.SubRegionDisable = 0x00;
    " H8 G+ s: @* J$ E
  73.     MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;1 C6 i: o# B: t3 I

  74. $ y; i! g& w& q# N: c7 O
  75.     HAL_MPU_ConfigRegion(&MPU_InitStruct);9 X$ ]+ ^: q& O5 Y" }4 S6 {
  76. , `" [; q" w; d+ v# ?
  77. 1 A$ l) O2 }1 l8 v4 l: I
  78.     /* 配置SRAM3的属性为Write through, read allocate,no write allocate */
    " |$ m5 @5 Q% d
  79.     MPU_InitStruct.Enable           = MPU_REGION_ENABLE;. c0 B& d- ]. ]0 g4 i8 H4 ~2 c: C, v
  80.     MPU_InitStruct.BaseAddress      = 0x30040000;
    ! d8 b9 G/ P; E4 d
  81.     MPU_InitStruct.Size             = ARM_MPU_REGION_SIZE_32KB;        
    $ ?, e0 S5 |7 C3 D* v/ Z5 D
  82.     MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;6 i8 Q% G# K1 t
  83.     MPU_InitStruct.IsBufferable     = MPU_ACCESS_NOT_BUFFERABLE;- E1 U0 P' e# M( i' ]. q$ R
  84.     MPU_InitStruct.IsCacheable      = MPU_ACCESS_CACHEABLE;5 ]" Q" I7 C8 u6 ?" K
  85.     MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;
    : D6 s6 w* h6 O+ A4 y0 q0 }$ i/ P
  86.     MPU_InitStruct.Number           = MPU_REGION_NUMBER4;! L/ b; p& y* h; \4 S- Z1 P; Q/ w+ C
  87.     MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL0;
    + \0 Y  E& M1 P  r0 i' e8 G
  88.     MPU_InitStruct.SubRegionDisable = 0x00;
    2 ]# f* e3 Y; {8 J. A" C: S
  89.     MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;
    & ^9 [0 I* c5 P

  90. . E! y) B) Y+ U0 a
  91.     HAL_MPU_ConfigRegion(&MPU_InitStruct);
    - w' p+ U  w" G6 i; z
  92.         5 ^0 s) P# M. i! R
  93.         ) x, E1 g% A: O! t) W
  94.         /* 配置SRAM4的属性为Write through, read allocate,no write allocate */
    & q9 j; C5 g! A8 ^' _5 X
  95.     MPU_InitStruct.Enable           = MPU_REGION_ENABLE;& S* h1 W' e3 N
  96.     MPU_InitStruct.BaseAddress      = 0x38000000;. m% O0 {: J* c% U" Z, j
  97.     MPU_InitStruct.Size             = ARM_MPU_REGION_SIZE_64KB;        
    8 G) s. U; y) c: H4 b  Y  Z
  98.     MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
    * z0 f6 T, ~! w9 I
  99.     MPU_InitStruct.IsBufferable     = MPU_ACCESS_NOT_BUFFERABLE;
    , w5 o- r4 ~2 Y7 E; B) A6 I% o
  100.     MPU_InitStruct.IsCacheable      = MPU_ACCESS_CACHEABLE;  |9 i/ I, m2 r1 d& W& e( ^
  101.     MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;
      O3 g) G! i# X1 ?5 D
  102.     MPU_InitStruct.Number           = MPU_REGION_NUMBER5;
    - F; u% r( y/ P5 `: a; {
  103.     MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL0;& }5 n4 }7 C4 _( D8 `  l3 u+ V7 J$ e
  104.     MPU_InitStruct.SubRegionDisable = 0x00;9 t/ y- `/ M" m/ L1 j. f) M6 R
  105.     MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;
    % Y2 b- T" e6 S, x- K
  106. ' H; q3 B9 G0 l5 r, ]2 Y9 l
  107.     HAL_MPU_ConfigRegion(&MPU_InitStruct);6 X1 g) ]5 _9 t
  108.         
    / T8 {8 o# i, N. }& G
  109.         /*使能 MPU */9 ?- I9 L6 K  }: m2 K6 V2 @6 j9 O
  110.         HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);
      z+ Q: P& C; `0 b9 R
  111. }3 B5 I# _" v  p* U

  112. : I: X. Y% F2 p* H
  113. /*) \4 P0 v/ p4 n' s
  114. *********************************************************************************************************
    4 o( m9 \/ x/ S: k- j8 U( }
  115. *        函 数 名: CPU_CACHE_Enable9 q& v6 n7 i0 c$ s' r( y7 Y
  116. *        功能说明: 使能L1 Cache
    . g4 s! D- `/ _; m
  117. *        形    参: 无3 D( H  i" M/ t# r; h1 w
  118. *        返 回 值: 无; X+ P  g4 |, U6 Q
  119. *********************************************************************************************************- k6 y1 G* f1 O& B+ m6 N
  120. */
    ; q6 i: @6 e! S. I% w- `
  121. static void CPU_CACHE_Enable(void); N8 D. X* g: n/ a" e
  122. {
    9 U, j& T9 [5 {5 d8 V- T. _
  123.         /* 使能 I-Cache */
    6 }9 r: f0 @- e/ s2 Z
  124.         SCB_EnableICache();9 X, T: a: n6 D( }6 `

  125. * w" ^1 T" _" y+ E
  126.         /* 使能 D-Cache */
    4 l, y8 n0 c1 f' D# N, r
  127.         SCB_EnableDCache();
    0 u) o# Y4 ]4 b2 U2 u: d
  128. }
复制代码
9 Y' e( }+ V, q' x2 g
  主功能:
" q3 g( s9 M6 T1 M! t. O# c% H' Q! w* H/ m$ M( q# K. j
主程序实现如下操作:
2 k% B: c3 B" X; m/ w5 k( X4 T$ |/ @) B
% f1 w9 B  H7 b3 M1 p1 {8 y  启动自动重装软件定时器0,每100ms翻转一次LED2。
4 v; o6 n! B( n$ L7 u" C  K1键按下,从DTCM依次申请280字节,64字节和6111字节。
0 i5 ^" x) m4 s- v$ k% f, J% {  K1键松开,释放从DTCM申请的空间。
- ^) f. o0 D8 Z6 `- i  K2键按下,从AXI SRAM依次申请160字节,32字节和2333字节。( _. q. P0 w# a; V1 T7 ^' o% m
  K2键松开,释放从AXI SRAM申请的空间。! u, e- K" b2 u: L2 G. L6 r
  K3键按下,从D2域SRAM依次申请200字节,96字节和4111字节。+ H3 d% n$ r) x8 V0 n  }7 E
  K3键松开,释放从D2域SRAM申请的空间。
: J+ B0 l/ D, K  摇杆OK键按下,从D3域SRAM依次申请300字节,128字节和5111字节。
! y( y& I9 N* C, H6 J  摇杆OK键松开,释放从D3域SRAM申请的空间。
! n$ t4 }) ]2 o$ |  [. J! g& Y
  1. /** ^3 I0 A& ^8 o; n9 Y
  2. *********************************************************************************************************
    - X- b9 G& |" }3 b
  3. *        函 数 名: main# {/ c: r6 w) E  }# a3 @6 J- F
  4. *        功能说明: c程序入口
    3 @/ u% n4 {6 t2 o! f9 M: |* |& |7 d
  5. *        形    参: 无
    , n. b# W3 n5 x. @6 ?3 S
  6. *        返 回 值: 错误代码(无需处理)
    4 _5 H4 s5 A. b
  7. *********************************************************************************************************2 I+ [) r& t9 f3 Y; j: p
  8. */
    7 h5 T  J( D4 l8 b
  9. int main(void)
    8 s6 ^7 G, i- U3 l0 ?& h
  10. {
    ) l" |& x: N. }2 T
  11.         uint8_t ucKeyCode;                /* 按键代码 */
    9 {- C  o( W, t* w, R
  12.         uint32_t *DTCM_Addres0, *AXISRAM_Addres0, *SRAM1_Addres0, *SRAM4_Addres0;
    & y7 j8 M7 O8 e2 ?8 n
  13.         uint16_t *DTCM_Addres1, *AXISRAM_Addres1, *SRAM1_Addres1, *SRAM4_Addres1;
    ; j1 b! Z0 Z& S4 }9 a
  14.         uint8_t  *DTCM_Addres2, *AXISRAM_Addres2, *SRAM1_Addres2, *SRAM4_Addres2;) S) I- L7 T9 Q" o
  15. + d: y( V0 r: S$ e' I/ \
  16. % a1 W; u6 _! h* U6 P
  17.         bsp_Init();                /* 硬件初始化 */
    6 ~. G# j( o  e+ o8 d- @8 `7 r
  18.         ' t( \. W6 f' g! |- {3 d. w
  19.         /* 初始化动态内存空间 */' [8 Z) M7 L$ ]. K
  20.         osRtxMemoryInit(AppMallocDTCM,    sizeof(AppMallocDTCM));! s. E/ [1 x" `' x
  21.         osRtxMemoryInit(AppMallocAXISRAM, sizeof(AppMallocAXISRAM));. N* l1 t4 n7 I$ m! _% }- M
  22.         osRtxMemoryInit(AppMallocSRAM1,   sizeof(AppMallocSRAM1));
    + Y5 q) A  d4 Q$ L% v0 G- ~+ {
  23.         osRtxMemoryInit(AppMallocSRAM4,   sizeof(AppMallocSRAM4));% \9 q/ I( s0 s( d) k0 R% T
  24.         
    $ ]* ~7 J/ g1 F! }+ c. D1 U
  25.         PrintfLogo();        /* 打印例程名称和版本等信息 */
    7 [7 ?8 A! x" L: d. p6 u+ `
  26.         PrintfHelp();        /* 打印操作提示 */+ s2 w9 Z4 r- ^

  27. " r5 \/ d% f/ U4 j
  28.         bsp_StartAutoTimer(0, 100);        /* 启动1个100ms的自动重装的定时器 */
    ' z. x4 E2 D5 H& f& d! V
  29.         : B9 ]4 d! V5 O: K! Q

  30. 3 G3 Z. m3 Z. \, m
  31.         /* 进入主程序循环体 */# d3 \/ R7 i! A: e9 {  r
  32.         while (1)& K  g- l$ g4 }
  33.         {, a2 _& U  r+ V$ }" F2 X
  34.                 bsp_Idle();                /* 这个函数在bsp.c文件。用户可以修改这个函数实现CPU休眠和喂狗 */
    ' }' e1 y4 K2 d) P! ], G
  35. & P. E* I' c  g# N/ `5 i
  36.                 /* 判断定时器超时时间 */
    ) v  ?! }" S4 R1 P9 S0 T
  37.                 if (bsp_CheckTimer(0))        8 l8 E$ b1 p$ t* s& K- w' M
  38.                 {: w6 v; i8 D7 H* g( O) I* s
  39.                         /* 每隔100ms 进来一次 */  
    3 W. j0 J( \$ c7 S' ~
  40.                         bsp_LedToggle(2);8 Q% H5 m7 l" W. r9 a5 U- a0 c# e- y; F
  41.                 }+ Z0 n+ y0 s0 B3 h

  42. 0 f1 J9 D! L2 I
  43.                 /* 按键滤波和检测由后台systick中断服务程序实现,我们只需要调用bsp_GetKey读取键值即可。 */$ m% C3 }9 \' j7 S6 y
  44.                 ucKeyCode = bsp_GetKey();        /* 读取键值, 无键按下时返回 KEY_NONE = 0 */5 E' ]6 P+ W5 l* k" T
  45.                 if (ucKeyCode != KEY_NONE)  }; t" x" D3 l+ n, G
  46.                 {
    7 K$ s0 e: y# P4 S: Y: |; L
  47.                         switch (ucKeyCode)# S: i4 ~! ^; u
  48.                         {
    9 S# u! }/ z  q4 i4 h+ a. p/ f$ y
  49.                 /* 从DTCM依次申请280字节,64字节和6111字节 */
    - f. x$ {2 w: M
  50.                                 case KEY_DOWN_K1:        0 m) @  }5 z, }3 h% S
  51.                     /* 从DTCM申请280字节空间,使用指针变量DTCM_Addres0操作这些空间时不要超过280字节大小 */
    8 m  K2 O! a* n% K$ q; l9 t. O& w
  52.                                         printf("=========================================================\r\n");
    ' j. P; a+ t, S8 S# C. Q
  53.                                         DTCM_Addres0 = osRtxMemoryAlloc(AppMallocDTCM, 280, 0);5 g8 t: X/ |. P, Z2 N4 f
  54.                                         DTCMUsed = MemHeadPtr(AppMallocDTCM);3 R3 h$ x$ [3 n2 q4 M% {4 [: ]! Y
  55.                                         printf("DTCM总大小 = %d字节,申请大小 = 0280字节,当前共使用大小 = %d字节\r\n", 8 i' _' l; y5 W$ S" m3 M
  56.                                                                                 DTCMUsed->size, DTCMUsed->used);) r1 S& l6 k+ I
  57.                                 4 `3 p' |* D" W+ G
  58.                         /* 从DTCM申请64字节空间,使用指针变量DTCM_Addres1操作这些空间时不要超过64字节大小 */        8 a1 G. }' j3 y# p* a6 t
  59.                                         DTCM_Addres1 = osRtxMemoryAlloc(AppMallocDTCM, 64, 0);- N3 h( ]' U6 T+ O8 P
  60.                                         DTCMUsed = MemHeadPtr(AppMallocDTCM);9 P2 W/ }, ^' F2 n
  61.                                         printf("DTCM总大小 = %d字节,申请大小 = 0064字节,当前共使用大小 = %d字节\r\n",
    # n; q8 z+ F5 o1 K1 m
  62.                                                                                                            DTCMUsed->size, DTCMUsed->used);5 r6 X; f8 D; ]
  63.                                 
    ( a/ ^! b* `* o& O- Z" d1 u
  64.                     /* 从DTCM申请6111字节空间,使用指针变量DTCM_Addres2操作这些空间时不要超过6111字节大小 */+ H" {( {3 Z0 `& e
  65.                                         DTCM_Addres2 = osRtxMemoryAlloc(AppMallocDTCM, 6111, 0);
      b; ~$ v6 G! N, M
  66.                                         DTCMUsed = MemHeadPtr(AppMallocDTCM);
    4 d0 m, M* t- L( j5 ?" T4 T
  67.                                         printf("DTCM总大小 = %d字节,申请大小 = 6111字节,当前共使用大小 = %d字节\r\n", 7 M! L1 S: n3 L* T
  68.                                                                                 DTCMUsed->size, DTCMUsed->used);# `) O3 h0 D# A: R5 x+ B
  69.                                         break;3 m8 E: q' I- R
  70.                                 
    + S# {7 g" Z; M- b8 F
  71.                                 /* 释放从DTCM申请的空间 */
    4 B9 ?( n1 u6 ~( B1 [. n9 Q
  72.                                 case KEY_UP_K1:        ) `+ N4 g5 U- ~1 e3 f# S" K0 ~+ t
  73.                                         /* 释放从DTCM申请的280字节空间 */: H( z  |# Y5 T2 o
  74.                                         osRtxMemoryFree(AppMallocDTCM, DTCM_Addres0);
    - @. S( J' q) \- s3 W2 @" i& U3 R
  75.                                         DTCMUsed = MemHeadPtr(AppMallocDTCM);, i" [& y# R9 q1 J: y
  76.                                         printf("释放DTCM动态内存区申请的0280字节,当前共使用大小 = %d字节\r\n", : h; {- x1 E: y, a$ C8 E* W0 k" q1 w
  77. DTCMUsed->used);# O) B- O7 Q4 E% p
  78.                                 / G  C  i' y0 \: G( w
  79.                                         /* 释放从DTCM申请的64字节空间 */* T3 W( o7 _9 P% F$ L; F& _+ d) [% v6 |
  80.                                         osRtxMemoryFree(AppMallocDTCM, DTCM_Addres1);6 A# [" |0 T! ]6 r
  81.                                         DTCMUsed = MemHeadPtr(AppMallocDTCM);
    " A# b# @7 I/ p; s  w
  82.                                         printf("释放DTCM动态内存区申请的0064字节,当前共使用大小 = %d字节\r\n",6 V7 y; a$ p8 V4 \, A8 a
  83. DTCMUsed->used);! B- M6 T1 k7 G$ f" x) b3 I3 U
  84.                                 . w' c' |* ^1 C* z6 d' k
  85.                                         /* 释放从DTCM申请的6111字节空间 */
    1 F2 s8 j- d, J% J  l
  86.                                         osRtxMemoryFree(AppMallocDTCM, DTCM_Addres2);; `. z5 Q2 p: s8 ~6 s
  87.                                         DTCMUsed = MemHeadPtr(AppMallocDTCM);
    ; v$ A/ V+ z- C
  88.                                         printf("释放DTCM动态内存区申请的6111字节,当前共使用大小 = %d字节\r\n",
    4 v' }4 o# N- L: C, p) n
  89. DTCMUsed->used);- Y4 \2 a5 u, \, v  v7 [: w
  90.                                         break;
    " Z$ W3 p" Z/ ]$ s6 S8 c: F1 U
  91.                                 6 z' `, f& `& G% A% W0 B0 E
  92.                                 /* 从AXI SRAM依次申请160字节,32字节和2333字节 */
    3 G) Q9 Q+ E& Q+ _2 Y
  93.                                 case KEY_DOWN_K2:        , s! v& m' B5 }, N/ y
  94.             /* 从AXI SRAM 申请160字节空间,使用指针变量AXISRAM_Addres0操作这些空间时不要超过160字节大小 */; y. h, ]7 @( Z; R- C9 H+ b5 q% D
  95.                                         printf("=========================================================\r\n");               
    # B* t. {( w  p* V
  96.                                         AXISRAM_Addres0 = osRtxMemoryAlloc(AppMallocAXISRAM, 160, 0);
    - y* `/ ]4 U0 W% E' j
  97.                                         AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);
    : L$ P+ U8 ~9 n" j6 [
  98.                                         printf("AXI SRAM总大小 = %d字节,申请大小 = 0162字节,当前共使用大小 = %d字节\r\n",
    + w4 T; Y  K7 @/ D; N1 P( q3 h
  99.                                                                                 AXISRAMUsed->size, AXISRAMUsed->used);
    # h' i  w) e% e4 z7 L  e
  100.                                   M+ J3 @' \8 d1 X  x( A( X* S
  101.                         /* 从AXI SRAM 申请32字节空间,使用指针变量AXISRAM_Addres1操作这些空间时不要超过32字节大小 */! s1 |+ `) I& O4 p% a+ i
  102.                                         AXISRAM_Addres1 = osRtxMemoryAlloc(AppMallocAXISRAM, 32, 0);
    ( y# @# ~! U! p2 D3 B2 _7 Q
  103.                                         AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);- ^5 r, C7 d. ~) D; e4 W/ H6 q- O+ }' n
  104.                                         printf("AXI SRAM总大小 = %d字节,申请大小 = 0032字节,当前共使用大小 = %d字节\r\n",
    ! r$ V8 x) A& m6 v1 h7 H
  105.                                                                                                       AXISRAMUsed->size, AXISRAMUsed->used);
    * M  m( S, a5 |( y
  106.                                 # `7 d) c; Q! `( H) e! B/ [
  107. /* 从AXI SRAM 申请2333字节空间,使用指针变量AXISRAM_Addres2操作这些空间时不要超过2333字节大小 */        6 ^5 ~7 ^& |8 P
  108.                                         AXISRAM_Addres2 = osRtxMemoryAlloc(AppMallocAXISRAM, 2333, 0);; R! Q% p1 @( ~  E1 U2 w
  109.                                         AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);6 U- ]4 s$ y( W, U. y9 R9 a% r/ o
  110.                                         printf("AXI SRAM总大小 = %d字节,申请大小 = 2333字节,当前共使用大小 = %d字节\r\n",
    # @0 t) H- M2 O, @: v
  111.                                                                                 AXISRAMUsed->size, AXISRAMUsed->used);
    * |# h$ ?6 I( X& _+ q5 w
  112.                                         break;% g2 I' J3 [& y6 g2 ~" ~
  113.                                 9 E- R( q* V8 G1 u0 W4 `
  114.                                 /* 释放从AXI SRAM申请的空间 */
    ) z+ X+ u  M  c! c7 w
  115.                                 case KEY_UP_K2:        8 P) b, U2 s/ c0 {5 `; M) e
  116.                                         /* 释放从AXI SRAM申请的160字节空间 */" L+ ?# y9 K  O
  117.                                         osRtxMemoryFree(AppMallocAXISRAM, AXISRAM_Addres0);
    ; m& l, e. L) T8 s' s2 U
  118.                                         AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);
    0 t$ @6 z. D- _" |/ {+ g  N: Z9 [
  119.                                         printf("释放AXI SRAM动态内存区申请的0160字节,当前共使用大小 = %d字节\r\n",
    ; d+ U' r- h" i9 v) z/ V
  120. AXISRAMUsed->used);6 x9 K0 j1 O6 \, r$ ?. ?* Z$ O
  121.                                 3 A, f: v% G( d5 j) ^4 |
  122.                                         /* 释放从AXI SRAM申请的32字节空间 */" r" k/ K: n  c5 z$ h/ J
  123.                                         osRtxMemoryFree(AppMallocAXISRAM, AXISRAM_Addres1);% K# k* F$ i4 ^: C/ l) a4 V3 S
  124.                                         AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);
    4 h" r$ O* F7 Y  L# a; Y
  125.                                         printf("释放AXI SRAM动态内存区申请的0032字节,当前共使用大小 = %d字节\r\n",
    , ^9 f0 l) P* S) z" X' P2 T& c
  126. AXISRAMUsed->used);
    & |! |' o$ E4 {
  127.                                 
    7 y1 X, u% H4 _& ^% S
  128.                                         /* 释放从AXI SRAM申请的2333字节空间 */
    ; x* {9 H, X9 |" W
  129.                                         osRtxMemoryFree(AppMallocAXISRAM, AXISRAM_Addres2);* L) i7 u/ i3 o3 ^8 K# ~
  130.                                         AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);/ X7 s, f7 l$ w- m$ B% c1 K
  131.                                         printf("释放AXI SRAM动态内存区申请的2333字节,当前共使用大小 = %d字节\r\n",
    ) h. _5 o  W; `+ D' W% D% l% t
  132. AXISRAMUsed->used);4 w6 J, P; l  L* X: V
  133.                                         break;
    ( D7 P9 N- h, z2 ~- o
  134.                                 
    3 ]+ q- M) e9 p  \$ l" D
  135.                                 /* 从D2域SRAM依次申请200字节,96字节和4111字节 *// o& [" W4 A+ z1 e5 D8 Y
  136.                                 case KEY_DOWN_K3:        ! Q( n- C) [* Y  I  B7 Y8 a0 w4 @( P
  137.         /* 从D2域的SRAM申请200字节空间,使用指针变量SRAM1_Addres0操作这些空间时不要超过200字节大小 */+ i; O5 c4 }: W# a% j, v( r
  138.                                         printf("=========================================================\r\n");                , Q6 m% e: Y4 V0 ~7 P$ l
  139.                                         SRAM1_Addres0 = osRtxMemoryAlloc(AppMallocSRAM1, 200, 0);
    , L3 \, {! K5 @+ G% ]$ [
  140.                                         SRAM1Used = MemHeadPtr(AppMallocSRAM1);9 N/ u, N, B' C# b) \
  141.                                         printf("D2域SRAM总大小 = %d字节,申请大小 = 0200字节,当前共使用大小 = %d字节\r\n", 6 E- A- g5 w. R- T. h+ }7 @( F" T
  142.                                                                                 SRAM1Used->size, SRAM1Used->used);
    0 S4 ]/ \2 r( }" C/ c5 g7 J
  143.                                 2 Y+ a" F: P# Z2 d4 j6 z+ u# ~
  144.          /* 从D2域的SRAM申请96字节空间,使用指针变量SRAM1_Addres1操作这些空间时不要超过96字节大小 */        + S& X9 e) J9 C+ I( ?5 \
  145.                                         SRAM1_Addres1 = osRtxMemoryAlloc(AppMallocSRAM1, 96, 0);
    3 N- n/ c7 x, t9 Y: e- z1 F3 M
  146.                                         SRAM1Used = MemHeadPtr(AppMallocSRAM1);
    ; }' k+ m3 q$ L* Q7 U5 d
  147.                                         printf("D2域SRAM总大小 = %d字节,申请大小 = 0096字节,当前共使用大小 = %d字节\r\n",
    - u6 s0 K7 M& F1 I
  148.                                                                                                            SRAM1Used->size, SRAM1Used->used);9 w0 P* Z% ?% ]8 Z7 V1 M
  149.                                 
    . e% R6 A- g% _1 c: i3 ?3 c$ O
  150.          /* 从D2域的SRAM申请4111字节空间,使用指针变量SRAM1_Addres2操作这些空间时不要超过4111字节大小 */
    0 |2 O) b* V, R+ q7 k
  151.                                         SRAM1_Addres2 = osRtxMemoryAlloc(AppMallocSRAM1, 4111, 0);
    % K8 [6 B8 E  x) K5 e+ Y6 @$ A
  152.                                         SRAM1Used = MemHeadPtr(AppMallocSRAM1);+ o3 G  |+ h; ^$ e, v: y
  153.                                         printf("D2域SRAM总大小 = %d字节,申请大小 = 4111字节,当前共使用大小 = %d字节\r\n", 5 j6 w& B, M, L! D: N5 c
  154.                                                                                 SRAM1Used->size, SRAM1Used->used);& e3 C, `3 r6 F4 H, m; q/ M
  155.                                         break;
    # s: G3 I3 O7 x
  156.                                 . t" e% T6 U: r. A
  157.                                 /* 释放从D2域SRAM申请的空间 */4 A! z3 V9 ?3 ^( ^1 [# f4 P! M
  158.                                 case KEY_UP_K3:        % z# x  b7 t" y- X
  159.                                         /* 释放从D2域的SRAM申请的200字节空间 */
    , U; J1 t* N! R& t' f
  160.                                         osRtxMemoryFree(AppMallocSRAM1, SRAM1_Addres0);
    7 q/ F0 T7 t# C/ c7 l. F0 J2 P2 o2 a
  161.                                         SRAM1Used = MemHeadPtr(AppMallocSRAM1);0 t6 S3 T0 n% s/ G
  162.                                         printf("释放D2域SRAM动态内存区申请的0200字节,当前共使用大小 = %d字节\r\n",
    + j2 ^& i$ z1 t0 ~* n3 D
  163. SRAM1Used->used);
    : n7 n) Z5 W# R; E6 R: ?
  164.                                 
    ( V0 o) P2 z/ F/ N& A5 Q& d
  165.                                         /* 释放从D2域的SRAM申请的96字节空间 */
    . l0 q2 r0 W# G0 I7 D5 t5 N
  166.                                         osRtxMemoryFree(AppMallocSRAM1, SRAM1_Addres1);
    " D; [1 T% R+ [9 D4 o
  167.                                         SRAM1Used = MemHeadPtr(AppMallocSRAM1);% W- ?/ {# K! [0 r+ E2 j0 V% f. |
  168.                                         printf("释放D2域SRAM动态内存区申请的0096字节,当前共使用大小 = %d字节\r\n",/ W# g; [" k5 F
  169. SRAM1Used->used);6 S7 c, v% `* Y: D4 Y8 i
  170.                                 3 U2 W8 Y* U0 m* A, g
  171.                                         /* 释放从D2域的SRAM申请的4111字节空间 */6 c$ i$ I& F' T& @/ l
  172.                                         osRtxMemoryFree(AppMallocSRAM1, SRAM1_Addres2);
    " d( b! y! }8 L: C( g
  173.                                         SRAM1Used = MemHeadPtr(AppMallocSRAM1);
    5 G- W5 U# E9 z
  174.                                         printf("释放D2域SRAM动态内存区申请的4111字节,当前共使用大小 = %d字节\r\n",
    * ~  U" m/ ]7 _5 e- u  }/ d  [
  175. SRAM1Used->used);9 {7 p1 |6 U% Y* m0 ^( w) z" i
  176.                                         break;
    ! r7 N4 b3 j$ ?- V# q  `
  177.                                 
    1 i( r6 Y+ Y* X, i* d  D
  178.                                 /* 从D3域SRAM依次申请300字节,128字节和5111字节 */
    $ V( C* N! R/ \
  179.                                 case JOY_DOWN_OK:        
    * P/ C3 g1 p; x* M/ P  P. [
  180.             /* 从D3域的SRAM申请300字节空间,使用指针变量SRAM4_Addres0操作这些空间时不要超过300字节大小 */3 K& F4 I$ ~% j  O; W- s
  181.                                         printf("=========================================================\r\n");               
    / F, Q& }- Z) N1 k% y: m
  182.                                         SRAM4_Addres0 = osRtxMemoryAlloc(AppMallocSRAM4, 300, 0);
    8 p8 q2 z3 k* B+ X7 q% p6 F3 {9 M
  183.                                         SRAM4Used = MemHeadPtr(AppMallocSRAM4);
    3 l; L* c) n0 X# a
  184.                                         printf("D3域SRAM总大小 = %d字节,申请大小 = 0300字节,当前共使用大小 = %d字节\r\n",
    6 q/ |: C$ y6 g, d& p' P3 r8 i/ S
  185.                                                                                 SRAM4Used->size, SRAM4Used->used);5 ?) W9 E+ @0 I$ c
  186.                                 ' H/ r4 Q# S1 x6 v# a' f/ W
  187.                 /* 从D3域的SRAM申请96字节空间,使用指针变量SRAM4_Addres1操作这些空间时不要超过96字节大小 */! f* g% l' V; ?6 x& K
  188.                                         SRAM4_Addres1 = osRtxMemoryAlloc(AppMallocSRAM4, 128, 0);. M  z( R( w6 {: M+ I6 Q+ ^
  189.                                         SRAM4Used = MemHeadPtr(AppMallocSRAM4);
    ) V% f3 C- l+ ~2 k3 ^9 M+ l* W& j
  190.                                         printf("D3域SRAM总大小 = %d字节,申请大小 = 0128字节,当前共使用大小 = %d字节\r\n",
    7 \4 V1 @& _; u, M
  191.                                                                                                            SRAM4Used->size, SRAM4Used->used);. ^8 ^8 w* x1 L5 Q
  192.                                 
    3 }  s' \  Y+ W* k2 X9 {. \
  193.         /* 从D3域的SRAM申请5111字节空间,使用指针变量SRAM4_Addres2操作这些空间时不要超过5111字节大小 */
    9 o4 b# P6 u' q) E3 T6 a
  194.                                         SRAM4_Addres2 = osRtxMemoryAlloc(AppMallocSRAM4, 5111, 0);: Z% ^: l8 m& z+ \2 D
  195.                                         SRAM4Used = MemHeadPtr(AppMallocSRAM4);
    6 @' F! w' E" |: y/ M' `/ s1 d
  196.                                         printf("D3域SRAM总大小 = %d字节,申请大小 = 5111字节,当前共使用大小 = %d字节\r\n", + d2 ^7 I$ j1 |% t. b* i
  197.                                                                                 SRAM4Used->size, SRAM4Used->used);1 _% O- P/ u- w! C+ n0 \- R/ J
  198.                                         break;. V% v7 G! }* {0 _
  199.                                 . a/ M. F( A& F1 N
  200.                                 /* 释放从D3域SRAM申请的空间 */
    : j1 y, q% |, C: L8 B& p
  201.                                 case JOY_UP_OK:        2 @  U4 G6 ~/ y$ e- l
  202.                                         /* 释放从D3域的SRAM申请的300字节空间 */, i0 y" v) S" V
  203.                                         osRtxMemoryFree(AppMallocSRAM4, SRAM4_Addres0);
    : a; N3 R* ~* l1 X4 \9 b) r% Q- K! h
  204.                                         SRAM4Used = MemHeadPtr(AppMallocSRAM4);: Q! u3 R& ^3 O$ }: v/ ~
  205.                                         printf("释放D3域SRAM动态内存区申请的0300字节,当前共使用大小 = %d字节\r\n", 0 ^( k8 W4 `: b5 b# W% M$ U% ^; j
  206. SRAM4Used->used);  `6 R/ E. P5 K; e: ?& q
  207.                                 
    " i# u; T: J/ f3 C" E
  208.                                         /* 释放从D3域的SRAM申请的128字节空间 */, F' t( A; p3 ^6 J
  209.                                         osRtxMemoryFree(AppMallocSRAM4, SRAM4_Addres1);
    / ]6 k9 S- j% C" z. {
  210.                                         SRAM4Used = MemHeadPtr(AppMallocSRAM4);) m/ ?, ]8 Z) ~- S* j9 h  K
  211.                                         printf("释放D3域SRAM动态内存区申请的0128字节,当前共使用大小 = %d字节\r\n",. f  i: j& ]" r3 A
  212. SRAM4Used->used);9 M# b& {* l" y: e6 w7 N6 C
  213.                                 
    . ~" f4 d% N  S3 B
  214.                                         /* 释放从D3域的SRAM申请的5111字节空间 */( [) ^: E: l, v/ a7 l
  215.                                         osRtxMemoryFree(AppMallocSRAM4, SRAM4_Addres2);' J  s+ K  _$ u% o7 Z
  216.                                         SRAM4Used = MemHeadPtr(AppMallocSRAM4);
    # a0 H1 P. P- ~- p$ I, s% {
  217.                                         printf("释放D3域SRAM动态内存区申请的5111字节,当前共使用大小 = %d字节\r\n",/ H6 Y- A- N! `* Q
  218. SRAM4Used->used);' Q( d0 I! P8 v5 d! t7 Z
  219.                                         break;
      f& r9 s  u) C% F  x2 o# E# C- s
  220.                         % g( I( e! F" |3 Z
  221.                                 default:6 b3 i& r  K: ?9 O
  222.                                   /* 其它的键值不处理 */5 t. E2 K: |% }9 l7 Q/ ~
  223.                                   break;
    5 M# S( e$ K; L! z; ^
  224.                         }
    & e' m, I5 C" {1 R' x( A6 |7 q
  225.                 }' d$ v: J; O3 B3 V- L& [: F6 x8 _
  226.         }) s' n  w- a* r' Y0 Z! C
  227. }
复制代码
: K. k: K5 L* b1 I2 r  A! a2 @' ?
27.6 总结
+ F0 g; W- Q9 ^: f) K本章节就为大家讲解这么多,还是比较有项目实用价值的,特别是MP3编解码,JPEG编解码,视频播放器,矢量字体等需要动态内存的场合。# p) D6 y! ~) v" z9 c
7 x4 L! {5 @- F3 t6 E1 O0 T
6 a7 ]. z1 E; X1 z# p: g# `2 _) J
2 k. }3 X. k  _* T, I/ A& p8 O! C) m
收藏 评论0 发布时间:2021-12-23 15:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

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