RTT之内存管理及异常中断
内存管理分静态内存管理和动态内存管理(根据大小又分2种)
静态内存管理:创建、删除、初始化、解绑、申请和释放。初始化内存池是属于静态内存管理,与创建内存池不同的是,此处内存池对象所使用的内存空间是由用户指定的一个缓冲区空间,用户把缓冲区的指针传递给内存池对象控制块,其余的初始化工作与创建内存池相同。
动态内存:在堆heap上分配。
小堆内存管理模块主要针对系统资源比较少(小于2M内存空间的系统):内存池中有不同的内存块,申请时先查找找到符合要求的(拆分),释放时如果紧邻的空闲则合并成一个。
而SLAB内存管理模块则主要是在系统资源比较丰富时。这两种管理模块提供的API接口完全相同。分配、重新调整分配、释放,以及分配和释放的钩子函数。
警告:因为动态内存管理器要满足多线程情况下的安全分配,会考虑多线程间的互斥问题,所以请不要在中断服务例程中分配或释放动态内存块。因为它可能会引起当前上下文被挂起等待。
RTT对中断管理:专门为中断设置中断栈空间,在进入和退出时实现切换。中断的前半段(取得数据和状态并给线程同步信息)和后半段(线程对数据的进一步处理)
相关的中断操作函数:中断挂载、某个中断源的屏蔽和解开屏蔽,总中断的打开和关闭,此外进入和退出中断有专门的2个函数提示系统进入和退出了中断:
void rt_interrupt_enter(void);//如果中断服务程序不会调用内核相关的函数(释放信号量等操作)则不调用;否则调用的作用是
void rt_interrupt_leave(void);//推出时告诉内核该采取中断中线程切换的策略,而不是立即进行切换
rt_uint8_t rt_interrupt_get_nest(void)//是否发生了中断嵌套。
ARM Cortex-M系列处理器在从线程发生中断或者在中断时发生更高级级别的中断嵌套,PSR R0~R3,R12的现场保护都是由硬件自动完成的。每个中断都直接有一个确定的入口而不像ARM7/9先从统一的入口进去后在查找具体中断口。
中断方式还是轮询:比如串口发送,如果每次发送的量比较少(或波特率很高)此时轮询效率最高,中断时因为有任务切换开销效率不高,在OS下用中断方式要么将每次发送的数据量尽可能大,线程的优先级设置为最低(防止一直运行其它低优先级线程得不到运行机会)
一般在中断中发送信号量或者消息队列给线程。线程收到信号量或消息队列时进行处理。
中断处理:
中断的栈采用独立于线程栈的方式,和主堆栈MSP(第一个线程或中断、异常时用)、线程栈LSP(线程切换时)对应。
低半步处理:中断应该短小精悍,在获得必要的异步硬件信号之后通过信号量、邮箱、队列等形式通知等待的线程做后半段处理、
RT-Thread 中断管理接口
如果中断服务程序不会调用内核相关的函数(释放信号量等操作),这个时候,也可以不调用 rt_interrupt_enter/leave() 函数
轮询还是中断:
1 优先中断:对于DMA/FIFI,存在高低速度问题时采用中断模式;
2轮询模式:但当数据传输速度非常快,传输数据量非常小时应采用轮询方式,(不然协通切换损耗比较大),但为了避免轮询导致长时间其它线程得不到运行,可以考虑将本线程的优先级降低一些。
RTT之内存管理及异常中断的更多相关文章
- 源码解读·RT-Thread小内存管理算法分析
这篇文章最初发布在RT-Thread官方论坛中,最近准备整理放到博客中来让更多人一起探讨学习. 2012年9月28日星期五 前言: 母语能力有限 概述: 这篇文字和大家分享一下今晚对RT-Thread ...
- JVM自动内存管理-Java内存区域与内存溢出异常
摘要: JVM内存的划分,导致内存溢出异常的可能区域. 1. JVM运行时内存区域 JVM在执行Java程序的过程中会把它所管理的内存划分为以下几个区域: 1.1 程序计数器 程序计数器是一块较小的内 ...
- Java自动内存管理机制学习(一):Java内存区域与内存溢出异常
备注:本文引用自<深入理解Java虚拟机第二版> 2.1 运行时数据区域 Java虚拟机在执行Java程序的过程中把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创 ...
- 2.1 自动内存管理机制--Java内存区域与内存溢出异常
自动内存管理机制 第二章.Java内存区域与内存溢出异常 [虚拟机中内存如何划分,以及哪部分区域.什么样代码和操作会导致内存溢出.各区域内存溢出的原因] 一.运行时数据区域 Java虚拟机所管理的内存 ...
- Android异常与性能优化相关面试问题-内存管理面试问题详解
内存管理机制概述: 分配机制:操作系统会为每一个进程分配一个合理的内存大小,从而保证每一个进程能够正常的运行,不至于内存不够使用,或者某个进程占用过多的内存. 回收机制:在系统内存不足的时候,系统有一 ...
- 内存管理单元(MMU)和协处理器CP15介绍(转)
内存管理单元(MMU)和协处理器CP15介绍内存管理单元(MMU)介绍嵌入式系统中,存储系统差别很大,可包含多种类型的存储器件,如FLASH,SRAM,SDRAM,ROM等,这些不同类型的存储器件速度 ...
- 程序员必读:Linux内存管理剖析
现在的服务器大部分都是运行在Linux上面的,所以作为一个程序员有必要简单地了解一下系统是如何运行的. 对于内存部分需要知道: 地址映射 内存管理的方式 缺页异常 先来看一些基本的知识,在进程看来,内 ...
- Linux内核内存管理
<Linux内核设计与实现>读书笔记(十二)- 内存管理 内核的内存使用不像用户空间那样随意,内核的内存出现错误时也只有靠自己来解决(用户空间的内存错误可以抛给内核来解决). 所有内核 ...
- 《Linux内核设计与实现》读书笔记(十二)- 内存管理【转】
转自:http://www.cnblogs.com/wang_yb/archive/2013/05/23/3095907.html 内核的内存使用不像用户空间那样随意,内核的内存出现错误时也只有靠自己 ...
随机推荐
- 机器学习初探(手写数字识别)matlab读取数据集
手写数字识别是机器学习里面的一个经典问题,今天就这一段时间学习的机器学习,花一个下午茶的时间,试试机器学习. 首先数据库是在MNIST(http://yann.lecun.com/exdb/mnist ...
- String的split(String regex, int limit)方法小结
split(String regex, int limit)方法,头一个参数String regex表示字符串分割的模式,包括分隔符和正则表达式:但是第二个参数limit比较迷糊人,api中这样解释: ...
- kylin 连接 hortonworks 中的 hive 遇到的问题
用 hortonworks(V3.1.0.0) 部署了 ambari (V2.7.3),用 ambari 部署了 hadoop 及 hive. 1. 启动 kylin(V2.6)时,遇到如下问题: ...
- J2SE-鸡汤
前言 终于开始学java了,心里免不了的开心,总是听老乡说他们公司搞java开发,用的什么什么框架,说的自己都有点眼馋了,但是根据自己的性格,不了解它,肯定不会就去用它的.所以在学习框架之前,java ...
- ASP.NET-GridView之表头设计
我们 见过许多网页呈现表格的 时候,表头的形式多种多样.下面来看看,怎么制定多样的表头吧. 效果显示: 需要在后台写一个方法,网页一加载在前端写个事件调用这个方法. DEMO 前端 <span ...
- Knights0.
Knights t数轴上有n个骑士位于1,2,3,...n,移动速度相同,初始移动方向已知,当两个骑士相遇时,各有50%的概率赢,输了就死了,并且移动到0和n+1的位置时移动方向会翻转,问最右的骑士存 ...
- jzoj4918. 【GDOI2017模拟12.9】最近公共祖先 (树链剖分+线段树)
题面 题解 首先,点变黑的过程是不可逆的,黑化了就再也洗不白了 其次,对于\(v\)的祖先\(rt\),\(rt\)能用来更新答案当且仅当\(sz_{rt}>sz_{x}\),其中\(sz\)表 ...
- 获取WPF窗体/控件的句柄/当前进程的句柄
1.在WPF中,获取当前窗体的句柄与WINFORM中不一样: WINFORM直接获取:this.Handle----------this是窗体的类名,handle就是句柄. 2.WPF中先引用命名空间 ...
- 数据结构14:队列(Queue),“先进先出”的数据结构
队列是线性表的一种,在操作数据元素时,和栈一样,有自己的规则:使用队列存取数据元素时,数据元素只能从表的一端进入队列,另一端出队列,如图1. 图1 队列示意图 称进入队列的一端为“队尾”:出队列的一端 ...
- springboot整合mybatis,redis,代码(五)
redis注解开发过程中包含许多注解 1.@Cacheable 可以标记在方法上,也可以标记在类上.当标记在方法上时表示该方法是支持缓存的,当标记在类上时则表示该类所有的方法都是支持缓存的.应用到读取 ...