2945|0

530

帖子

4

TA的资源

一粒金砂(高级)

楼主
 

【RT-Thread读书笔记】13. RT-Thread 学习24-26章读后感 [复制链接]

  本帖最后由 传媒学子 于 2019-5-12 16:10 编辑

24章 内存管理

计算系统中,通常存储空间可以分为两种:内部存储空间和外部存储空间。内部存储空间通常访问速度比较快,能够按照变量地址随机地访问,也就是我们通常所说的 RAM(随机存储器),可以把它理解为电脑的内存;而外部存储空间内所保存的内容相对来说比较固定,即使掉电后数据也不会丢失,这就是通常所讲的 ROM(只读存储器),可以把它理解为电脑的硬盘。

计算机系统中,变量、中间数据一般存放在 RAM 中,只有在实际使用时才将它们从 RAM 调入到 CPU 中进行运算。一些数据需要的内存大小需要在程序运行过程中根据实际情况确定,这就要求系统具有对内存空间进行动态管理的能力,在用户需要一段内存空间时,向系统申请,系统选择一段合适的内存空间分配给用户,用户使用完毕后,再释放回系统,以便系统将该段内存空间回收再利用。

这章主要介绍 RT-Thread 中的两种内存管理方式,分别是动态内存堆管理和静态内存池管理,学完本章,读者会了解 RT-Thread 的内存管理原理及使用方式。

RT-Thread 操作系统在内存管理上,根据上层应用及系统资源的不同,有针对性地提供了不同的内存分配管理算法。总体上可分为两类:内存堆管理与内存池管理,而内存堆管理又根据具体内存设备划分为三种情况:

第一种是针对小内存块的分配管理(小内存管理算法);

第二种是针对大内存块的分配管理(slab 管理算法);

第三种是针对多内存堆的分配情况(memheap 管理算法)

----引自 https://www.rt-thread.org/document/site/programming-manual/memory/memory/ 其实,内存管理是OS中一个必备的组件,如何没有内存管理,OS如何运行,我们常见的linux和windos都是运行在内存中,这个内存指的是RAM, 内存条DRAM。有些数据还存在CPU内部的高速缓存中,L1/L2/L3 cache中。而这些内存的速度是非常快的,但是掉电不保存。而真正的程序,数据是存放在硬盘中的,速度慢,但掉电保存。当OS运行后,每个要运行的程序,都会先被读取到内存中,然后才开始运行,最终数据会被写入硬盘中保存。 这里面牵扯到内存一致性等问题,x86体系中有MESI关于CPU核内,cache一致性的描述,而RTOS由于一般只有一个core, 也许没有MESI机制。但内存管理机制,就不可缺少的。 这里啰嗦了一些知识,下面回到书中的内存管理。

基本概念

RT-Thread操作系统将内核与内存管理分开实现,操作系统内核仅规定了必要的内存管理函数原型,而不关心这些内存管理函数是如何实现的,所以在RT-Thread中提供了多种内存分配算法(分配策略),但是上层接口(API)却是统一的。RT-Thread的内存管理模块管理系统的内存资源,它是操作系统的核心模块之一。主要包括内存的初始化、分配以及释放。

运作机制

首先,在使用内存分配前,必须明白自己在做什么,这样做与其它的方法有什么不同,特别是会产生哪些负面影响,在自己的产品面前,应当选择哪种分配策略。 动态分配内存与静态分配内存的区别:静态内存一旦创建就指定了内存块的大小,分配只能以内存块大小粒度进行分配;动态内存分配则根据运行时环境确定需要的内存块大小,按照需要分配内存。 静态内存管理: 内存池(Memory Pool)是一种用于分配大量大小相同的小内存对象的技术。它可以极大加快内存分配/释放的速度。 内核负责给内存池分配内存池对象控制块,它同时也接收用户线程的分配内存块申请,当获得申请信息后,内核就可以从内存池中为线程分配内存块。内存池一旦初始化完成,内部的内存块大小将不能再做调整。 动态内存管理: 动态内存管理是一个真实的堆(Heap)内存管理模块。动态内存管理,即在内存资源充足的情况下,从系统配置的一块比较大的连续内存,根据用户需求,在这块内存中分配任意大小的内存块。当用户不需要该内存块时,又可以释放回系统供下一次使用。与静态内存相比,动态内存管理的好处是按需分配,缺点是内存池中容易出现碎片(在申请与释放的时候由于内存不对齐会导致内存碎片)。 1.小内存管理模块 小内存管理算法是一个简单的内存分配算法。初始时,它是一块大的内存,其大小为(MEM_SIZE),当需要分配内存块时,将从这个大的内存块上分割出相匹配的内存块,然后把分割出来的空闲内存块还回给堆管理系统中。每个内存块都包含一个管理用的数据头,通过这个头把使用块与空闲块用双向链表的方式链接起来(内存块链表)。 2.SLAB内存管理模块 RT-Thread的SLAB分配器是在DragonFly BSD创始人Matthew Dillon实现的SLAB分配器基础上,针对嵌入式系统优化的内存分配算法。最原始的SLAB算法是Jeff Bonwick为Solaris操作系统而引入的一种高效内核内存分配算法。 RT-Thread的SLAB分配器实现主要是去掉了其中的对象构造及析构过程,只保留了纯粹的缓冲型的内存池算法。SLAB分配器会根据对象的类型(主要是大小)分成多个区(zone),也可以看成每类对象有一个内存池。 静态内存管理的函数接口: rt_mp_create(), rt_mp_alloc(),rt_mp_free(). 动态内存管理的函数接口: rt_system_heap_init(),rt_malloc(),rt_free().

