• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 静态内存<a name="ZH-CN_TOPIC_0000001078876516"></a>
2
3-   [运行机制](#section165473517522)
4-   [开发指导](#section57511620165218)
5    -   [使用场景](#section215474911529)
6    -   [接口说明](#section79231214539)
7    -   [开发流程](#section1388511316548)
8    -   [编程实例](#section17801515105519)
9    -   [结果验证](#section11818154112319)
10
11
12## 运行机制<a name="section165473517522"></a>
13
14静态内存实质上是一个静态数组,静态内存池内的块大小在初始化时设定,初始化后块大小不可变更。
15
16静态内存池由一个控制块LOS\_MEMBOX\_INFO和若干相同大小的内存块LOS\_MEMBOX\_NODE构成。控制块位于内存池头部,用于内存块管理,包含内存块大小uwBlkSize,内存块数量uwBlkNum,已分配使用的内存块数量uwBlkCnt和空闲内存块链表stFreeList。内存块的申请和释放以块大小为粒度,每个内存块包含指向下一个内存块的指针pstNext。
17
18**图 1**  静态内存示意图<a name="fig1081017327364"></a>
19![](figure/静态内存示意图.png "静态内存示意图")
20
21## 开发指导<a name="section57511620165218"></a>
22
23### 使用场景<a name="section215474911529"></a>
24
25当用户需要使用固定长度的内存时,可以通过静态内存分配的方式获取内存,一旦使用完毕,通过静态内存释放函数归还所占用内存,使之可以重复使用。
26
27### 接口说明<a name="section79231214539"></a>
28
29OpenHarmony LiteOS-M的静态内存管理主要为用户提供以下功能,接口详细信息可以查看API参考。
30
31**表 1**  静态内存模块接口
32
33<a name="table1415203765610"></a>
34<table><thead align="left"><tr id="row134151837125611"><th class="cellrowborder" valign="top" width="16.19161916191619%" id="mcps1.2.4.1.1"><p id="p16415637105612"><a name="p16415637105612"></a><a name="p16415637105612"></a>功能分类</p>
35</th>
36<th class="cellrowborder" valign="top" width="22.472247224722473%" id="mcps1.2.4.1.2"><p id="p11415163718562"><a name="p11415163718562"></a><a name="p11415163718562"></a>接口名</p>
37</th>
38<th class="cellrowborder" valign="top" width="61.33613361336133%" id="mcps1.2.4.1.3"><p id="p1641533755612"><a name="p1641533755612"></a><a name="p1641533755612"></a>描述</p>
39</th>
40</tr>
41</thead>
42<tbody><tr id="row0415737175610"><td class="cellrowborder" valign="top" width="16.19161916191619%" headers="mcps1.2.4.1.1 "><p id="p2990613114416"><a name="p2990613114416"></a><a name="p2990613114416"></a>初始化静态内存池</p>
43</td>
44<td class="cellrowborder" valign="top" width="22.472247224722473%" headers="mcps1.2.4.1.2 "><p id="p169901113194416"><a name="p169901113194416"></a><a name="p169901113194416"></a>LOS_MemboxInit</p>
45</td>
46<td class="cellrowborder" valign="top" width="61.33613361336133%" headers="mcps1.2.4.1.3 "><p id="p5990113174414"><a name="p5990113174414"></a><a name="p5990113174414"></a>初始化一个静态内存池,根据入参设定其起始地址、总大小及每个内存块大小。</p>
47</td>
48</tr>
49<tr id="row1841519376561"><td class="cellrowborder" valign="top" width="16.19161916191619%" headers="mcps1.2.4.1.1 "><p id="p9367164904413"><a name="p9367164904413"></a><a name="p9367164904413"></a>清除静态内存块内容</p>
50</td>
51<td class="cellrowborder" valign="top" width="22.472247224722473%" headers="mcps1.2.4.1.2 "><p id="p103671549144411"><a name="p103671549144411"></a><a name="p103671549144411"></a>LOS_MemboxClr</p>
52</td>
53<td class="cellrowborder" valign="top" width="61.33613361336133%" headers="mcps1.2.4.1.3 "><p id="p18367184916448"><a name="p18367184916448"></a><a name="p18367184916448"></a>清零从静态内存池中申请的静态内存块的内容。</p>
54</td>
55</tr>
56<tr id="row1187514443616"><td class="cellrowborder" rowspan="2" valign="top" width="16.19161916191619%" headers="mcps1.2.4.1.1 "><p id="p64541711458"><a name="p64541711458"></a><a name="p64541711458"></a>申请、释放静态内存</p>
57</td>
58<td class="cellrowborder" valign="top" width="22.472247224722473%" headers="mcps1.2.4.1.2 "><p id="p84547710452"><a name="p84547710452"></a><a name="p84547710452"></a>LOS_MemboxAlloc</p>
59</td>
60<td class="cellrowborder" valign="top" width="61.33613361336133%" headers="mcps1.2.4.1.3 "><p id="p5454177164520"><a name="p5454177164520"></a><a name="p5454177164520"></a>从指定的静态内存池中申请一块静态内存块。</p>
61</td>
62</tr>
63<tr id="row1745415527441"><td class="cellrowborder" valign="top" headers="mcps1.2.4.1.1 "><p id="p645457204512"><a name="p645457204512"></a><a name="p645457204512"></a>LOS_MemboxFree</p>
64</td>
65<td class="cellrowborder" valign="top" headers="mcps1.2.4.1.2 "><p id="p545415704514"><a name="p545415704514"></a><a name="p545415704514"></a>释放从静态内存池中申请的一块静态内存块。</p>
66</td>
67</tr>
68<tr id="row19101718144518"><td class="cellrowborder" rowspan="2" valign="top" width="16.19161916191619%" headers="mcps1.2.4.1.1 "><p id="p15927427144615"><a name="p15927427144615"></a><a name="p15927427144615"></a>获取、打印静态内存池信息</p>
69</td>
70<td class="cellrowborder" valign="top" width="22.472247224722473%" headers="mcps1.2.4.1.2 "><p id="p792715277464"><a name="p792715277464"></a><a name="p792715277464"></a>LOS_MemboxStatisticsGet</p>
71</td>
72<td class="cellrowborder" valign="top" width="61.33613361336133%" headers="mcps1.2.4.1.3 "><p id="p139271327114620"><a name="p139271327114620"></a><a name="p139271327114620"></a>获取指定静态内存池的信息,包括内存池中总内存块数量、已经分配出去的内存块数量、每个内存块的大小。</p>
73</td>
74</tr>
75<tr id="row1346314166464"><td class="cellrowborder" valign="top" headers="mcps1.2.4.1.1 "><p id="p8927102754619"><a name="p8927102754619"></a><a name="p8927102754619"></a>LOS_ShowBox</p>
76</td>
77<td class="cellrowborder" valign="top" headers="mcps1.2.4.1.2 "><p id="p49274279460"><a name="p49274279460"></a><a name="p49274279460"></a>打印指定静态内存池所有节点信息(打印等级是LOS_INFO_LEVEL),包括内存池起始地址、内存块大小、总内存块数量、每个空闲内存块的起始地址、所有内存块的起始地址。</p>
78</td>
79</tr>
80</tbody>
81</table>
82
83>![](../public_sys-resources/icon-note.gif) **说明:**
84>初始化后的内存池的内存块数量,不等于总大小除于内存块大小,因为内存池的控制块和每个内存块的控制头,都存在内存开销,设置总大小时,需要将这些因素考虑进去。
85
86### 开发流程<a name="section1388511316548"></a>
87
88本节介绍使用静态内存的典型场景开发流程。
89
901.  规划一片内存区域作为静态内存池。
912.  调用LOS\_MemboxInit初始化静态内存池。
92
93    初始化会将入参指定的内存区域分割为N块(N值取决于静态内存总大小和块大小),将所有内存块挂到空闲链表,在内存起始处放置控制头。
94
953.  调用LOS\_MemboxAlloc接口分配静态内存。
96
97    系统将会从空闲链表中获取第一个空闲块,并返回该内存块的起始地址。
98
994.  调用LOS\_MemboxClr接口。
100
101    将入参地址对应的内存块清零。
102
1035.  调用LOS\_MemboxFree接口。
104
105    将该内存块加入空闲链表。
106
107
108### 编程实例<a name="section17801515105519"></a>
109
110本实例执行以下步骤:
111
1121.  初始化一个静态内存池。
1132.  从静态内存池中申请一块静态内存。
1143.  在内存块存放一个数据。
1154.  打印出内存块中的数据。
1165.  清除内存块中的数据。
1176.  释放该内存块。
118
119    示例代码如下:
120
121
122```
123#include "los_membox.h"
124
125VOID Example_StaticMem(VOID)
126{
127    UINT32 *mem = NULL;
128    UINT32 blkSize = 10;
129    UINT32 boxSize = 100;
130    UINT32 boxMem[1000];
131    UINT32 ret;
132
133    /*内存池初始化*/
134    ret = LOS_MemboxInit(&boxMem[0], boxSize, blkSize);
135    if(ret != LOS_OK) {
136        printf("Membox init failed!\n");
137        return;
138    } else {
139        printf("Membox init success!\n");
140    }
141
142    /*申请内存块*/
143    mem = (UINT32 *)LOS_MemboxAlloc(boxMem);
144    if (NULL == mem) {
145        printf("Mem alloc failed!\n");
146        return;
147    }
148    printf("Mem alloc success!\n");
149
150    /*赋值*/
151    *mem = 828;
152    printf("*mem = %d\n", *mem);
153
154    /*清除内存内容*/
155    LOS_MemboxClr(boxMem, mem);
156    printf("Mem clear success \n *mem = %d\n", *mem);
157
158    /*释放内存*/
159    ret = LOS_MemboxFree(boxMem, mem);
160    if (LOS_OK == ret) {
161        printf("Mem free success!\n");
162    } else {
163        printf("Mem free failed!\n");
164    }
165
166    return;
167}
168```
169
170### 结果验证<a name="section11818154112319"></a>
171
172输出结果如下:
173
174```
175Membox init success!
176Mem alloc success!
177*mem = 828
178Mem clear success
179*mem = 0
180Mem free success!
181```
182
183