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 内核的内存使用不像用户空间那样随意,内核的内存出现错误时也只有靠自己 ...
随机推荐
- 触摸屏、X11去掉鼠标
cursor disable in X11 Last updated 8 years ago 摘自:http://www.noah.org/wiki/cursor_disable_in_X11 Whe ...
- 几款Web服务器性能压力测试工具
一.http_load 程序非常小,解压后也不到100K http_load以并行复用的方式运行,用以测试web服务器的吞吐量与负载. 但是它不同于大多数压力测试工具,它可以以一个单一的进程运行,一般 ...
- ubuntu - 14.04,安装Eclipse(开源开发工具)
一,安装JDK:Eclipse必须有JDK才能运行,所以首先我们确定系统是否已经安装了JDK,我们在shell里面输入:“java -version”,如果已经安装了,就会打印出来当前JDK版本信息, ...
- 等和的分隔子集(DP)
晓萌希望将1到N的连续整数组成的集合划分成两个子集合,且保证每个集合的数字和是相等.例如,对于N=3,对应的集合{1,2,3}能被划分成{3} 和 {1,2}两个子集合. 这两个子集合中元素分别的和是 ...
- Linux系统磁盘
所有有系统都一样,都是一种软件被安装于某个硬件之上,这个硬件无外非是一种存储设备,通常操作系统都是安装在磁盘中,所以Linux系统也是一样,都是安装在磁盘中,但是它与Windows系统不一样,因为Li ...
- 从100PV到1亿级PV网站架构演变(转)
http://www.linuxde.net/2013/05/13581.html 一个网站就像一个人,存在一个从小到大的过程.养一个网站和养一个人一样,不同时期需要不同的方法,不同的方法下有共同的原 ...
- 在SQLSERVER中创建聚集索引
CREATE CLUSTERED INDEX CLUSTER_id ON TABLE_name(ID)------批量
- 添加fping监控
第一步:安装fping服务 yum -y install fping 第二步:在zabbix-server服务端上启用fping服务 重启zabbix-server 第三步:在主机上添加fping监控 ...
- 「洛谷5017」「NOIP2018」摆渡车【DP,经典好题】
前言 在考场被这个题搞自闭了,那个时候自己是真的太菜了.qwq 现在水平稍微高了一点,就过来切一下这一道\(DP\)经典好题. 附加一个题目链接:[洛谷] 正文 虽然题目非常的简短,但是解法有很多. ...
- 什么是Uboot
U-Boot的全称是Universal Boot Loader,遵循GPL条款的开放源码项目. U-Boot的作用是系统引导. U-Boot目前不仅仅支持嵌入式Linux系统的引导(对Linux的支持 ...