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