LiteOS中的内存管理与动态内存分配

发布时间: 2024-01-04 00:23:39 阅读量: 31 订阅数: 25
# 简介 ## 1.1 LiteOS概述 LiteOS是华为公司自主研发的轻量级物联网操作系统,旨在为物联网设备提供高效、灵活、安全的操作系统支持。LiteOS具有占用资源少、启动速度快、功耗低等特点,广泛应用于智能家居、车联网、智能穿戴等领域。 ## 1.2 内存管理的重要性 内存管理是操作系统中的核心功能之一,它负责管理和分配系统的内存资源。内存资源的合理利用对系统的性能、稳定性和安全性都有着重要的影响。一个高效的内存管理系统能提升系统的整体性能,有效地减少内存碎片,避免内存泄漏和溢出等问题。 精细的内存管理可以降低系统的内存占用率,提高资源的利用效率,从而实现更高效的系统运行和更好的用户体验。在LiteOS开发中,内存管理扮演着重要的角色,需要采用合适的内存分配算法和管理策略,确保系统的稳定性和性能优化。 ### 2. 内存管理基础知识 内存管理是操作系统中一个非常重要的功能,在LiteOS中也是必不可少的。本章将介绍一些内存管理的基础知识,包括内存管理的原理与目标,以及静态内存分配与动态内存分配的区别。 #### 2.1 内存管理的原理与目标 内存管理的主要目标是有效地管理系统的内存资源,为进程或线程提供合理分配和释放内存的机制。内存管理的原理主要包括以下几个方面: - 内存分区:将物理内存划分为若干个不同大小的区域,以便用于存储不同类型的数据或代码。 - 内存分配:根据进程或线程的需要,分配合适大小的内存区域给其使用。 - 内存回收:当进程或线程不再需要某块内存时,将其释放回系统,以供其他进程或线程使用。 - 内存保护:通过权限管理和地址空间隔离等机制,保证每个进程或线程只能访问其所分配的内存区域。 - 内存共享:为提高内存利用率和进程间通信的效率,允许多个进程或线程共享同一块内存区域。 #### 2.2 静态内存分配与动态内存分配的区别 静态内存分配是在编译时完成的,程序运行时所需的内存空间在编译阶段就已经确定。静态内存分配适用于确定的数据结构,它的优点是分配和释放内存的效率较高,但缺点是灵活性较差,需要预先分配固定大小的内存空间。 动态内存分配是在程序运行时根据需要进行内存分配和释放的一种方式,适用于大小不确定或需要频繁变化的数据结构。动态内存分配的优点是灵活性较好,可以根据实际需求进行内存分配和释放,但缺点是分配和释放内存的开销较大,容易产生内存碎片。 在LiteOS中,为了更好地管理内存资源,通常采用动态内存分配的方式。下一章节将介绍LiteOS中的内存分配算法。 ### 3. LiteOS中的内存分配算法 在LiteOS中,内存分配算法是实现内存管理的核心。LiteOS使用了多种不同的内存分配算法来满足不同的需求和场景。以下是LiteOS中常用的内存分配算法: #### 3.1 伙伴系统(Buddy System) 伙伴系统是一种静态内存分配算法,它将内存按照2的幂次进行划分,形成一颗完全二叉树。每个节点代表一块内存区域,树的根节点代表整个可分配的内存空间。 伙伴系统通过将相邻的内存块合并成更大的内存块来满足分配请求,同时也能将较大的内存块分割为较小的内存块。这种算法的优点是分配和回收速度较快,但是会产生一定的内存碎片。 #### 3.2 快递员算法(Slab Allocator) 快递员算法是一种动态内存分配算法,它将内存划分为多个大小固定的slab,每个slab包含一定数量的内存块。每个slab分配器维护一个空闲链表,用于管理可用的内存块。 快递员算法通过预分配一定数量的slab和内存块,可以快速满足内存分配请求。当没有足够的内存块时,系统会再次分配一个新的slab。这种算法的优点是避免了内存碎片问题,但对于不同大小的内存块,需要使用不同的slab分配器。 #### 3.3 基于堆的动态内存分配算法 基于堆的动态内存分配算法是一种常见的内存分配算法,它使用堆数据结构来管理内存空间。LiteOS中常用的堆分配算法包括首次适应算法、最佳适应算法和最差适应算法。 首次适应算法会在堆中寻找第一个满足分配请求的内存块,速度较快,但可能会产生大量的内存碎片。最佳适应算法会在堆中寻找最小合适的内存块进行分配,可以减少内存碎片,但分配速度较慢。最差适应算法会在堆中寻找最大的空闲内存块进行分配,可以减少内存碎片,但分配速度较慢。 基于堆的动态内存分配算法在LiteOS中非常灵活,可以根据实际需求选择合适的算法来管理内存空间。 在LiteOS中,以上的内存分配算法可以根据具体场景进行选择和组合使用,以满足各种不同的内存需求。这些算法在提高内存利用率的同时,也需要考虑内存分配的效率和内存碎片的处理。下面的章节将介绍LiteOS中的一些内存管理策略。 ### 4. LiteOS中的内存管理策略 在LiteOS中,内存管理策略是确保系统能够高效利用和管理内存资源的关键。下面将介绍LiteOS中常用的内存管理策略及其原理和实现方式。 #### 4.1 内存池管理 内存池管理是一种预先分配一定数量的内存块,并将其保存在一个内存池中的策略。LiteOS中采用内存池的方式来管理内存,通过对内存块的分配和回收来满足不同任务的内存需求。 内存池管理的优势在于可以提高内存分配的效率和减少内存碎片。通过预先分配一定数量的内存块到内存池中,可以避免频繁的内存分配和释放操作,从而提高系统的响应速度。同时,内存池管理还可以减少内存碎片的产生,提高内存利用率。 下面是一个使用内存池管理的示例代码,以C语言为例: ```c #include <stdio.h> #include <stdlib.h> #define POOL_SIZE 100 #define BLOCK_SIZE 10 typedef struct { int data; } Block; typedef struct { Block data[POOL_SIZE]; int freeList[POOL_SIZE]; int freeIndex; } MemoryPool; void allocateBlock(MemoryPool* pool) { if (pool->freeIndex >= POOL_SIZE) { printf("Memory pool is full\n"); return; } int index = pool->freeList[pool->freeIndex]; pool->freeIndex++; printf("Allocated block at index %d\n", index); } void freeBlock(MemoryPool* pool, int index) { if (index < 0 || index >= POOL_SIZE) { printf("Invalid block index\n"); return; } pool->freeList[pool->freeIndex] = index; pool->freeIndex--; printf("Freed block at index %d\n", index); } int main() { MemoryPool pool; pool.freeIndex = 0; // 初始化内存池 for (int i = 0; i < POOL_SIZE; i++) { pool.freeList[i] = i; } // 分配内存块 allocateBlock(&pool); allocateBlock(&pool); allocateBlock(&pool); // 释放内存块 freeBlock(&pool, 1); freeBlock(&pool, 2); return 0; } ``` 代码解析: - `MemoryPool` 结构体用于表示内存池,其中 `data` 数组保存实际的内存块,`freeList` 数组保存空闲内存块的索引,`freeIndex` 表示空闲内存块的下一个可用索引。 - `allocateBlock` 函数用于分配内存块,它将从 `freeList` 中获取一个空闲的索引,并将其标记为已使用。 - `freeBlock` 函数用于释放内存块,它将将不再使用的索引加入 `freeList`,并更新 `freeIndex`。 - 在 `main` 函数中,首先初始化内存池,然后分配和释放内存块。 运行结果: ``` Allocated block at index 0 Allocated block at index 1 Allocated block at index 2 Freed block at index 1 Freed block at index 2 ``` 代码总结: 通过使用内存池管理,我们可以实现对内存的高效分配和回收,有效地利用系统的内存资源。 #### 4.2 内存碎片整理与回收 内存碎片是指由于内存分配和释放的不均衡导致的一小块或多小块未被使用的内存空间。内存碎片的存在会浪费内存资源,并可能影响内存分配的效率。 为了解决内存碎片问题,LiteOS中采用内存碎片整理与回收的策略。内存碎片整理是指将多个小碎片的内存块合并成一个大的内存块,以提高内存利用率。内存碎片回收是指将未被使用的内存块重新放回内存池,以增加可用内存空间。 下面是一个使用内存碎片整理与回收的示例代码,以C语言为例: ```c #include <stdio.h> #include <stdlib.h> #define POOL_SIZE 100 #define BLOCK_SIZE 10 typedef struct { int data; } Block; typedef struct { Block data[POOL_SIZE]; int freeList[POOL_SIZE]; int freeIndex; } MemoryPool; void allocateBlock(MemoryPool* pool) { if (pool->freeIndex >= POOL_SIZE) { printf("Memory pool is full\n"); return; } int index = pool->freeList[pool->freeIndex]; pool->freeIndex++; printf("Allocated block at index %d\n", index); } void freeBlock(MemoryPool* pool, int index) { if (index < 0 || index >= POOL_SIZE) { printf("Invalid block index\n"); return; } pool->freeList[pool->freeIndex] = index; pool->freeIndex--; printf("Freed block at index %d\n", index); } void defragment(MemoryPool* pool) { int i = 0, j = 0; while (i < POOL_SIZE) { if (pool->data[i].data == -1) { j = i + 1; while (j < POOL_SIZE && pool->data[j].data == -1) { j++; } if (j < POOL_SIZE) { pool->data[i] = pool->data[j]; pool->data[j].data = -1; } } i++; } printf("Defragmented memory pool\n"); } int main() { MemoryPool pool; pool.freeIndex = 0; // 初始化内存池 for (int i = 0; i < POOL_SIZE; i++) { pool.freeList[i] = i; } // 分配内存块 allocateBlock(&pool); allocateBlock(&pool); allocateBlock(&pool); // 释放内存块 freeBlock(&pool, 1); // 内存碎片整理 defragment(&pool); return 0; } ``` 代码解析: - `defragment` 函数用于进行内存碎片整理,它会将多个连续的空闲内存块合并成一个更大的内存块。 - 在 `main` 函数中,首先初始化内存池,然后分配和释放内存块,最后进行内存碎片整理。 运行结果: ``` Allocated block at index 0 Allocated block at index 1 Allocated block at index 2 Freed block at index 1 Defragmented memory pool ``` 代码总结: 通过内存碎片整理与回收,我们可以充分利用内存资源,提高内存利用率,从而提高系统的性能和响应速度。 #### 4.3 内存地址对齐与优化 在LiteOS中,内存地址对齐是一种提高内存访问速度和效率的策略。内存地址对齐是指将数据存储在内存中时,使其起始地址能够被规定的字节大小整除。 内存地址对齐可以加快内存读写的速度,提高存储系统的效率。在某些处理器架构中,当访问未对齐的内存地址时,可能会引发异常,导致性能降低。 下面是一个使用内存地址对齐的示例代码,以C语言为例: ```c #include <stdio.h> #include <stdlib.h> typedef struct { int data; char name[10]; } Data; int main() { Data* data = (Data*)malloc(sizeof(Data)); // 输出结构体地址 printf("Data address: %p\n", data); // 输出成员变量地址 printf("Data data address: %p\n", &data->data); free(data); return 0; } ``` 代码解析: - `Data` 结构体包含一个整型变量 `data` 和一个 char 数组 `name`。 - 在 `main` 函数中,通过 `malloc` 函数动态分配了一个 `Data` 结构体的内存,并输出了结构体地址和成员变量地址。 - 最后使用 `free` 函数释放了内存。 运行结果: ``` Data address: 0x7fe14a400cf0 Data data address: 0x7fe14a400cf0 ``` 代码总结: 通过合理的内存地址对齐,我们可以提高内存访问的效率和速度,从而提升系统的性能。 这就是LiteOS中的内存管理策略。通过合理的内存池管理、内存碎片整理与回收以及内存地址对齐与优化等策略,LiteOS能够高效利用内存资源,提高系统性能和响应速度。 ## 5. LiteOS中的内存安全与保护 在开发和运行过程中,内存安全和保护是至关重要的。LiteOS提供了一些机制来确保内存的安全性和保护性,以避免常见的内存问题。 ### 5.1 内存泄漏的检测与处理 内存泄漏是指在使用完内存后没有正确释放,导致内存无法再被其他程序使用,造成了内存资源的浪费。为了检测和处理内存泄漏问题,LiteOS提供了一些工具和技术。 LiteOS中的内存分配器通常会跟踪每个内存块的分配和释放,可以通过查看内存分配器的统计信息来检测任何未释放的内存块。如果发现有大量未释放的内存块,可以使用内存分析工具进行进一步的分析,以找出导致内存泄漏的原因,并对代码进行修复。 以下是一个示例,展示了如何使用LiteOS内存分配器的统计信息来检测内存泄漏: ```python # 分配一个内存块 ptr = malloc(sizeof(MyStruct)) # 使用内存块 # ... # 释放内存块 free(ptr) # 检查内存分配器的统计信息 alloc_count = get_alloc_count() free_count = get_free_count() leak_count = alloc_count - free_count if leak_count > 0: print("发现内存泄漏,泄漏数量:", leak_count) # 进一步的处理和修复代码 ``` ### 5.2 内存溢出的预防与处理 内存溢出是指程序请求分配的内存超过了系统实际可用的内存大小,导致程序崩溃或者出现不可预测的行为。为了预防和处理内存溢出问题,LiteOS提供了一些机制和策略。 LiteOS中的内存分配器通常会检查是否有足够的可用内存来满足分配请求,如果没有足够的可用内存,则会返回分配失败的结果。在代码中,可以使用返回值来判断内存分配是否成功,并对分配失败的情况进行适当的处理。 以下是一个示例,展示了如何使用LiteOS内存分配器来预防和处理内存溢出问题: ```java // 分配一个内存块 byte[] buffer = malloc(bufferSize); if (buffer != null) { // 使用内存块 // ... // 释放内存块 free(buffer); } else { // 分配失败的处理 System.out.println("内存溢出,分配失败"); // 其他处理代码 } ``` ### 5.3 访问越界和悬空指针的保护 访问越界和悬空指针是常见的内存问题,会导致程序崩溃或者出现不可预测的行为。为了保护程序免受这些问题的影响,LiteOS提供了一些安全措施和技术。 在LiteOS中,可以通过使用安全的数据结构和算法,以及对指针的正确使用来避免访问越界和悬空指针问题。此外,LiteOS还提供了一些检测工具和机制,如地址检查和空指针检查,来帮助发现和处理访问越界和悬空指针问题。 以下是一个示例,展示了如何在LiteOS中进行地址检查和空指针检查: ```go // 进行地址检查 if is_valid_address(ptr) { // 正确访问内存 value = *ptr // ... } else { // 地址错误的处理 fmt.Println("无效的内存地址") // 其他处理代码 } // 进行空指针检查 if ptr != nil { // 正确访问内存 value = *ptr // ... } else { // 空指针的处理 fmt.Println("空指针错误") // 其他处理代码 } ``` 通过使用上述的内存安全和保护机制,可以帮助开发人员在LiteOS中有效地预防和处理内存问题,提高系统的稳定性和可靠性。 这里展示了LiteOS中的一些内存安全和保护机制,包括内存泄漏的检测与处理、内存溢出的预防与处理,以及访问越界和悬空指针的保护。通过合理地使用这些机制,可以确保LiteOS系统的内存安全性和保护性。 ### 6. 总结与展望 在本文中,我们深入探讨了LiteOS中的内存管理。首先,我们介绍了LiteOS和内存管理的重要性。然后,我们深入了解了内存管理的基础知识,包括内存管理的原理与目标,以及静态内存分配与动态内存分配的区别。接着,我们详细介绍了LiteOS中使用的内存分配算法,包括伙伴系统、快递员算法和基于堆的动态内存分配算法。然后,我们讨论了LiteOS中的内存管理策略,包括内存池管理、内存碎片整理与回收,以及内存地址对齐与优化。在第五部分,我们深入了解了LiteOS中的内存安全与保护措施,包括内存泄漏的检测与处理,内存溢出的预防与处理,以及访问越界和悬空指针的保护。最后,在本文的最后一部分,我们将对LiteOS中内存管理的优势和挑战进行总结,同时展望未来的发展方向和技术趋势。 在未来,随着物联网和嵌入式系统的快速发展,内存管理将继续成为一个重要的研究领域。在LiteOS中,我们可以期待更加高效和安全的内存管理策略的出现,以满足不断增长的嵌入式设备对内存管理的需求。同时,随着人工智能、大数据和边缘计算等新兴技术的兴起,内存管理在嵌入式系统中的应用也将面临新的挑战和机遇。我们期待LiteOS能够在内存管理领域继续发挥重要作用,为更多的嵌入式设备提供高效、稳定的内存管理解决方案。 总之,LiteOS中的内存管理是一个复杂而又重要的课题。通过深入学习和了解LiteOS中的内存管理策略,我们将能够更好地应对嵌入式系统中的内存管理挑战,同时为未来的技术发展做出贡献。 --- 以上就是第六章节的内容,总结了整篇文章的要点,并展望了未来的发展趋势。
corwn 最低0.47元/天 解锁专栏
赠618次下载
profit 百万级 高质量VIP文章无限畅学
profit 千万级 优质资源任意下载
profit C知道 免费提问 ( 生成式Al产品 )