25章 中断管理

异常是导致处理器脱离正常运行转向执行特殊代码的任何事件,分为同步异常和异步异常,中断属于异步异常。中断能打断线程的运行,无论该线程具有什么样的优先级,因此中断一般用于处理比较紧急的事件,而且只做简单处理,例如标记该事件,在使用 RT-Thread系统时,一般建议使用信号量、消息或事件标志组等标志中断的发生,将这些内核对象发布给处理线程,处理线程再做具体处理。 通过中断机制,在外设不需要CPU介入时,CPU可以执行其它线程,而当外设需要CPU时通过产生中断信号使CPU立即停止当前线程转而来响应中断请求。这样可以使CPU避免把大量时间耗费在等待、查询外设状态的操作上,因此将大大提高系统实时性以及执行效率。 因此,前边所讲临界段,不能被中断打断,这样会影响RTOS的实时性。任何使用了操作系统的中断响应都不会比裸机快。所以,操作系统的中断在某些时候会有适当的中断延迟,因此调用中断屏蔽函数进入临界段的时候,也需快进快出。 中断介绍: 与中断相关的硬件可以划分为三类:外设、中断控制器、CPU本身。 CPU:CPU会响应中断源的请求,中断当前正在执行的线程,转而执行中断处理程序。NVIC最多支持240个中断,每个中断最多256个优先级。 中断号:每个中断请求信号都会有特定的标志,使得计算机能够判断是哪个设备提出的中断请求,这个标志就是中断号。 中断请求:“紧急事件”需向CPU提出申请,要求CPU暂停当前执行的线程,转而处理该“紧急事件”,这一申请过程称为中断请求。 中断优先级:为使系统能够及时响应并处理所有中断,系统根据中断时间的重要性和紧迫程度,将中断源分为若干个级别,称作中断优先级。 中断处理程序:当外设产生中断请求后,CPU暂停当前的线程,转而响应中断申请,即执行中断处理程序。 中断触发:中断源发出并送给CPU控制信号,将中断触发器置“1”,表明该中断源产生了中断,要求CPU去响应该中断,CPU暂停当前线程,执行相应的中断处理程序。 中断触发类型:外部中断申请通过一个物理信号发送到NVIC,可以是电平触发或边沿触发。 中断向量:中断服务程序的入口地址。 中断向量表:存储中断向量的存储区,中断向量与中断号对应,中断向量在中断向量表中按照中断号顺序存储。 临界段:代码的临界段也称为临界区,一旦这部分代码开始执行,则不允许任何中断打断。为确保临界段代码的执行不被中断,在进入临界段之前须关中断,而临界段代码执行完毕后,要立即开中断。RT-Thread支持中断屏蔽和中断使能。 当中断产生时,处理机将按如下的顺序执行: 1. 保存当前处理机状态信息 2. 载入异常或中断处理函数到PC寄存器 3. 把控制权转交给处理函数并开始执行 4. 当处理函数执行完成时,恢复处理器状态信息 5. 从异常或中断中返回到前一个程序执行点 中断管理: ARM Cortex-M内核的中断是不受RT-Thread管理的,所以RT-Thread中的中断使用其实跟裸机差不多的,需要我们自己配置中断,并且使能中断,编写中断服务函数,在中断服务函数中使用内核IPC通信机制,一般建议使用信号量、消息或事件标志组等标志事件的发生,将事件发布给处理线程,等退出中断后再由相关处理线程具体处理中断。由于中断不受RT-Thread管理,所以不需要使用RT-Thread提供的函数(中断屏蔽与使能除外)。

第26章 双向链表

这一章讲的是双向链表,双向链表对于实现RT-Thread非常重要,创建线程,线程优先级,线程就绪列表等地方都用到了双向链表,建议大家在学习数据结构时,必须深刻掌握这一数据结构。 这一章都是基本的数据结构,所以不再展开介绍,可能火哥觉得这一部分非常重要,因此放在本书的最后。 此内容由EEWORLD论坛网友传媒学子原创,如需转载或用于商业用途需征得作者同意并注明出处
点赞 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表