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( 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
+ ?. [+ ^& 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
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
$ 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- /* DTCM, 64KB */
* W' `0 d2 h% A; }& G$ R0 U - /* 用于获取当前使用的空间大小 */6 F6 R8 R# o0 m% u
- mem_head_t *DTCMUsed;
4 j, s; O* H3 ]" a9 n O1 K( s' R - /* 定义为64位变量,首地址是8字节对齐 */ " r- L) N; _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 |- /* D1域, AXI SRAM, 512KB */
" p! {& ]4 I8 \; j6 W# R4 Y - /* 用于获取当前使用的空间大小 */
! Q4 K( `2 j" @& ^ - mem_head_t *AXISRAMUsed; 5 l" V* v! I) U9 j
- /* 定义为64位变量,首地址是8字节对齐 */
3 b6 M* M6 Z3 _; U1 \4 R! ?+ j - 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
- uint32_t *DTCM_Addres0, *AXISRAM_Addres0;6 i7 { k9 [4 z: ^7 I
! ^( F+ X! X& E; V5 B/ E- /* 从DTCM申请280字节空间,使用指针变量DTCM_Addres0操作这些空间时不要超过280字节大小 */
1 e& l" [; |& y1 A; o/ H - DTCM_Addres0 = osRtxMemoryAlloc(AppMallocDTCM, 280, 0);4 y# O# ~3 r3 _8 y
- DTCMUsed = MemHeadPtr(AppMallocDTCM);1 f) X7 O7 j6 {7 D! A4 o+ u7 u
- printf("DTCM总大小 = %d字节,申请大小 = 0280字节,当前共使用大小 = %d字节\r\n",
- o$ r7 Y. h$ n% l2 x' T) C" r# w - DTCMUsed->size, DTCMUsed->used);
6 D% h0 W$ ~' v/ w
5 D! ` J8 c5 ^. a0 r, r# r8 C' \/ O- /* 从AXI SRAM 申请160字节空间,使用指针变量AXISRAM_Addres0操作这些空间时不要超过160字节大小 */ 9 k# Z) Q+ b9 u0 T4 ^. C
- AXISRAM_Addres0 = osRtxMemoryAlloc(AppMallocAXISRAM, 160, 0);0 l, d5 @! C1 l; g) i- l, ?7 D
- AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);
6 n6 \# e2 i/ a4 j/ m, Y - printf("AXI SRAM总大小 = %d字节,申请大小 = 0162字节,当前共使用大小 = %d字节\r\n", + J4 U U. J$ d. l# {' P
- 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+ |- /* 释放从DTCM申请的280字节空间 */% Z4 ]5 }( {, f. f i! \
- osRtxMemoryFree(AppMallocDTCM, DTCM_Addres0);0 m" o7 r4 S+ ?0 d3 m
- DTCMUsed = MemHeadPtr(AppMallocDTCM);
( V4 o4 ^$ `: x$ F. r - printf("释放DTCM动态内存区申请的0280字节,当前共使用大小 = %d字节\r\n", DTCMUsed->used);* R1 `% o' M9 K8 i
" @2 B( [8 l; u8 s9 u- /* 释放从AXI SRAM申请的160字节空间 */
8 H& d! ?4 W* w+ L+ t( S$ [( f - osRtxMemoryFree(AppMallocAXISRAM, AXISRAM_Addres0);
) T. c3 _8 G8 X7 c8 n/ m6 j - AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);
- I# p! D& u" d$ q0 V9 z! H$ m3 P - 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
- /* DTCM, 64KB */
& C+ j: w; h; ? - /* 用于获取当前使用的空间大小 */
$ P3 q1 n! u. y' p. G - mem_head_t *DTCMUsed; + ?% |* r9 G# ^% g8 N
- /* 定义为64位变量,首地址是8字节对齐 */
' w& l1 y7 z6 Q0 }& r# p" J9 v - 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
- /* D1域, AXI SRAM, 512KB */
( y5 ~1 w: k/ e$ Q - /* 用于获取当前使用的空间大小 */ k, q/ z' B- s+ u3 y4 K A& L4 K
- mem_head_t *AXISRAMUsed;
8 r! u( r/ b3 h/ Y4 ]+ a/ \ - /* 指定下面数组的地址为0x24000000 */ + [4 h' W1 f0 o" J
- #pragma location = 0x240000006 O7 X4 s% h" x$ E3 [% g+ t
- 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
- osRtxMemoryInit(AppMallocDTCM, sizeof(AppMallocDTCM));
. ~, Q8 A. P. r - 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
- uint32_t *DTCM_Addres0, *AXISRAM_Addres0;- M; t% d+ V* j, M. u: k6 d0 `4 C
. s; c4 r: `0 J5 I% J- /* 从DTCM申请280字节空间,使用指针变量DTCM_Addres0操作这些空间时不要超过280字节大小 */ 5 J8 S' t) \* p6 A( P P
- DTCM_Addres0 = osRtxMemoryAlloc(AppMallocDTCM, 280, 0);
5 N1 @0 `- u* k - DTCMUsed = MemHeadPtr(AppMallocDTCM);# K$ R7 t. _- @( ]8 c+ P
- printf("DTCM总大小 = %d字节,申请大小 = 0280字节,当前共使用大小 = %d字节\r\n", 8 \# x+ I8 R& ~# m! z1 h
- DTCMUsed->size, DTCMUsed->used);
* Z1 n6 B4 y1 m# [; Z
1 r9 m f: W1 Z" |1 |1 C; u' j# e' N- /* 从AXI SRAM 申请160字节空间,使用指针变量AXISRAM_Addres0操作这些空间时不要超过160字节大小 */ 9 b7 }) _5 q! c5 {
- AXISRAM_Addres0 = osRtxMemoryAlloc(AppMallocAXISRAM, 160, 0);
: x4 e8 \* M0 Z' y' a - AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);
1 b5 |" K+ F) Q6 n+ Y - printf("AXI SRAM总大小 = %d字节,申请大小 = 0162字节,当前共使用大小 = %d字节\r\n", 4 A7 G! \' Y' Y f9 s- U* \4 A
- 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- /* 释放从DTCM申请的280字节空间 */
5 K4 a% M m. i$ D1 k! {$ V7 H - osRtxMemoryFree(AppMallocDTCM, DTCM_Addres0);9 l' e; |. J' B% m: h4 [$ i! p
- DTCMUsed = MemHeadPtr(AppMallocDTCM);8 S @' |0 q2 [1 D, e
- printf("释放DTCM动态内存区申请的0280字节,当前共使用大小 = %d字节\r\n", DTCMUsed->used);: k: J% @: Z/ l2 \) s
- 8 S( j( _' V; a
- /* 释放从AXI SRAM申请的160字节空间 */+ {% P7 R* } V
- osRtxMemoryFree(AppMallocAXISRAM, AXISRAM_Addres0);* a9 U d0 y3 \1 p" B
- AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);4 F' q# r0 L% e% B( f
- 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
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
+ 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 _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- /*
2 b- {1 C, h a' C2 h' Y3 g; {4 J - *********************************************************************************************************
: \7 g1 B0 ~8 Z - * 函 数 名: bsp_Init- D* l4 ]" ?8 |( R! n- j) l, [$ z
- * 功能说明: 初始化所有的硬件设备。该函数配置CPU寄存器和外设的寄存器并初始化一些全局变量。只需要调用一次% q8 |8 |% m) `' {# ?
- * 形 参:无
7 w+ j9 J O. W2 V/ |, ~ - * 返 回 值: 无
+ p2 m c: y4 e% b$ e$ |8 _: H - *********************************************************************************************************
8 ^, M+ _6 t3 R4 C7 J - */
7 }7 Q, I% A" a, G - void bsp_Init(void)
5 K# F6 J$ w0 `; }; \. H - {
% ~$ y6 |3 `5 |: k - /* 配置MPU */0 _% H v% ~ ^9 ` \3 H( o
- MPU_Config();
5 t( P/ t3 O* ?; y/ m. V# a, D7 u - 4 p& P3 a. a; G! z4 n! C' I) P
- /* 使能L1 Cache */8 M N M; C, b& j, h# F+ U
- CPU_CACHE_Enable();
; M. A8 B- B2 w+ W% Z
2 `7 j" h) D2 r2 J1 M- /*
$ W& w E* `1 I1 Q5 b0 n: W - STM32H7xx HAL 库初始化,此时系统用的还是H7自带的64MHz,HSI时钟:
- h+ w/ m0 |* o: W' v: \ - - 调用函数HAL_InitTick,初始化滴答时钟中断1ms。
, t# _6 R( M5 g4 b% n - - 设置NVIV优先级分组为4。% Z* X, L4 ]3 V3 G
- */2 F, n3 t7 U* O+ O9 i! }1 H" J
- HAL_Init();* `( G( t( ~5 n, f
) w" |1 H: U1 J& c( ]9 {- /* / Q+ H* B, A7 p# \2 N1 x% R& E
- 配置系统时钟到400MHz
0 K w, E: k& ^' r3 B5 @* B - - 切换使用HSE。2 ^" X' L+ P+ O" M* y7 N: f* L, v
- - 此函数会更新全局变量SystemCoreClock,并重新配置HAL_InitTick。6 N0 q" C1 ], E2 E; N/ G0 m
- */
3 M0 T3 `9 e& g }" a/ b7 ? - SystemClock_Config();+ S3 I+ D! B6 Y$ L; }, P& G
- ; G8 \' H1 i, m; m* y! M
- /*
7 w! _# R. [3 L, S3 H: V/ ~ - Event Recorder:' H d6 p! M8 N: x4 d0 o* i
- - 可用于代码执行时间测量,MDK5.25及其以上版本才支持,IAR不支持。" h0 v0 n; \- `
- - 默认不开启,如果要使能此选项,务必看V7开发板用户手册第xx章
# y- N" a1 [7 ]$ g) F9 r - */ 4 A: \. O2 \! r
- #if Enable_EventRecorder == 1
# Q* z$ [3 Y' V0 ~1 s - /* 初始化EventRecorder并开启 */
' H9 q& S6 j& \' c. V" Y# W - EventRecorderInitialize(EventRecordAll, 1U);
$ m* f4 Y% `6 o - EventRecorderStart();
" b$ D7 ]- R" W5 b6 ~% J- [ - #endif& w3 Q( ]- f4 n. O
-
" Q3 }* \/ B3 d7 s - bsp_InitKey(); /* 按键初始化,要放在滴答定时器之前,因为按钮检测是通过滴答定时器扫描 */
2 M/ l" Q6 x$ x) L/ | - bsp_InitTimer(); /* 初始化滴答定时器 */% x" ?1 d/ Q9 ]" F# h/ T
- bsp_InitUart(); /* 初始化串口 */+ S: }0 \) |7 o, V2 Z" l
- bsp_InitExtIO(); /* 初始化FMC总线74HC574扩展IO. 必须在 bsp_InitLed()前执行 */
7 x8 Q2 V# Q' { - bsp_InitLed(); /* 初始化LED */
/ | \$ ]) x+ K8 f d2 Y* v - }
复制代码
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- /*
' m/ B/ I* c! y; g3 s - *********************************************************************************************************
4 n, m# t2 V6 V8 t; x0 f - * 函 数 名: MPU_Config
3 r, B8 q, t% a5 c$ N2 N% _$ d - * 功能说明: 配置MPU4 y. W4 i7 G8 o# R' A
- * 形 参: 无1 Q& v4 n% W: F0 E H, ~
- * 返 回 值: 无' g9 Q3 } @' a R: v
- *********************************************************************************************************: ?7 e. Y% _, l! U+ ?) B
- */$ {1 ?2 H$ \* b) C! ^
- static void MPU_Config( void )1 g0 ?5 ?5 _0 {& y( Z. F
- {# [- x& _/ V( Z+ ^7 h0 g# ~! B
- MPU_Region_InitTypeDef MPU_InitStruct;# J; h" \' j' s' @
- $ X) Q# i' R1 l" M$ a" d6 X: K
- /* 禁止 MPU */
7 w4 \6 S' B0 c6 m+ J) l - HAL_MPU_Disable();
( f6 _8 x1 U3 V" ?( T - 7 ~1 q* S+ d0 n2 w% Z0 l* ]( X
- /* 配置AXI SRAM的MPU属性为Write back, Read allocate,Write allocate */
, I$ i4 l# I8 a ]1 L! V% h - MPU_InitStruct.Enable = MPU_REGION_ENABLE;2 a$ y8 H$ C8 t/ ~6 `9 i
- MPU_InitStruct.BaseAddress = 0x24000000;; n8 Q$ U- b6 i3 P4 ~
- MPU_InitStruct.Size = MPU_REGION_SIZE_512KB;" A/ k+ d, B" B+ R. \
- MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;( q) u( c& J5 c, U
- MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE;
4 U, j2 I3 P4 Z9 r0 P1 I( t - MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;! r- z D+ s+ D
- MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
1 @- n6 q% G( N# ?& g' b: S5 o( I4 Y - MPU_InitStruct.Number = MPU_REGION_NUMBER0;$ L9 W0 [6 |: {$ ?) z
- MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL1;
% _0 t- U6 c B# X% t4 |8 c. c. Z - MPU_InitStruct.SubRegionDisable = 0x00;
* E- D T; E1 L, z1 C. L - MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
/ l2 s) \( g* x8 T - . b; h( j P- t. k* S
- HAL_MPU_ConfigRegion(&MPU_InitStruct);1 x4 w" u% g1 m3 W2 U* s
- - _- J, W9 e: S/ E$ I' q
-
: h- T2 Y9 N0 y6 O4 y- R - /* 配置FMC扩展IO的MPU属性为Device或者Strongly Ordered */
! u G) D9 _7 x# C: q$ b# Y - MPU_InitStruct.Enable = MPU_REGION_ENABLE;
# u }3 O) T9 l8 Q - MPU_InitStruct.BaseAddress = 0x60000000;
2 h: E' s6 N+ _* `5 W - MPU_InitStruct.Size = ARM_MPU_REGION_SIZE_64KB;
( T+ v+ L$ k7 Z# ?% O/ [ - MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;) x/ P7 h3 d {6 C5 w
- MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE;% g# p* Z1 _. F; K0 o; d
- MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;5 k- n" j( K7 H' C+ X; i+ f
- MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;+ O, J/ T7 g3 W4 L
- MPU_InitStruct.Number = MPU_REGION_NUMBER1;. {2 Z( g! `1 k
- MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;9 g/ n% D8 Z8 X# E: q' [* j
- MPU_InitStruct.SubRegionDisable = 0x00;
9 e- f. X$ R- J2 O! F, T - MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;6 n5 U% v/ P. T. ^, K" r+ n2 r
-
2 o# i+ Q3 M0 V# D4 X' g - HAL_MPU_ConfigRegion(&MPU_InitStruct);
* ]7 d; ?3 E- W! w+ w2 V2 e: ^* l8 | - ) s H/ E+ V! P8 A0 [: x+ i# H
- /* 配置SRAM1的属性为Write through, read allocate,no write allocate */
; q8 z$ d$ \& |! o9 G8 s - MPU_InitStruct.Enable = MPU_REGION_ENABLE; L: \ t% V6 `8 k5 S
- MPU_InitStruct.BaseAddress = 0x30000000;
$ P$ X6 h! S6 ]8 h U" L( Z! | - MPU_InitStruct.Size = ARM_MPU_REGION_SIZE_128KB; 0 Q5 I/ r. B! I9 g: k7 X
- MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
0 O, D# v# L( \" k - MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;$ ]$ K: Y) M# |: E
- MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;# Z# r4 B6 ~3 t) H- J, X
- MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
& R7 @4 C9 n1 Z# G3 }* T - MPU_InitStruct.Number = MPU_REGION_NUMBER2;& x; z; K4 ?7 r; E4 h: q* F) G. \
- MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
# k1 @+ l2 J7 l7 y) {: [ - MPU_InitStruct.SubRegionDisable = 0x00;( E$ _" C' I6 u& o
- MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
( Q+ T) D. j7 c8 a, D+ {; ~0 s3 e
* {( q, R6 w' T) C- f3 n" j- HAL_MPU_ConfigRegion(&MPU_InitStruct);
3 m3 d( u/ E1 c) ^ N; E -
) V! g9 |5 A( h - /* 配置SRAM2的属性为Write through, read allocate,no write allocate */
! Y; C* r5 U6 B/ ~ z& {) A - MPU_InitStruct.Enable = MPU_REGION_ENABLE;
0 @/ d# E: Y! n1 i. B2 h - MPU_InitStruct.BaseAddress = 0x30020000;
4 Q/ i/ {9 E4 \' U - MPU_InitStruct.Size = ARM_MPU_REGION_SIZE_128KB;
( I. B% _% R* E+ X% L - MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
+ i5 j( L6 ~ t" i7 R- b - MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;- ~/ ` P6 K' V6 m
- MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE; U% g8 b! e- K! H6 B) Q- C
- MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;/ i2 O: t9 d2 S* k* c2 F# A
- MPU_InitStruct.Number = MPU_REGION_NUMBER3;
* X; ?0 H# `" I% D" m) v+ ~ - MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;) Y$ w& x5 b! S
- MPU_InitStruct.SubRegionDisable = 0x00; b" B" J h( P% x" d
- MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
4 U( z$ \. X( j4 }% ?; l. O/ q- y. ? - 6 \3 O, r% `" H. }+ i. m" m# t
- HAL_MPU_ConfigRegion(&MPU_InitStruct);
! ^& p) @ l* U+ \' ]
}/ k( F( @7 I9 S6 q
2 n8 W& G$ n1 H' g0 V$ q% H# v- /* 配置SRAM3的属性为Write through, read allocate,no write allocate */+ B4 a$ H7 r7 I" }& ` N& q2 o" W
- MPU_InitStruct.Enable = MPU_REGION_ENABLE;
2 k( z6 E, j1 M" {7 n& U7 U0 ? - MPU_InitStruct.BaseAddress = 0x30040000;
# o7 h5 \5 S- o: O. s - MPU_InitStruct.Size = ARM_MPU_REGION_SIZE_32KB;
7 t7 Y9 X0 o# z3 T" \! f. s; A+ r - MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
. T F! b1 z% K) k3 C. F - MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;
( d4 b. c- }1 ?8 r - MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;
( e( O* J. b- K$ B - MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
, v: y( a% r* X; C- [0 v - MPU_InitStruct.Number = MPU_REGION_NUMBER4;8 b) u; @2 I& M5 n
- MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;7 d; A: D. E& c) N
- MPU_InitStruct.SubRegionDisable = 0x00;& f" L. }- S/ b- h! |( c" J
- MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;( C( X/ b6 S3 A* `4 M
- 7 V: k, Q* u* b; _, s7 [" @; G* ~
- HAL_MPU_ConfigRegion(&MPU_InitStruct);
8 h5 J; ~0 Z, \* Z, L, ]+ x -
* u/ } H$ i+ h/ e -
9 f2 @$ R M, F- a0 L5 K/ R - /* 配置SRAM4的属性为Write through, read allocate,no write allocate */
1 w3 E! v# d, ^+ G - MPU_InitStruct.Enable = MPU_REGION_ENABLE;1 I$ o/ N; [$ v3 E* ^
- MPU_InitStruct.BaseAddress = 0x38000000;
. N: s! F% C/ }4 r$ l6 g3 s( K - MPU_InitStruct.Size = ARM_MPU_REGION_SIZE_64KB;
. V6 s' T' l2 U7 M3 M2 N' j: D- _' e0 p - MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
( W+ P' `- Y8 r1 F: n) n; i - MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;# A9 b( r& D# m) Q
- MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;
p" |9 d1 p0 Z/ E. E7 p7 L2 ] - MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;( o/ y6 ]& w H7 j# c
- MPU_InitStruct.Number = MPU_REGION_NUMBER5;$ N+ j7 a+ |* x( ], B' q
- MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
3 Y$ S: \) N2 d- T4 W! _- |, O - MPU_InitStruct.SubRegionDisable = 0x00;
% z* x1 f2 G* C. M- F1 x2 T6 _ - MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;0 R0 z/ \, q* j) o1 ?
- 4 a# f7 z; Z, b' Q) n3 a B
- HAL_MPU_ConfigRegion(&MPU_InitStruct);
' v0 @5 O5 c) T0 M0 P. @6 J - 3 c& D1 e3 B# i2 `$ z
- /*使能 MPU */0 Z8 u( s3 w1 z" f0 a' S
- HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT); D8 a p% o0 S6 d+ O$ [) B: R
- }
2 |; O \( L8 i& h& v* z - * j5 t5 z2 |# b9 O2 y# ]
- /*2 y* F( I2 j0 d! P1 s& A A
- *********************************************************************************************************4 B4 w/ N' Q; D- j
- * 函 数 名: CPU_CACHE_Enable
n8 O }% ~7 D' m1 S5 b8 o r0 j - * 功能说明: 使能L1 Cache. y! F) _- g+ `8 A0 Z
- * 形 参: 无
2 P" U O; @2 {$ o& d1 [! w, y4 M7 H - * 返 回 值: 无1 I7 s( Z; G* U$ X
- *********************************************************************************************************
6 I4 T* v2 C! o4 S8 v% }9 o$ F- r - */: ~& |; j4 p6 T3 r3 y! \: f& t
- static void CPU_CACHE_Enable(void)
6 w* L/ A" o! }: R4 S' S# {+ t - {/ c; z6 E$ y4 i
- /* 使能 I-Cache */
1 a8 T" l9 t e3 | - SCB_EnableICache();% w9 Q5 ?7 ?# I1 k6 ]# R
- * c2 X( o9 K/ l M
- /* 使能 D-Cache */
- E, w( c- D6 b, e' X - SCB_EnableDCache();; J S( B% R% m. e; A
- }
复制代码
# 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
- /*
/ F! I* ^5 |- |3 ^+ y - *********************************************************************************************************
( {% \7 h4 e7 ?- d7 D, Y/ s - * 函 数 名: main7 G$ G. P4 t, O$ l1 b6 p# E' W
- * 功能说明: c程序入口3 b- @. H# O1 |2 g$ U F% c
- * 形 参: 无& @' Y7 i7 w6 j3 }6 v) ?+ `
- * 返 回 值: 错误代码(无需处理)& ?; N' R, {7 C: m8 l* b
- *********************************************************************************************************
4 s6 I @- w7 f) ^ - */4 C5 Y8 v5 r7 P3 a+ [
- int main(void): f( T$ J' ~/ Y* a L
- {
6 M- ^ `5 u" ?. i1 n - uint8_t ucKeyCode; /* 按键代码 */
7 B- B$ D7 o3 a& }7 P* s4 F - uint32_t *DTCM_Addres0, *AXISRAM_Addres0, *SRAM1_Addres0, *SRAM4_Addres0; y0 I* M6 ]1 j# ?2 o3 ^# l3 O# Z3 _
- uint16_t *DTCM_Addres1, *AXISRAM_Addres1, *SRAM1_Addres1, *SRAM4_Addres1;$ }5 N' K% c9 ~7 w9 R- p0 _! k2 y
- uint8_t *DTCM_Addres2, *AXISRAM_Addres2, *SRAM1_Addres2, *SRAM4_Addres2;: z* n- ?+ }/ k- e- e
- ' _7 Z- n8 h# d6 Z) |
- 4 \ w0 w: [ m9 W/ U
- bsp_Init(); /* 硬件初始化 */
1 M1 l# d; P/ P1 a8 n8 M' R -
' y. B3 S2 \1 s* e# e5 n - /* 初始化动态内存空间 */, y8 a- k, @' c! H2 e
- osRtxMemoryInit(AppMallocDTCM, sizeof(AppMallocDTCM));2 O0 ~/ v2 X- J j
- osRtxMemoryInit(AppMallocAXISRAM, sizeof(AppMallocAXISRAM));
- }2 h8 V+ G8 o) a - osRtxMemoryInit(AppMallocSRAM1, sizeof(AppMallocSRAM1));
4 A( U, I0 a2 Z& C& A$ x* a" v5 w/ x- T - osRtxMemoryInit(AppMallocSRAM4, sizeof(AppMallocSRAM4));1 \: J( H @, i9 t
- 9 M9 J; \6 R8 p w9 @* U
- PrintfLogo(); /* 打印例程名称和版本等信息 */) w+ x9 y: O! b3 K4 Q3 \ u" X4 A+ I
- PrintfHelp(); /* 打印操作提示 */; t: r/ F: t8 A+ U! \# y
6 F! w( q" t6 A; ]1 x- bsp_StartAutoTimer(0, 100); /* 启动1个100ms的自动重装的定时器 */
/ N" M3 \* b/ O! ^, A$ W -
! Z% I3 H7 R6 [2 H+ w# q - , C" ? r$ M% B% d6 l
- /* 进入主程序循环体 */
. ]! c$ k3 _9 L - while (1)
& ~0 S5 c8 D3 ^+ p2 y- k1 X - {' N1 }5 u8 a5 n# j
- bsp_Idle(); /* 这个函数在bsp.c文件。用户可以修改这个函数实现CPU休眠和喂狗 */( x6 X- C5 Y& m4 |' l8 O$ a q: O* y* `
- I% z* x& n9 ~7 C# b! A
- /* 判断定时器超时时间 */- {" s' i% i# \3 o- K: a
- if (bsp_CheckTimer(0))
) X$ N( a# _* y0 `5 A - {1 B( D( n% K6 b( A3 I/ X
- /* 每隔100ms 进来一次 */ " F; y6 ~4 D0 \& ?6 u# X
- bsp_LedToggle(2);
. W4 C/ a0 D8 J4 } - }0 U5 n5 V* u( m) p# m B
- ( M, z, e+ j& M; d
- /* 按键滤波和检测由后台systick中断服务程序实现,我们只需要调用bsp_GetKey读取键值即可。 */1 T9 r. ^% O" f) t5 j
- ucKeyCode = bsp_GetKey(); /* 读取键值, 无键按下时返回 KEY_NONE = 0 */1 U2 |$ R7 Z/ ~: E( Y7 W7 E
- if (ucKeyCode != KEY_NONE)
. I7 d! B/ h2 z. R, l - {8 T& i9 I/ Q% N, h0 l6 ~. k
- switch (ucKeyCode)) a' a- y* J! h4 g: d, B( Q
- {; E& h2 ]4 a2 L2 }5 E6 }
- /* 从DTCM依次申请280字节,64字节和6111字节 */
3 a* k/ H1 u+ D# l) C - case KEY_DOWN_K1: $ U- ]" B/ D& @8 l. I% p
- /* 从DTCM申请280字节空间,使用指针变量DTCM_Addres0操作这些空间时不要超过280字节大小 */
' t* }: A+ d. X - printf("=========================================================\r\n");
/ e! ?* Q; j) s) w! H8 ?4 j8 z1 `; F - DTCM_Addres0 = osRtxMemoryAlloc(AppMallocDTCM, 280, 0);
7 F$ `' }5 w6 H# V0 q' ~ ` - DTCMUsed = MemHeadPtr(AppMallocDTCM);
9 g: D1 N. X! i - printf("DTCM总大小 = %d字节,申请大小 = 0280字节,当前共使用大小 = %d字节\r\n",
\4 |2 o( I2 U0 G) @/ T. G9 a ? - DTCMUsed->size, DTCMUsed->used);3 f' K3 \7 }0 _ q
- $ x7 ^; M8 q' x) T7 C6 T5 Q5 P
- /* 从DTCM申请64字节空间,使用指针变量DTCM_Addres1操作这些空间时不要超过64字节大小 */
1 d4 A0 Z! R$ { - DTCM_Addres1 = osRtxMemoryAlloc(AppMallocDTCM, 64, 0);
% U4 d1 x4 _- F1 I% y - DTCMUsed = MemHeadPtr(AppMallocDTCM);
2 o# {. ^- W. h3 {: X - printf("DTCM总大小 = %d字节,申请大小 = 0064字节,当前共使用大小 = %d字节\r\n", 2 n) a( l; U0 e1 ?
- DTCMUsed->size, DTCMUsed->used);$ n& O$ e. w7 Q) E! L1 ]
- 1 u) n* R, k- h E& Q6 W
- /* 从DTCM申请6111字节空间,使用指针变量DTCM_Addres2操作这些空间时不要超过6111字节大小 */3 H7 O" j9 D/ r G6 W/ f3 [
- DTCM_Addres2 = osRtxMemoryAlloc(AppMallocDTCM, 6111, 0);
& d1 D( l W) m! f7 w; C. S, n0 u) \ - DTCMUsed = MemHeadPtr(AppMallocDTCM);
[" }6 b- w0 ^; I& t5 m8 L, n, c0 w - printf("DTCM总大小 = %d字节,申请大小 = 6111字节,当前共使用大小 = %d字节\r\n", ) r! ~$ i( q9 d& T- Q
- DTCMUsed->size, DTCMUsed->used);8 ~: ^! }$ S. ]$ O+ \! d
- break;
+ B6 U5 `3 E- o. @+ A8 K -
/ y" l& b I; {9 ~7 H# H/ h - /* 释放从DTCM申请的空间 */
. C/ X% l: z! f) } - case KEY_UP_K1:
- b* L3 }0 d3 ~2 G# T0 i7 G - /* 释放从DTCM申请的280字节空间 */
( M3 ~) s2 _/ F1 u! a6 B6 M, a - osRtxMemoryFree(AppMallocDTCM, DTCM_Addres0);, x/ F' V4 v+ ^' l
- DTCMUsed = MemHeadPtr(AppMallocDTCM);8 P' @! Q0 x. w. \! J" N
- printf("释放DTCM动态内存区申请的0280字节,当前共使用大小 = %d字节\r\n",
2 `& a/ I" D+ i* ?: n - DTCMUsed->used);
2 q& s$ Y% y" G' a( W- @3 f! ` - 7 s+ }: m! Z: v5 t e. F6 }' R
- /* 释放从DTCM申请的64字节空间 */$ I' i/ I4 Q! m+ v1 }! q# ^" ~/ s7 b
- osRtxMemoryFree(AppMallocDTCM, DTCM_Addres1);/ {( L( H2 `+ b% a4 k! x- u+ p
- DTCMUsed = MemHeadPtr(AppMallocDTCM);# E$ t6 h1 \* Z# V: m/ A5 n8 `1 l
- printf("释放DTCM动态内存区申请的0064字节,当前共使用大小 = %d字节\r\n",3 ~# W. Z6 L; ?; [* \! T( C) P
- DTCMUsed->used);
, h' J4 n# b5 U! d# [ -
0 |% \9 V5 d9 p$ k) q7 z - /* 释放从DTCM申请的6111字节空间 */
; i9 V% u5 l" a - osRtxMemoryFree(AppMallocDTCM, DTCM_Addres2);+ U! _' X# B% |* I$ h
- DTCMUsed = MemHeadPtr(AppMallocDTCM);% v* o. K7 d0 y
- printf("释放DTCM动态内存区申请的6111字节,当前共使用大小 = %d字节\r\n",
0 w* t9 n' c# w! J, T - DTCMUsed->used);
" o k$ @2 V: ^ D! l+ C - break;8 ]1 [) t- t7 Y& t4 E% L o
- . E1 r0 ^# m. J1 ?/ S
- /* 从AXI SRAM依次申请160字节,32字节和2333字节 */
4 B; Y+ \' u+ ]& {( p, N% G" ^* W% L4 k - case KEY_DOWN_K2:
* |0 h5 Y9 @1 t' v# U! D$ i+ B - /* 从AXI SRAM 申请160字节空间,使用指针变量AXISRAM_Addres0操作这些空间时不要超过160字节大小 */, h2 ~3 Y0 ]2 [( u% i/ Z( s% g9 B
- printf("=========================================================\r\n");
+ [% N2 u) c; W/ z" Q* m - AXISRAM_Addres0 = osRtxMemoryAlloc(AppMallocAXISRAM, 160, 0);) X7 M9 p9 S4 i' l$ i& i" a
- AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);
) E5 A5 {% L2 ` m# Q z; } - printf("AXI SRAM总大小 = %d字节,申请大小 = 0162字节,当前共使用大小 = %d字节\r\n",
+ r# V6 L; {$ @$ R - AXISRAMUsed->size, AXISRAMUsed->used);
, d C: Y- c' P- ^ -
" d; Z1 y. r$ d# I - /* 从AXI SRAM 申请32字节空间,使用指针变量AXISRAM_Addres1操作这些空间时不要超过32字节大小 */
w1 |/ T! Q/ e) u/ v# t( E8 w - AXISRAM_Addres1 = osRtxMemoryAlloc(AppMallocAXISRAM, 32, 0);
6 E, h! Z; B' v L/ ] - AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);
& V5 N4 n1 m4 Q+ S; \ - printf("AXI SRAM总大小 = %d字节,申请大小 = 0032字节,当前共使用大小 = %d字节\r\n", - T# P# o5 f( l( m+ e
- AXISRAMUsed->size, AXISRAMUsed->used);$ I+ f j) w8 O' D2 B, c& [3 \! W
- + R% k9 [& i; R/ Q
- /* 从AXI SRAM 申请2333字节空间,使用指针变量AXISRAM_Addres2操作这些空间时不要超过2333字节大小 */ T( Z+ @# V& s% s+ m6 e
- AXISRAM_Addres2 = osRtxMemoryAlloc(AppMallocAXISRAM, 2333, 0);
* `. E, N. E! Z$ i - AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);: v! \- ^2 g& n2 e
- printf("AXI SRAM总大小 = %d字节,申请大小 = 2333字节,当前共使用大小 = %d字节\r\n",
+ L6 q3 d$ L- m0 s - AXISRAMUsed->size, AXISRAMUsed->used);1 q& T* p3 N% P# Y( n7 h) _( D" ?
- break;
& q2 @! j% z% i( C2 ~& \ - ( k( j+ g/ j" O$ k; l* n( {3 R
- /* 释放从AXI SRAM申请的空间 */2 c$ v& k3 W+ V0 K# h
- case KEY_UP_K2: 5 O& k9 T& @5 V$ I% L9 C* E6 O
- /* 释放从AXI SRAM申请的160字节空间 */3 J% q, X; {) q& u, R
- osRtxMemoryFree(AppMallocAXISRAM, AXISRAM_Addres0);
3 S! H t9 b) g- C - AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);
' z% J5 Q0 L# m3 B6 S, Z - printf("释放AXI SRAM动态内存区申请的0160字节,当前共使用大小 = %d字节\r\n",0 H. r" n4 c, P, b# o
- AXISRAMUsed->used);1 ~; t8 ?; M) l. U. ~" j" ^6 M
- l8 ~3 k5 t6 p
- /* 释放从AXI SRAM申请的32字节空间 *// k# \, s* J$ U$ e% |8 d: D' \4 X3 M
- osRtxMemoryFree(AppMallocAXISRAM, AXISRAM_Addres1);, C7 r0 Z3 B0 U5 p" [/ s* d
- AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);0 O9 W+ u* g$ i* o3 X x. O
- printf("释放AXI SRAM动态内存区申请的0032字节,当前共使用大小 = %d字节\r\n",. _% y( l7 Q9 s% _4 U
- AXISRAMUsed->used);" A i+ X+ b$ c. l) I
- ( m( a- l3 [' D
- /* 释放从AXI SRAM申请的2333字节空间 */
+ j: @$ [7 i, w* [5 ^ - osRtxMemoryFree(AppMallocAXISRAM, AXISRAM_Addres2); c2 e8 z0 s. B1 b4 k8 A q
- AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);+ l" f3 j( Z& q9 W0 l+ w" O+ _6 S
- printf("释放AXI SRAM动态内存区申请的2333字节,当前共使用大小 = %d字节\r\n", . R3 q( X ?: h3 ~: k) u& _0 a! H7 d- s
- AXISRAMUsed->used);5 b5 t. X8 ^$ ?1 {3 _% h6 t
- break;
+ _' d0 @' i& Y3 O& u# G5 v; ^ -
7 z: O' ~) Y$ {$ y: ? - /* 从D2域SRAM依次申请200字节,96字节和4111字节 */+ w p; ?1 n% R# t5 e3 l
- case KEY_DOWN_K3:
" h# w; S2 o" r" I& s2 G: _ - /* 从D2域的SRAM申请200字节空间,使用指针变量SRAM1_Addres0操作这些空间时不要超过200字节大小 */
- X/ M/ P2 O- K3 ?7 k x) l" u4 D - printf("=========================================================\r\n"); 8 L$ i7 k9 ~) n7 Y/ |6 I$ W
- SRAM1_Addres0 = osRtxMemoryAlloc(AppMallocSRAM1, 200, 0);
: y. J) G. @2 y9 ?- N - SRAM1Used = MemHeadPtr(AppMallocSRAM1);
/ d8 W0 d* e; o" J! K3 | - printf("D2域SRAM总大小 = %d字节,申请大小 = 0200字节,当前共使用大小 = %d字节\r\n",
0 Z, U8 B) B$ M6 {* n0 e( d - SRAM1Used->size, SRAM1Used->used);
! D0 q4 ] d* @( O - 7 f+ x2 J% l; ?0 R
- /* 从D2域的SRAM申请96字节空间,使用指针变量SRAM1_Addres1操作这些空间时不要超过96字节大小 */
# `' H- H3 N8 a9 h7 ]1 Q - SRAM1_Addres1 = osRtxMemoryAlloc(AppMallocSRAM1, 96, 0);" n& e0 v7 q6 ~, M6 v$ }, l
- SRAM1Used = MemHeadPtr(AppMallocSRAM1);
6 v9 o* s( A! f% X& V - printf("D2域SRAM总大小 = %d字节,申请大小 = 0096字节,当前共使用大小 = %d字节\r\n",
; h7 b+ `; l! L" ~$ `+ J2 y% `7 F- f6 S - SRAM1Used->size, SRAM1Used->used);
! O' h% Y, x+ F4 ^ -
9 b0 J6 \2 x, E - /* 从D2域的SRAM申请4111字节空间,使用指针变量SRAM1_Addres2操作这些空间时不要超过4111字节大小 */
o# ]) }* I+ s- Y/ M' }: J6 y - SRAM1_Addres2 = osRtxMemoryAlloc(AppMallocSRAM1, 4111, 0);
' T3 q4 l! J; ^ - SRAM1Used = MemHeadPtr(AppMallocSRAM1);( @% G2 y7 g: ^! o, n1 C2 g
- printf("D2域SRAM总大小 = %d字节,申请大小 = 4111字节,当前共使用大小 = %d字节\r\n",
4 \* w3 C7 Z9 S; z+ H4 I% z - SRAM1Used->size, SRAM1Used->used);3 N/ \$ y& N p1 v! `5 O* P6 B
- break;; z5 B; `3 E( Z/ ~+ v: P
-
& x( C* E& w* I. Y - /* 释放从D2域SRAM申请的空间 */6 g- q" X: `4 Q! m3 h
- case KEY_UP_K3:
7 f7 g6 `% q! f$ v7 v, O - /* 释放从D2域的SRAM申请的200字节空间 */
" Z5 T" _4 E, L4 N - osRtxMemoryFree(AppMallocSRAM1, SRAM1_Addres0);4 L2 M0 W8 n" l9 B
- SRAM1Used = MemHeadPtr(AppMallocSRAM1);
6 X" g0 s3 t" W( ` - printf("释放D2域SRAM动态内存区申请的0200字节,当前共使用大小 = %d字节\r\n",1 F, u; ^5 h9 E4 B( p, l
- SRAM1Used->used);! m" h# f5 _1 K* {; S, Z: R: i
-
$ }7 l; p# d% S) c% j - /* 释放从D2域的SRAM申请的96字节空间 */
0 L i6 l( v6 j5 _! r `- i9 ], p - osRtxMemoryFree(AppMallocSRAM1, SRAM1_Addres1);
; ]2 C) G) J: O$ ? - SRAM1Used = MemHeadPtr(AppMallocSRAM1);
' N. i/ W8 G0 ^% v3 G9 ^# \7 G% L - printf("释放D2域SRAM动态内存区申请的0096字节,当前共使用大小 = %d字节\r\n",
4 I$ C& n3 h7 [' O - SRAM1Used->used);
$ ?; I1 a% c( Q- O$ E$ L( n - : Q, b% k7 E9 O9 l+ \9 A2 f
- /* 释放从D2域的SRAM申请的4111字节空间 */; S! D% k) q2 a% V
- osRtxMemoryFree(AppMallocSRAM1, SRAM1_Addres2);8 t* Q2 y0 e( y0 ~* C; q4 d6 k& Q% g
- SRAM1Used = MemHeadPtr(AppMallocSRAM1);
" l; y) \$ E+ v) `2 G- l - printf("释放D2域SRAM动态内存区申请的4111字节,当前共使用大小 = %d字节\r\n",
% l1 C/ \- ]5 I* H6 ^; B5 ^: B - SRAM1Used->used);! K* ?# _0 w1 [ q) t$ X4 n
- break;& B" y4 A! w( P w
-
: D5 x$ ]5 B( I/ m( B5 } - /* 从D3域SRAM依次申请300字节,128字节和5111字节 */
" L; f4 J( l5 C* R# c8 S6 C( A5 c - case JOY_DOWN_OK:
6 [( {3 S. r% H* b( ~1 ?2 E* [ - /* 从D3域的SRAM申请300字节空间,使用指针变量SRAM4_Addres0操作这些空间时不要超过300字节大小 */
4 f% G7 s! ]1 k3 R - printf("=========================================================\r\n");
) a* L: s2 C1 D5 {8 V3 Q9 y - SRAM4_Addres0 = osRtxMemoryAlloc(AppMallocSRAM4, 300, 0);. v" M! [ R. ]% ^4 H/ B
- SRAM4Used = MemHeadPtr(AppMallocSRAM4);2 O9 a. n4 o5 O; Y2 C8 Q
- printf("D3域SRAM总大小 = %d字节,申请大小 = 0300字节,当前共使用大小 = %d字节\r\n",
! z& N$ K5 M% U2 R - SRAM4Used->size, SRAM4Used->used);
" d0 w+ ^: p8 ?- q. X - ( f7 k3 l( _2 \$ [+ p) V
- /* 从D3域的SRAM申请96字节空间,使用指针变量SRAM4_Addres1操作这些空间时不要超过96字节大小 */0 h4 b" M9 V; j7 a- l# i/ \
- SRAM4_Addres1 = osRtxMemoryAlloc(AppMallocSRAM4, 128, 0);
. h5 T6 v/ R. l8 B1 R- x9 ` - SRAM4Used = MemHeadPtr(AppMallocSRAM4);
/ ]9 y3 D$ z3 U - printf("D3域SRAM总大小 = %d字节,申请大小 = 0128字节,当前共使用大小 = %d字节\r\n", # B+ Q% \' f. P9 D) F
- SRAM4Used->size, SRAM4Used->used);
& r3 Z' M$ t( x/ M& Q2 M0 Z& d$ Z8 q -
, Y& ~9 U/ r! t, ~/ s. _) z% } - /* 从D3域的SRAM申请5111字节空间,使用指针变量SRAM4_Addres2操作这些空间时不要超过5111字节大小 */
+ z4 f* S5 H7 z7 @/ r - SRAM4_Addres2 = osRtxMemoryAlloc(AppMallocSRAM4, 5111, 0);+ P7 }. Z7 a+ q- |) F
- SRAM4Used = MemHeadPtr(AppMallocSRAM4);+ N9 v% l3 b6 p2 L! x" G
- printf("D3域SRAM总大小 = %d字节,申请大小 = 5111字节,当前共使用大小 = %d字节\r\n",
3 a, W; L$ ?- H! f% s - SRAM4Used->size, SRAM4Used->used);
7 S3 @% N B9 M. |2 A( G - break;
$ W5 L' d! w% \9 F7 e! l5 j -
7 \# w2 x/ S. m; L3 _ - /* 释放从D3域SRAM申请的空间 */! H" |& a1 F3 t$ k
- case JOY_UP_OK:
- o$ E( E* \$ n4 n; H$ |0 n2 N - /* 释放从D3域的SRAM申请的300字节空间 */% A+ Z8 K6 [- ^. l' K
- osRtxMemoryFree(AppMallocSRAM4, SRAM4_Addres0);: W/ E3 W9 g, U' X* x
- SRAM4Used = MemHeadPtr(AppMallocSRAM4);
- O& M# ~+ Q% w/ G3 Z# K: [ - printf("释放D3域SRAM动态内存区申请的0300字节,当前共使用大小 = %d字节\r\n", 4 F# {1 J$ k8 D4 [( _. {
- SRAM4Used->used);4 L: C& _* Q6 p/ F5 P1 d
-
' }& g0 N" r8 ]1 j0 V - /* 释放从D3域的SRAM申请的128字节空间 */
1 R0 q! S& G/ e1 K5 [& { - osRtxMemoryFree(AppMallocSRAM4, SRAM4_Addres1);
" a( X& l! q: |/ j2 p- Y - SRAM4Used = MemHeadPtr(AppMallocSRAM4);
6 }2 o) V# S3 S- t1 u, n7 | - printf("释放D3域SRAM动态内存区申请的0128字节,当前共使用大小 = %d字节\r\n",4 r+ J; [, s0 k# ^2 i
- SRAM4Used->used);
/ j( X2 d" M1 i( ~8 }8 B -
) _; n3 U* } D( D+ J% m - /* 释放从D3域的SRAM申请的5111字节空间 */9 _* u1 o9 N1 Z/ g
- osRtxMemoryFree(AppMallocSRAM4, SRAM4_Addres2);
) J/ C0 R" q1 w) G; t5 j - SRAM4Used = MemHeadPtr(AppMallocSRAM4);! O. m4 t# Y1 ?- L, v3 q, }4 J. H
- printf("释放D3域SRAM动态内存区申请的5111字节,当前共使用大小 = %d字节\r\n", h/ E: J/ `1 Y" j3 g% D
- SRAM4Used->used);
$ a+ w6 `5 S5 F# [1 G. Y - break;
6 \/ f$ b, }% K" I' L, Z -
4 q- I. C. ~5 I+ l& k x/ D - default:
( v3 Q7 t7 B% f/ Y; R4 J. K - /* 其它的键值不处理 */6 G7 c) |4 i! [/ g. t
- break; N5 }% N$ }0 u- [- L
- }) ~ e4 u/ G$ Z$ ^+ x) w; p
- }- d0 q$ i3 c3 s( z4 S( ^
- }* G6 d. l2 y% m, M( C
- }
复制代码 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
- 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# ]& ^' [! 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, [. 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, [
- /*
" c6 ~2 d4 A8 U( \1 C - *********************************************************************************************************, ^* r# S) e: d9 }1 w4 L7 b
- * 函 数 名: bsp_Init
5 w; R) [9 r# [8 F4 C - * 功能说明: 初始化所有的硬件设备。该函数配置CPU寄存器和外设的寄存器并初始化一些全局变量。只需要调用一次6 [, D! p4 e# o1 B1 ?: N( D% I5 K
- * 形 参:无; C( j/ N$ H7 a& D8 _/ f0 U! r
- * 返 回 值: 无0 b7 o5 H3 u @( J8 E: B" w
- *********************************************************************************************************
9 H( w$ P- S5 A, N/ z! I - */, {# J. b. ^; W6 E
- void bsp_Init(void)
% K( _5 p4 O/ B) F6 ` - {
, M6 ^5 f: w1 m+ f; g2 z6 S - /* 配置MPU */
. d: y# W" x$ c4 r3 s" A |; i - MPU_Config();
& Z9 z& L( i7 H2 a -
' k/ ]' X2 N% u2 T4 S0 O) E) U - /* 使能L1 Cache *// e+ I1 g: O; ~3 ]7 \8 I
- CPU_CACHE_Enable();
; i% W: D0 ]+ ?8 V8 l; A - ( F$ S) V$ f q7 X
- /*
) R$ k2 v3 u( Z- l/ u0 W - STM32H7xx HAL 库初始化,此时系统用的还是H7自带的64MHz,HSI时钟:
4 }* ]8 i: m5 p, @8 m - - 调用函数HAL_InitTick,初始化滴答时钟中断1ms。
6 j5 T/ h1 z8 i! I# _' E - - 设置NVIV优先级分组为4。+ F9 c1 |1 P" n" {4 _
- */% c1 X" b$ K" `) }3 G1 |
- HAL_Init(); H4 k1 v& y2 S3 c# \5 Y
- ; z9 r1 u& H: j
- /* , w6 Z8 E2 U2 a( i
- 配置系统时钟到400MHz
, } x0 @6 s9 o& V' m* w4 L - - 切换使用HSE。
9 h* U( Q2 |3 r' ~$ i - - 此函数会更新全局变量SystemCoreClock,并重新配置HAL_InitTick。
( C" h, @6 w: B9 X# U/ W, c - */
( w% ]4 B" O0 k+ k# J8 o6 c1 G - SystemClock_Config();7 n/ x: m( d1 T+ o
- 5 E2 h, c4 G- g3 A
- /*
5 x' r: v/ H( c) M- L - Event Recorder:. B2 ` I. |) g8 H9 D* y) U6 w
- - 可用于代码执行时间测量,MDK5.25及其以上版本才支持,IAR不支持。
0 T {/ Z0 }& w" X5 }7 N - - 默认不开启,如果要使能此选项,务必看V7开发板用户手册第xx章
/ ?4 l3 R2 k, r; Y' R0 L/ i - */
; P M5 Q, y6 k - #if Enable_EventRecorder == 1 ' J0 _) u, n3 `) Y
- /* 初始化EventRecorder并开启 */, E8 q# Q# f9 t, L% o
- EventRecorderInitialize(EventRecordAll, 1U);3 x9 v! Q6 |3 k
- EventRecorderStart();
9 k/ G$ F7 j) f Y7 k5 G' i/ E - #endif* c5 l' d2 q {; [8 f t8 S7 s
-
7 F' U! i4 _7 E& F0 s" l, W2 z" k - bsp_InitKey(); /* 按键初始化,要放在滴答定时器之前,因为按钮检测是通过滴答定时器扫描 */
/ `. y3 b5 R% L& o- o+ h+ Q, u9 G$ r - bsp_InitTimer(); /* 初始化滴答定时器 */* q8 @- d4 c1 q$ G9 ^) P4 w4 A
- bsp_InitUart(); /* 初始化串口 */
+ s& U2 r% h$ u/ s; ] - bsp_InitExtIO(); /* 初始化FMC总线74HC574扩展IO. 必须在 bsp_InitLed()前执行 */
4 E2 g2 @: i# h* o# r. `' T - bsp_InitLed(); /* 初始化LED */ : K' S2 j$ S- d3 } n% e* t: n, s
- }
复制代码
( 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 ]% ~) [! @- /*
: y4 j; h3 x( | - *********************************************************************************************************
6 k5 v, j3 A0 G& T* H+ t0 ?4 G - * 函 数 名: MPU_Config* k5 o8 k% C" m& [! `4 q
- * 功能说明: 配置MPU
Y. p0 `. x' t- k4 _ - * 形 参: 无
1 ~9 U8 ?: i5 \0 L# z7 ? - * 返 回 值: 无. g4 ?- s- Y5 h7 S' T& M
- *********************************************************************************************************& {+ y+ ]! l Q! L* g9 ?
- */
! a" a: I! M8 O% r8 S - static void MPU_Config( void )% p5 a/ C8 x! W* \( A( ~
- {
$ F4 _# s& g8 b - MPU_Region_InitTypeDef MPU_InitStruct;
5 [' d D' ^8 ^: x - 3 X1 f5 Y4 y: U
- /* 禁止 MPU */- \; I* p9 X4 k) F- ?$ z
- HAL_MPU_Disable();
! b9 I) q# W7 c1 p" D* m - ; `6 z. p: ?4 D- C; u
- /* 配置AXI SRAM的MPU属性为Write back, Read allocate,Write allocate */
1 ^. E1 s' c! [ H1 S - MPU_InitStruct.Enable = MPU_REGION_ENABLE;
7 N8 i& M# g, m* q# @% L- | - MPU_InitStruct.BaseAddress = 0x24000000;
+ I. b! f$ I* E$ P! l4 ` - MPU_InitStruct.Size = MPU_REGION_SIZE_512KB;
) H( u( w; D! ` e: t( b - MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;& D7 L# q9 h* d6 ^6 ?) E
- MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE;% ]% T) g' D) P3 e9 H
- MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;
+ P: Y* f) W$ ^ n4 F q - MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;6 l/ O! N7 ~" i+ T
- MPU_InitStruct.Number = MPU_REGION_NUMBER0;
$ u$ U, [1 V+ z8 ~7 Q9 }* y - MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL1; D/ p5 \1 s8 p( d9 }' \/ S
- MPU_InitStruct.SubRegionDisable = 0x00;
7 ?- h3 o8 L; b' t- ? - MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;7 c9 p2 j; S+ X; s" H' }; u& Y7 p2 x
$ p7 C: F) \% v0 Q' u; k0 u- HAL_MPU_ConfigRegion(&MPU_InitStruct);9 i; [% L( \7 d5 R2 p
- & F8 s' X# W. x, O# [$ y2 }
- / E& }) l! ]# `9 Q& ^! c" p' K
- /* 配置FMC扩展IO的MPU属性为Device或者Strongly Ordered */- a9 Q7 w: f: d! u" }
- MPU_InitStruct.Enable = MPU_REGION_ENABLE;
* f! W6 x! k) B1 c; g1 v - MPU_InitStruct.BaseAddress = 0x60000000;* Y' o8 T# }* B( L$ }1 d
- MPU_InitStruct.Size = ARM_MPU_REGION_SIZE_64KB;
4 a4 {2 @5 Q% }3 i8 `7 M - MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
1 |) X' L4 K8 g# _. w - MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE;+ [* z2 b) ?; a9 i$ A7 M' F5 L
- MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;
, b7 \ B8 [" \* g5 x - MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
( C& U8 O7 z, E* ~& V( M/ S - MPU_InitStruct.Number = MPU_REGION_NUMBER1;' }2 ^1 s) R. V& X1 }: \
- MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;# O1 m8 w6 @* j8 v
- MPU_InitStruct.SubRegionDisable = 0x00;
+ X! ~% q. o7 F5 d" R7 p: H3 K; N - MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
9 H) A" }& V& ]( b -
8 {/ B4 c& k& n2 R! u - HAL_MPU_ConfigRegion(&MPU_InitStruct);
; k0 M8 V6 I! Y2 h& ^0 F1 {- a - # v- t! G( f6 E/ o# ~
- /* 配置SRAM1的属性为Write through, read allocate,no write allocate */
7 d1 o' }' a6 L- j. x - MPU_InitStruct.Enable = MPU_REGION_ENABLE;6 |1 l) ?, I) O8 R. I4 q& r1 ^
- MPU_InitStruct.BaseAddress = 0x30000000;# X% H% W y- {9 y# @- `( D
- MPU_InitStruct.Size = ARM_MPU_REGION_SIZE_128KB;
- w n+ U5 u: Q - MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;8 q+ ~6 x& n* W7 v3 H
- MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;
- G0 x9 G. w+ d - MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;1 N% P$ |# k* } H' M0 U
- MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
7 N. b) v: ]# F5 {5 ^ - MPU_InitStruct.Number = MPU_REGION_NUMBER2;
) Z; M8 w8 L+ C - MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
, ~' Z6 }' F5 V0 G - MPU_InitStruct.SubRegionDisable = 0x00;
. d# R/ E/ Q }9 b - MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
. {7 |3 K6 N/ F$ |. @
% B* e( Y" c) q. h( `, n- HAL_MPU_ConfigRegion(&MPU_InitStruct);+ t! p- m$ S6 f& ?" m
-
+ c, }" k/ g1 X/ O2 ? - /* 配置SRAM2的属性为Write through, read allocate,no write allocate */
" ~- @* y# b" g* i/ i7 V1 d) s - MPU_InitStruct.Enable = MPU_REGION_ENABLE;
[1 P# _# V3 T& t - MPU_InitStruct.BaseAddress = 0x30020000;
" I: e3 [0 z6 A3 g! K l! N - MPU_InitStruct.Size = ARM_MPU_REGION_SIZE_128KB;
2 W7 ^; _4 e/ c9 I) B - MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;1 f3 e6 w% G5 s# }& L+ `
- MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;
. i5 O* ?( W/ t- M1 t" k - MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;
6 v/ s( q7 q0 N. C$ C* H! D! b& b" {7 G - MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
7 ]5 j* h. s: [8 a3 ? - MPU_InitStruct.Number = MPU_REGION_NUMBER3;
" J" ^: H) _3 D) P - MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
9 {( K6 ], U2 U9 _! K) y7 _ - MPU_InitStruct.SubRegionDisable = 0x00;! L: e8 F9 |: v; o' S5 s
- MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;! T8 T: c" ~2 ~& z1 h2 X% d& t
0 @0 l F6 P. Q) c5 a1 S. h3 A+ Y- HAL_MPU_ConfigRegion(&MPU_InitStruct);
' T7 u) o0 ~/ m. U' g' g# f- X - 1 t$ q) B# S% v4 i* e2 m
- . d. ?' r8 y; y( l
- /* 配置SRAM3的属性为Write through, read allocate,no write allocate */
# M# o) d& B+ l+ Q - MPU_InitStruct.Enable = MPU_REGION_ENABLE;3 g! Y9 y; L/ k
- MPU_InitStruct.BaseAddress = 0x30040000;9 p2 @+ G4 U' ?9 x( u5 B# S
- MPU_InitStruct.Size = ARM_MPU_REGION_SIZE_32KB; % Q* @4 f4 D' X4 k4 J0 }
- MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;/ Q9 k! \" Z" V7 ~3 K+ f
- MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;
; H b5 ^' |4 c" S* i; O - MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;
. }' p2 Q7 U& P1 A% t( n7 d% ^ - MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;8 f/ ]* b; J; g* V0 K$ Q
- MPU_InitStruct.Number = MPU_REGION_NUMBER4;
9 [1 k! w% f7 M, M - MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;$ \+ M* Y& p: h7 B5 l, i1 E& G+ T
- MPU_InitStruct.SubRegionDisable = 0x00;. \7 ?- \5 n+ g4 \3 J) o2 W
- MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
/ @" T) W) B: X! A* M. \
5 V0 T4 r5 b2 b- HAL_MPU_ConfigRegion(&MPU_InitStruct);
7 v3 ~0 H$ _! y: W+ d" H: Q' P; [ - ; d* K! a- B" k
-
& |' g) P N6 |. n8 d2 Y( I - /* 配置SRAM4的属性为Write through, read allocate,no write allocate */( L9 m* `% Z" N: H8 P1 I
- MPU_InitStruct.Enable = MPU_REGION_ENABLE;
8 V5 V! Z o( ~ - MPU_InitStruct.BaseAddress = 0x38000000;
! ~' f6 ~; { ?& d9 I& g. }. S - MPU_InitStruct.Size = ARM_MPU_REGION_SIZE_64KB;
- Y8 Z8 m% U7 B( o9 [, [6 ?- C - MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;" i3 ` r9 `8 Z8 T9 L4 _
- MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;' }- d: f Y! s1 S% A) i# R9 y
- MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;4 Y V9 C# ?7 X I- q9 l
- MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
" B6 @. ^$ Z0 v/ \% o4 L - MPU_InitStruct.Number = MPU_REGION_NUMBER5;% Y ~1 U7 f6 L4 H. i$ N" p- n
- MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;0 U4 M: ^8 s( I. R
- MPU_InitStruct.SubRegionDisable = 0x00;+ D8 q7 V( T# }
- MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
9 A5 n) a2 `& a& _+ o
6 l1 @, {8 }' [2 W2 P6 G3 ]5 K- HAL_MPU_ConfigRegion(&MPU_InitStruct);
9 t4 j8 X4 x# D5 q( Y$ x1 F6 t -
2 ~* x7 h% E& ^$ Y) u# X( h - /*使能 MPU */
' S. ^5 z) d9 C - HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);
) n5 Y5 p4 c% e" }. O( c- L" h- v& `5 v - }0 y- J0 j9 V" O" P
- , [& Z) X& a8 C1 I& Z) ~4 U
- /*% h1 v6 y; q2 |4 W8 }
- *********************************************************************************************************
" |( e6 a+ J; B t6 c. Z/ t - * 函 数 名: CPU_CACHE_Enable P0 o( U" b' I; \7 {+ L
- * 功能说明: 使能L1 Cache; F8 U- A* j" ~1 R" ?& t
- * 形 参: 无
1 _0 r7 D) `3 t @ - * 返 回 值: 无2 n8 \& y+ d+ G
- *********************************************************************************************************
& k+ [6 M7 b7 C% N, t - */4 b6 ~. q7 a1 Y& h! S2 X' l
- static void CPU_CACHE_Enable(void)
* ^4 [. e, q+ O0 e' y - {9 A2 L3 \& O& O$ ~, v2 V K! \
- /* 使能 I-Cache */
2 B6 |' ^0 i: O K* L - SCB_EnableICache();
- R1 D6 f( _% d: C. T8 I - ( _: m7 x& F8 f* y
- /* 使能 D-Cache */
; @' S' P; T3 ^% | b0 ] - SCB_EnableDCache();
+ S- m! h j$ U. w( f9 a4 }4 z - }
复制代码 ( 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
- /*) v- |& W2 m( U1 C# [% S
- *********************************************************************************************************3 I8 ~4 Q, S! L
- * 函 数 名: main
1 v% _: I7 Z3 F ?0 {- | - * 功能说明: c程序入口/ ?, g- ^8 t2 D1 f; C' U
- * 形 参: 无3 I" L0 y' D6 H7 ~1 y: @0 k
- * 返 回 值: 错误代码(无需处理). i: B3 J7 Y5 E. f0 W- m% ]: R2 a
- *********************************************************************************************************
. [2 D7 ?- Q3 Q - */9 C4 g4 h3 D% x* c4 @3 b# @, ?
- int main(void)8 u& p, ?6 l3 Y! }8 x+ `
- {
9 h! T9 N4 [ U+ E- K' B) B' m - uint8_t ucKeyCode; /* 按键代码 */* m& c/ O2 a3 w" q( c2 \" l8 q* k
- uint32_t *DTCM_Addres0, *AXISRAM_Addres0, *SRAM1_Addres0, *SRAM4_Addres0;6 `+ G6 w" [& l* m% G4 g& M% I
- uint16_t *DTCM_Addres1, *AXISRAM_Addres1, *SRAM1_Addres1, *SRAM4_Addres1;7 s, i5 j4 D2 C
- uint8_t *DTCM_Addres2, *AXISRAM_Addres2, *SRAM1_Addres2, *SRAM4_Addres2;
s4 o2 m! D2 w8 E% F - 4 w, l0 h* O8 d/ j
! A- ~$ V" h4 w, D8 v- bsp_Init(); /* 硬件初始化 */
) m9 T* _" i: R3 L3 ]" ?% i - ' ]1 L0 q+ D/ g$ E' }: E1 E) P
- /* 初始化动态内存空间 */
6 j! u" W7 g9 K0 q, R8 K - osRtxMemoryInit(AppMallocDTCM, sizeof(AppMallocDTCM));
0 _$ Y& @7 D4 d+ C: u' H* z% f - osRtxMemoryInit(AppMallocAXISRAM, sizeof(AppMallocAXISRAM));2 x) |! j- D* ] A; f) j
- osRtxMemoryInit(AppMallocSRAM1, sizeof(AppMallocSRAM1));" o) o q, O0 j% G. x" ?
- osRtxMemoryInit(AppMallocSRAM4, sizeof(AppMallocSRAM4));
$ ]* s& Z; n5 X -
* C* T" @+ P# k3 D6 n - PrintfLogo(); /* 打印例程名称和版本等信息 */
- Z3 O" [9 }1 z4 j9 b4 Q+ ? - PrintfHelp(); /* 打印操作提示 */7 C1 @6 B5 L( e* d
9 p" ]$ J; W% m# M- bsp_StartAutoTimer(0, 100); /* 启动1个100ms的自动重装的定时器 */
- P0 _$ I- _2 x$ ?6 U -
- S6 @* P4 A2 v8 s2 O" b - ' n3 P7 ~* v5 p
- /* 进入主程序循环体 */: W; k. g7 `9 Q; z p5 y, `
- while (1)9 }* Q5 M4 d) c v6 U" j. K( r
- {
/ O( a' P( T! ^5 d9 w, k - bsp_Idle(); /* 这个函数在bsp.c文件。用户可以修改这个函数实现CPU休眠和喂狗 */
; S6 l4 `6 `; n1 j
8 E% h+ } N$ ~0 s5 ?8 k- /* 判断定时器超时时间 */
% ^, @2 e9 |! @: E2 n - if (bsp_CheckTimer(0))
, s6 K) r. `7 D9 ^0 v) D - {# I0 [ R1 N! o6 O
- /* 每隔100ms 进来一次 */ 6 p' |4 B$ X6 d# b3 I; e
- bsp_LedToggle(2);
9 N; p- Y- F2 I& d. i: \2 ? - }+ ]8 V' b. t+ T2 s1 {3 V7 i
- & s1 q$ g7 Z: X* v
- /* 按键滤波和检测由后台systick中断服务程序实现,我们只需要调用bsp_GetKey读取键值即可。 */
. _2 q' `2 ^5 r) `6 C - ucKeyCode = bsp_GetKey(); /* 读取键值, 无键按下时返回 KEY_NONE = 0 */! n5 q& V) o3 }. v5 G: w1 R
- if (ucKeyCode != KEY_NONE)
+ i+ L6 e- C4 ~. E4 {% W - {% P; ]* I5 N" m+ J6 H0 E, J; |
- switch (ucKeyCode)2 z2 O/ A7 I# e0 g4 g4 S
- {+ i- Q _6 \, H* H% K# {
- /* 从DTCM依次申请280字节,64字节和6111字节 */8 j. I, `" j+ r: v+ l' s! r. M; s
- case KEY_DOWN_K1:
) ~) k9 A+ O9 T: p+ e - /* 从DTCM申请280字节空间,使用指针变量DTCM_Addres0操作这些空间时不要超过280字节大小 */
7 ~/ e2 C* L: [2 \: ]! L) l5 m - printf("=========================================================\r\n");' k N+ e6 y }7 H+ u
- DTCM_Addres0 = osRtxMemoryAlloc(AppMallocDTCM, 280, 0);0 s) H* K! O" ~
- DTCMUsed = MemHeadPtr(AppMallocDTCM);
* `6 C( _/ K- g - printf("DTCM总大小 = %d字节,申请大小 = 0280字节,当前共使用大小 = %d字节\r\n",
' @" K3 d5 V; E5 a: ]( G6 r - DTCMUsed->size, DTCMUsed->used);, E9 p& Q+ ^: V3 d" o: _; g
-
& I0 h! E$ ? r5 q$ p4 k i9 V - /* 从DTCM申请64字节空间,使用指针变量DTCM_Addres1操作这些空间时不要超过64字节大小 */ / B" B! p4 a8 D% J# h+ l$ }- m
- DTCM_Addres1 = osRtxMemoryAlloc(AppMallocDTCM, 64, 0);
5 |" b6 x' \8 }) ~: {5 c- g - DTCMUsed = MemHeadPtr(AppMallocDTCM);
; v j) r! s$ l1 } c1 Q# p# M - printf("DTCM总大小 = %d字节,申请大小 = 0064字节,当前共使用大小 = %d字节\r\n",
! g7 }" E8 W' n/ ?8 m; x - DTCMUsed->size, DTCMUsed->used);
3 v3 K% }7 i% I* k% u# F -
# ]; g$ @+ _* }8 i( X* w* s- t - /* 从DTCM申请6111字节空间,使用指针变量DTCM_Addres2操作这些空间时不要超过6111字节大小 */
. R( y* N1 C4 m/ b; C' L - DTCM_Addres2 = osRtxMemoryAlloc(AppMallocDTCM, 6111, 0);
' }$ v/ f& O, j3 ` - DTCMUsed = MemHeadPtr(AppMallocDTCM);5 {0 L: Z, k; x& T# Q
- printf("DTCM总大小 = %d字节,申请大小 = 6111字节,当前共使用大小 = %d字节\r\n", 0 t% y# k# {) _ Q4 h6 S5 N, v* D
- DTCMUsed->size, DTCMUsed->used);
: |. @. I9 ^& x - break;+ | g J3 ~2 P6 @: }" c
-
4 ?( n- F% Y9 b - /* 释放从DTCM申请的空间 */8 j# @! \' B/ [8 E8 {5 l
- case KEY_UP_K1: $ H* Q, Z- [$ R: A% X4 @9 @1 c
- /* 释放从DTCM申请的280字节空间 */; w; L4 y! k4 d
- osRtxMemoryFree(AppMallocDTCM, DTCM_Addres0);
0 W' i" N+ D: B9 `+ Z6 P8 x - DTCMUsed = MemHeadPtr(AppMallocDTCM);) B- x7 A3 P8 h! n
- printf("释放DTCM动态内存区申请的0280字节,当前共使用大小 = %d字节\r\n",
; b) @6 E! S( w, e( C - DTCMUsed->used);, |" L: D6 a( g& o* v- f' a7 X
-
( V b7 z, f$ [! C7 s w9 G. r# d - /* 释放从DTCM申请的64字节空间 */5 E8 C. u8 z# R$ c1 W
- osRtxMemoryFree(AppMallocDTCM, DTCM_Addres1);) ~1 g" ]3 [$ A. f# L3 ?% x. H
- DTCMUsed = MemHeadPtr(AppMallocDTCM);! T3 r9 L( Y/ A$ U
- printf("释放DTCM动态内存区申请的0064字节,当前共使用大小 = %d字节\r\n",
3 b2 R& R& ~# E- G/ R" C; y0 C - DTCMUsed->used);
! n1 F9 e' G4 m- v9 g8 ~ -
7 ?' I- u( ]- |1 {" c3 _, w - /* 释放从DTCM申请的6111字节空间 */- |9 ~! @9 y, y& q7 [. m: F& ]1 N
- osRtxMemoryFree(AppMallocDTCM, DTCM_Addres2);( y) I1 O/ c) ]# @9 {' a$ t$ E
- DTCMUsed = MemHeadPtr(AppMallocDTCM);
' m: m9 ?% O$ \/ v. m5 M! D - printf("释放DTCM动态内存区申请的6111字节,当前共使用大小 = %d字节\r\n",: G' f7 N' w% S, V( U
- DTCMUsed->used);
k! R. R9 ~$ u - break;
! p9 P( U/ J5 u0 ]4 H4 E -
6 e/ ^4 i, O: t( i$ I' V$ g - /* 从AXI SRAM依次申请160字节,32字节和2333字节 */
7 U" e: T2 `( M8 ?9 u5 _ - case KEY_DOWN_K2:
4 F% }; K' J, L, t0 T3 H3 N - /* 从AXI SRAM 申请160字节空间,使用指针变量AXISRAM_Addres0操作这些空间时不要超过160字节大小 */
& h6 c1 h/ _* z - printf("=========================================================\r\n");
' n9 R, E* ]9 _1 P - AXISRAM_Addres0 = osRtxMemoryAlloc(AppMallocAXISRAM, 160, 0);
* U4 f# ?! `6 o X/ j$ d - AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);8 O4 g2 V/ S8 H. Q
- printf("AXI SRAM总大小 = %d字节,申请大小 = 0162字节,当前共使用大小 = %d字节\r\n",
8 h; P- C8 o. o7 K - AXISRAMUsed->size, AXISRAMUsed->used);) }" ~ x! ~6 ^. d/ T
-
: E, ~3 K9 C% |, j* N# M+ \9 m - /* 从AXI SRAM 申请32字节空间,使用指针变量AXISRAM_Addres1操作这些空间时不要超过32字节大小 */6 ~1 A9 R0 N8 |* G
- AXISRAM_Addres1 = osRtxMemoryAlloc(AppMallocAXISRAM, 32, 0);
$ e- b" x7 T' s+ Z I! Y - AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);4 h' r" y) y9 ^+ v
- printf("AXI SRAM总大小 = %d字节,申请大小 = 0032字节,当前共使用大小 = %d字节\r\n",
) A: ]. s7 j1 J2 Y - AXISRAMUsed->size, AXISRAMUsed->used);
& _/ X" w7 ?+ b* y6 v( e8 D. f; W - . u# O. O; e( C* @- T
- /* 从AXI SRAM 申请2333字节空间,使用指针变量AXISRAM_Addres2操作这些空间时不要超过2333字节大小 */ $ k" E6 S. ^% d' B& R
- AXISRAM_Addres2 = osRtxMemoryAlloc(AppMallocAXISRAM, 2333, 0);& H- J5 u8 A! }0 h1 d1 R) ^
- AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);4 T' b, {+ Q. N7 p- D
- printf("AXI SRAM总大小 = %d字节,申请大小 = 2333字节,当前共使用大小 = %d字节\r\n",
; o7 ~9 T& K7 `+ `. \ - AXISRAMUsed->size, AXISRAMUsed->used);
! }: O- ?) b* w - break;- Z6 } p" U/ y& p0 ~+ ~' k4 e- ?
- e% n( G5 W" W7 l* x4 p
- /* 释放从AXI SRAM申请的空间 */
, P0 }# u x6 f- |. A2 g* q - case KEY_UP_K2: ( S3 y* d0 }, ]2 Q7 }9 U4 c
- /* 释放从AXI SRAM申请的160字节空间 */$ d( ~# F( X0 [
- osRtxMemoryFree(AppMallocAXISRAM, AXISRAM_Addres0);
6 T- F% F+ U0 B7 q2 p - AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);
7 T" \3 G9 \% A. l$ V* r - printf("释放AXI SRAM动态内存区申请的0160字节,当前共使用大小 = %d字节\r\n",
* e7 B! J& e9 C3 r% @1 D2 `- f+ U$ L - AXISRAMUsed->used);
! `" V. U6 e- ^! | -
* S3 b5 A6 L/ g - /* 释放从AXI SRAM申请的32字节空间 */
/ b$ E% I% G3 @1 _ - osRtxMemoryFree(AppMallocAXISRAM, AXISRAM_Addres1);
1 f% k) I/ ]0 p# i( F+ ^ - AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);) x" ^; U7 c* |- j2 o* `& _
- printf("释放AXI SRAM动态内存区申请的0032字节,当前共使用大小 = %d字节\r\n",
" U% Y- H9 ^4 |, [5 I7 k' l7 ? - AXISRAMUsed->used);
& n+ t, T6 @0 }3 V - ' b# W" E8 m# i2 L
- /* 释放从AXI SRAM申请的2333字节空间 */
& g0 A7 n7 }! B; p. Z5 s - osRtxMemoryFree(AppMallocAXISRAM, AXISRAM_Addres2);1 ` T/ j) J; V3 Z/ ?) Q; c
- AXISRAMUsed = MemHeadPtr(AppMallocAXISRAM);0 G3 g/ Y% N% I4 c* r- ?
- printf("释放AXI SRAM动态内存区申请的2333字节,当前共使用大小 = %d字节\r\n",
9 F0 _6 D; m! X- r5 x1 Q" } - AXISRAMUsed->used);
- _7 t- i- a* G }' } - break;( V4 y+ Y) Z8 j
-
* B: W2 G+ U5 O - /* 从D2域SRAM依次申请200字节,96字节和4111字节 */' b- R g& f$ N
- case KEY_DOWN_K3:
8 [0 ], n* G- N, L# K$ d+ S - /* 从D2域的SRAM申请200字节空间,使用指针变量SRAM1_Addres0操作这些空间时不要超过200字节大小 */
2 f* E7 f# o3 S4 @" a, H - printf("=========================================================\r\n");
, U! ]: ?% L" c6 [ - SRAM1_Addres0 = osRtxMemoryAlloc(AppMallocSRAM1, 200, 0);
# W( o. C- O# V( O+ K- [1 I7 l$ b - SRAM1Used = MemHeadPtr(AppMallocSRAM1);# r% ?6 E) s( G9 J9 w
- printf("D2域SRAM总大小 = %d字节,申请大小 = 0200字节,当前共使用大小 = %d字节\r\n", 9 A8 m* ]$ q* r- `; B( D% w$ ~$ X: p
- SRAM1Used->size, SRAM1Used->used); m" [3 A; ?7 |5 i' i
- / w7 i+ j/ z$ \
- /* 从D2域的SRAM申请96字节空间,使用指针变量SRAM1_Addres1操作这些空间时不要超过96字节大小 */ ! Q. x1 O* c% }' T9 q4 f* l
- SRAM1_Addres1 = osRtxMemoryAlloc(AppMallocSRAM1, 96, 0);
& }; l8 y/ o" @. k X q* |$ r& { - SRAM1Used = MemHeadPtr(AppMallocSRAM1);4 r* m0 l, [5 ~6 W2 m
- printf("D2域SRAM总大小 = %d字节,申请大小 = 0096字节,当前共使用大小 = %d字节\r\n", 2 \# F. k6 ?4 e" `7 }4 {9 P* ]
- SRAM1Used->size, SRAM1Used->used);
2 A% n1 _0 T/ n/ T* \) w0 c0 ?$ m I -
: p: O$ v9 N; ]) E1 P7 Q - /* 从D2域的SRAM申请4111字节空间,使用指针变量SRAM1_Addres2操作这些空间时不要超过4111字节大小 */& N6 h& F+ `! y4 Q% c2 e
- SRAM1_Addres2 = osRtxMemoryAlloc(AppMallocSRAM1, 4111, 0);
- ^2 f% ~ g) e# I1 G# @( H - SRAM1Used = MemHeadPtr(AppMallocSRAM1);
, N2 Y% n# B: F+ M - printf("D2域SRAM总大小 = %d字节,申请大小 = 4111字节,当前共使用大小 = %d字节\r\n",
/ ?& a3 ^. c0 n' ^9 M2 I( ?6 a* } - SRAM1Used->size, SRAM1Used->used); x* D0 g9 T% [5 O
- break;; v% E' s% J7 G2 E) K
- & e; w2 e* Z" h
- /* 释放从D2域SRAM申请的空间 */
% @, J6 B4 v9 V4 ~6 N$ P- v - case KEY_UP_K3: & r# _5 t. h% v( G# y0 O9 q
- /* 释放从D2域的SRAM申请的200字节空间 */
3 e Z; `- {. H. W - osRtxMemoryFree(AppMallocSRAM1, SRAM1_Addres0);8 |$ [) ~7 k' }" S$ ?3 ~0 Y- s
- SRAM1Used = MemHeadPtr(AppMallocSRAM1);6 F0 I' b; L) G7 `4 e u, \
- printf("释放D2域SRAM动态内存区申请的0200字节,当前共使用大小 = %d字节\r\n",
0 n* V6 R' c$ F& D1 J: S5 E - SRAM1Used->used);
2 v/ G; a, q2 e& L4 g. ~ -
: ^2 J4 j) G r( N8 u0 J - /* 释放从D2域的SRAM申请的96字节空间 *// f# W, R. N) c( ~2 }0 l
- osRtxMemoryFree(AppMallocSRAM1, SRAM1_Addres1);
2 A! r! L+ K; H6 L2 w; Q - SRAM1Used = MemHeadPtr(AppMallocSRAM1);% e9 Y% Q$ q, q! k: Y
- printf("释放D2域SRAM动态内存区申请的0096字节,当前共使用大小 = %d字节\r\n",7 J9 E" _5 V( o5 [: I
- SRAM1Used->used);4 C/ _! ~1 S% \. F! O+ [
-
6 Q. ^1 m3 M& g: k - /* 释放从D2域的SRAM申请的4111字节空间 */ j5 l: F l& V$ @" m& P
- osRtxMemoryFree(AppMallocSRAM1, SRAM1_Addres2);
0 P/ { z* Y' M m& J- G5 N1 ] - SRAM1Used = MemHeadPtr(AppMallocSRAM1);
4 h$ S2 n, `) W# R+ ?) ~, B - printf("释放D2域SRAM动态内存区申请的4111字节,当前共使用大小 = %d字节\r\n",, l. f3 l* J6 p
- SRAM1Used->used);
, a% Q2 A6 @, V7 r2 g4 F - break;* p; k4 `2 G/ q7 ]- h* o
-
5 | F# f4 M: B/ J L2 N9 L - /* 从D3域SRAM依次申请300字节,128字节和5111字节 */+ e* n! y t8 ]3 `; o5 Q
- case JOY_DOWN_OK:
7 z) K& T: b; E8 f: Q8 K - /* 从D3域的SRAM申请300字节空间,使用指针变量SRAM4_Addres0操作这些空间时不要超过300字节大小 */
]+ t m% E! |9 U2 s - printf("=========================================================\r\n");
& O4 M$ m; p& l5 s2 ~+ f - SRAM4_Addres0 = osRtxMemoryAlloc(AppMallocSRAM4, 300, 0);/ u C6 X- K* @, ?& h( ~& j
- SRAM4Used = MemHeadPtr(AppMallocSRAM4);
' K+ L# U+ X, r2 _+ t8 h - printf("D3域SRAM总大小 = %d字节,申请大小 = 0300字节,当前共使用大小 = %d字节\r\n",
0 S+ o+ M9 i0 n$ W8 R, S' m - SRAM4Used->size, SRAM4Used->used);3 N$ E; k- F, Q# s" n) U$ K" r1 v
- , @- t1 u: q+ B6 q" K
- /* 从D3域的SRAM申请96字节空间,使用指针变量SRAM4_Addres1操作这些空间时不要超过96字节大小 */' T2 |+ b* }' W# i
- SRAM4_Addres1 = osRtxMemoryAlloc(AppMallocSRAM4, 128, 0);7 M& r8 T2 i( C# w% q% h8 m
- SRAM4Used = MemHeadPtr(AppMallocSRAM4);; Q2 A9 s; w8 Q; @! r+ G
- printf("D3域SRAM总大小 = %d字节,申请大小 = 0128字节,当前共使用大小 = %d字节\r\n", - N" a3 s; g! I L" Z' R# X
- SRAM4Used->size, SRAM4Used->used);& X* ?! {' N4 ?, d+ l, n" R
-
+ ?, N* L- a* H' R) h - /* 从D3域的SRAM申请5111字节空间,使用指针变量SRAM4_Addres2操作这些空间时不要超过5111字节大小 */! D9 E f1 r; m9 k% R! c* g
- SRAM4_Addres2 = osRtxMemoryAlloc(AppMallocSRAM4, 5111, 0);
# B/ R1 R- c6 i - SRAM4Used = MemHeadPtr(AppMallocSRAM4);/ U0 X7 U, n; l1 e' f. ?) C" n8 f
- printf("D3域SRAM总大小 = %d字节,申请大小 = 5111字节,当前共使用大小 = %d字节\r\n",
0 r0 J" r; N! m# y! R% { - SRAM4Used->size, SRAM4Used->used);1 t4 Q- p1 p- }; x4 ]
- break;
8 G& ~7 M Z/ m6 H -
$ A% f( A( u$ F; R - /* 释放从D3域SRAM申请的空间 */
7 t: `# y' S* t2 O - case JOY_UP_OK: ( G, z! Z/ @3 U# ^* k
- /* 释放从D3域的SRAM申请的300字节空间 */
" U6 i* ~0 V2 }1 g) f% a2 j. U* a7 A - osRtxMemoryFree(AppMallocSRAM4, SRAM4_Addres0);
4 B) P. F9 @5 V - SRAM4Used = MemHeadPtr(AppMallocSRAM4);
/ _* U6 c6 P/ g* X - printf("释放D3域SRAM动态内存区申请的0300字节,当前共使用大小 = %d字节\r\n",
% f. g8 F+ d% G4 {: v9 y* q - SRAM4Used->used); d' r* c- A9 H8 e
-
* P1 J/ g s: x% ^4 `7 T - /* 释放从D3域的SRAM申请的128字节空间 */
- m2 a" r& R" g: G' t - osRtxMemoryFree(AppMallocSRAM4, SRAM4_Addres1);6 q/ B1 U# G) c9 x" E0 s3 K
- SRAM4Used = MemHeadPtr(AppMallocSRAM4);: d# @7 ]+ A& [7 E+ F, Z9 ^3 w; M$ B
- printf("释放D3域SRAM动态内存区申请的0128字节,当前共使用大小 = %d字节\r\n",. x1 B2 l5 _, i+ m ~+ F
- SRAM4Used->used);
+ K; w% O: @, {+ b -
2 g/ t* [& V9 D$ ?% K0 j8 z - /* 释放从D3域的SRAM申请的5111字节空间 */1 O' Z& u' z1 s: |6 H: A
- osRtxMemoryFree(AppMallocSRAM4, SRAM4_Addres2);
0 p, R$ q) x4 |8 ^4 A7 M - SRAM4Used = MemHeadPtr(AppMallocSRAM4);
% N8 p2 S1 }0 {( f9 R - printf("释放D3域SRAM动态内存区申请的5111字节,当前共使用大小 = %d字节\r\n",4 p2 W$ ^2 d$ |# ?+ t Z% v
- SRAM4Used->used);
$ J1 X4 Y6 ^# _8 Z* U" x2 L - break;! N3 m9 c% u) ~5 `6 }; ?
-
) l7 b/ s# i3 l - default:
8 f0 Q9 [4 u# `1 m+ ^8 b7 I% n - /* 其它的键值不处理 */( Z% k2 V) \ M1 p* R w
- break;
+ R/ [' D9 C0 F$ {, b- b- W - }* M m. x( C: b7 u+ Y3 M
- }7 q2 Z9 S! M6 Y/ w
- }( \/ t" Q- l+ K" H" Z+ v
- }
复制代码
/ 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 |