相关推荐

物联网_赵伟杰

物联网专家
12年毕业于人民大学计算机专业,有超过7年工作经验的物联网及硬件开发专家,曾就职于多家知名科技公司,并在其中担任重要技术职位。有丰富的物联网及硬件开发经验,擅长于嵌入式系统设计、传感器技术、无线通信以及智能硬件开发等领域。
专栏简介
liteos专栏涵盖了丰富的主题,旨在深入探讨LiteOS操作系统的各个方面。从LiteOS的介绍与入门指南开始,涉及任务调度、时间管理、内存管理、任务间通信与同步、中断处理、外设驱动开发、文件系统、网络协议栈、节能策略、嵌入式实时系统开发、异常处理、任务优先级与调度算法、硬件抽象层、物联网设备开发、多核处理与并发编程、内核设计原理与架构、虚拟化技术与容器管理、安全代码编写与漏洞修复、信号处理与事件触发等方面。本专栏将帮助读者深入理解LiteOS的设计思想、内部机制和应用实践,为从事嵌入式系统开发和物联网设备编程的从业者提供宝贵的指导和实用技巧。
最低0.47元/天 解锁专栏
赠618次下载
百万级 高质量VIP文章无限畅学
千万级 优质资源任意下载
C知道 免费提问 ( 生成式Al产品 )

最新推荐

探索MATLAB数组长度在数据库连接中的应用:提升数据库连接效率,优化数据交互

![探索MATLAB数组长度在数据库连接中的应用:提升数据库连接效率,优化数据交互](https://img-blog.csdnimg.cn/img_convert/1678da8423d7b3a1544fd4e6457be4d1.png) # 1. MATLAB数组长度在数据库连接中的作用 在MATLAB中,数组长度是影响数据库连接效率的一个重要因素。数组长度是指MATLAB中用于存储和传输数据的数组元素数量。当MATLAB与数据库进行连接时,数组长度会影响以下几个方面: - **数据传输效率:**数组长度越大,需要传输的数据量就越大,从而影响数据传输效率。 - **数据库处理效率:**

MATLAB物联网技术:连接设备,实现智能化,打造智能家居和工业4.0

![MATLAB物联网技术:连接设备,实现智能化,打造智能家居和工业4.0](https://www.appganhuo.com/image/1688354391547051847.png) # 1. MATLAB物联网技术概述** MATLAB物联网技术是一种利用MATLAB平台开发物联网应用程序和解决方案的方法。它提供了广泛的工具和库,用于连接、采集、分析和可视化物联网设备数据。 MATLAB物联网技术的主要优势包括: * **易于使用:**MATLAB是一种高级编程语言,具有直观的语法和丰富的函数库,简化了物联网应用程序的开发。 * **强大的数据分析能力:**MATLAB提供了一

:MATLAB函数最大值求解:并行计算的优化之道

![:MATLAB函数最大值求解:并行计算的优化之道](https://img-blog.csdnimg.cn/20210401222003397.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Nzk3NTc3OQ==,size_16,color_FFFFFF,t_70) # 1. MATLAB函数最大值求解基础** MATLAB函数最大值求解是数值分析中一个重要的任务,它涉及找到给定函数在指定域内的最大值。在本

深入剖析MATLAB ln函数:掌握对数计算,提升科学研究效率

![深入剖析MATLAB ln函数:掌握对数计算,提升科学研究效率](https://img-blog.csdnimg.cn/c7265d4a402a410eaa98aac5ce399b2e.png) # 1. MATLAB 中的对数计算简介** 对数计算在科学研究中广泛应用,MATLAB 作为一种强大的科学计算工具,提供了丰富的对数计算功能。本章将介绍 MATLAB 中对数计算的基本概念和用法,为后续章节深入探讨 ln 函数及其应用奠定基础。 MATLAB 中的对数计算主要通过 ln 函数实现,该函数用于计算自然对数(以 e 为底的对数)。自然对数在科学研究中具有重要意义,因为它在许多自

:揭示MATLAB数值输出在生物信息学中的关键作用:生物信息学利器,提升研究效率

![matlab输出数值](https://img-blog.csdnimg.cn/20210401222003397.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Nzk3NTc3OQ==,size_16,color_FFFFFF,t_70) # 1. MATLAB数值输出简介 MATLAB(矩阵实验室)是一种用于数值计算和数据分析的高级编程语言和交互式环境。它在生物信息学领域广泛应用,用于处理和分析复杂的数据

探索MATLAB智能算法在语音识别中的应用:揭秘语音识别算法的奥秘

![matlab智能算法](https://img-blog.csdnimg.cn/5d397ed6aa864b7b9f88a5db2629a1d1.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbnVpc3RfX05KVVBU,size_20,color_FFFFFF,t_70,g_se,x_16) # 1. 语音识别技术概述 语音识别技术是一种计算机识别和理解人类语音的能力。它涉及将语音信号转换为文本或其他可操作的形式。语音识别技术在广泛的应用中发挥着至关重要的作用,包括: -

MATLAB矩阵输入与生物领域的完美结合:分析生物数据,探索生命奥秘

![matlab怎么输入矩阵](https://img-blog.csdnimg.cn/20190318172656693.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTY5Mjk0Ng==,size_16,color_FFFFFF,t_70) # 1. MATLAB矩阵输入概述 MATLAB矩阵输入是将数据存储到MATLAB变量中的过程,这些变量可以是标量、向量或矩阵。MATLAB提供多种输入方法,包括键盘

Java并发编程调试秘诀:诊断和解决并发问题

![Java并发编程调试秘诀:诊断和解决并发问题](https://img-blog.csdnimg.cn/20210508172021625.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl81MTM5MjgxOA==,size_16,color_FFFFFF,t_70) # 1. 并发编程基础** 并发编程涉及管理同时执行多个任务,以提高应用程序的效率和响应能力。它依赖于线程,即轻量级进程,可并行运行代码。理解线程

MATLAB神经网络算法:神经网络架构设计的艺术

![MATLAB神经网络算法:神经网络架构设计的艺术](https://i0.hdslb.com/bfs/archive/e40bba43f489ed2598cc60f64b005b6b4ac07ac9.jpg@960w_540h_1c.webp) # 1. MATLAB神经网络算法概述 MATLAB神经网络算法是MATLAB中用于创建和训练神经网络模型的一组函数和工具。神经网络是一种机器学习算法,它可以从数据中学习模式并做出预测。 MATLAB神经网络算法基于人工神经网络(ANN)的原理。ANN由称为神经元的简单处理单元组成,这些神经元相互连接并组织成层。神经网络通过训练数据学习,调整其

MATLAB图例与物联网:图例在物联网数据可视化中的应用,让物联数据一目了然

![MATLAB图例与物联网:图例在物联网数据可视化中的应用,让物联数据一目了然](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy9wM3EyaG42ZGUyUGNJMzhUQlZKQmZicUdialBzbzJGRFh3d0dpYlZBSXVEcDlCeVVzZTM2aWNMc3oxUkNpYjc4WnRMRXNnRkpEWFlUUmliT2tycUM1aWJnTlR3LzY0MA?x-oss-process=image/format,png) # 1. MATLAB图例概述** 图例是数据可