μC/OS-II是一种开放源码的实时操作系统,具有抢先式、多任务的特点,已被应用到众多的微处理器上。虽然该内核功能较多,但还是有不甚完善的地方。笔者在分析使用中发现,内核在任务管理(包括任务调度、任务间的通信与同步)和中断管理上是比较完善的,具有可以接受的稳定性和可靠性;但在内存管理上显得过于简单,内存分区的建立方式有不合理之处。
1 内存管理不足之处的分析
在分析许多μC/OS-II的应用实例中发现,任务栈空间和内存分区的创建采用了定义全局数组的方法,即定义一维或二维的全局数组,在创建任务或内存分区时,将数组名作为内存地址指针传递给生成函数。这样实现起来固然简单,但是不够灵活有效。
编译器会将全局数组作为未初始化的全局变量,放到应用程序映像的数据段。数组大小是固定的,生成映像后不可能在使用中动态地改变。对于任务栈空间来说,数组定义大了会造成内存浪费;定义小于了任务栈溢出,会造成系统崩溃。对于内存分区,在不知道系统初始化后给用户留下了多少自由内存空间的情况下,很难定义内存分区所用数组的大小。总之利用全局数组来分配内存空间是很不合理的。
另外,现在的μC/OS-II只支持固定大小的内存分区,容易造成内存浪费。μC/OS-II将来应该被改进以支持可变大小的内存分区。为了实现这一功能,系统初始化后能清楚地掌握自由内存空间的情况是很重要的。
2 解决问题的方法
为了能清楚掌握自由内存空间的情况,避免使用全局数组分配内存空间,关键是要知道整个应用程序在编译、链接后代码段和数据段的大小,在目标板内存中是如何定位的,以及目标板内存大小。对于最后一条,系统编程人员当然是清楚的,第一条编译器会给出,而如何定位是由编程人员根据具体应用环境在系统初始化确定的。因此,系统初始化时,如果能正确安排代码段和数据段的位置,就能清楚地知道用户可以自由使用的内存空间起始地址。用目标板内存最高端地址减去起始地址,就是这一自由空间的大小。
3 举例描述该方法的实现
下面以在CirrusLogic公司的EP7211微处理器上使用μC/OS-II为例,描述该方法的实现过程。假设基于μC/OS-II的应用程序比较简单,以简化问题的阐述。
3.1 芯片初始化过程和链接器的功能
EP7211采用了RISC体系结构的微处理器核ARM&TDMI,该芯片支持内存管理单元MMU。系统电复位后,从零地址开始执行由汇编语言编写的初始化代码。零地址存放着中断向量表,第一个是复位中断,通过该中断向量指向的地址可以跳转到系统初始化部分,执行微处理器寄存器初始化。如果使用虚拟内存,则启动MMU,然后是为C代码执行而进行的C环境初始化。之后创建中断处理程序使用的栈空间,最后跳转到C程序的入口执行系统C程序。
对于应用程序,ARM软件开发包括提供的ARM链接器会产生只读段(read-only section RO)、读写段(read-write section RW)和零初始化段(zero-initialized section ZI)。每种段可以有多个,对较简单程序一般各有一个。
只读段就是代码段,读写段是已经初始化的全局变量,而零初始化段中存放未初始化的全局变量。链接器同时提供这三种段的起始地址和结束地址,并用已定义的符号表示。描述如下:Image$$RO$$Base表示只读段的起始地址,Image$$RO$$Limit表示只读段结束后的首地址;Image$$ Limit表示读写段结束后的首地址;Image$$ZI$$Base表示零初始化段的起始地址,Image$$ZI$$Limit表示零初始化段结束后的首地址。
一般嵌入式应用,程序链接定位后生成bin文件,即绝对地址空间的代码,因此上述符号的值表示物理地址。对于简单程序,可在编译链接时指定RO和RW的基础址,帮助链接器计算上述符号的值。对于较复杂的程序可以由scatter描述文件来定义RO和RW的基地址。
关键字:μC OS-II 实时操作系统 内存管理
引用地址:
μC/OS-II实时操作系统内存管理的改进
推荐阅读最新更新时间:2024-03-16 15:10
【STC单片机学习】第十五课:I2C通信-EEPROM
1.15.1.EEPROM及其背景知识 1.15.1.1、EEPROM (1)一些概念: ROM(只读存储器)、RAM(随机存取存储器)、PROM(可编程ROM)、EPROM(可擦除ROM)、EEPROM(电可擦除ROM) 踩链接简单了解下吧! (2)为什么需要EEPROM? 单片机内部的ROM只能在程序下载时进行擦除和改写,但是程序运行本身是不能改写的。单片机内部的RAM中的数据程序运行时可以改,但是掉电就丢失了。有时候我们有一些数据要存在系统中,要求掉电不丢失,而且程序还要能改。所以内部ROM和RAM都不行。这时候系统中就需要一块EEPROM (3)EEPROM和flash的区别与联系 flash属于广义的EEPR
[单片机]
s3c2440之cache
cache高速缓冲存储器注意与块设备页高速缓存进行区别,一个是硬件的实现一个是软件的实现,块设备页高速缓存。 s3c2440/s3c2410里面主要有一个arm920t的核,但同时包含几个协处理器,协处理器相当于一个处理器,帮助主CPU完成如浮点数运算,这儿讨论的cache及MMU、TLB就会用到协处理器CP15。CPU与协处理器之间传递数据通过两个指令MCR、MRC。
[单片机]
Realme推出C11入门级智能手机:待机达40天
今天 Realme 在印度推出了 C11 入门级智能手机,售价为 7499 印度卢比(约 697 元),将于 7 月 22 日开始在 Flipkart 上销售。 Realme C11 配备了 6.5 英寸 HD + 水滴屏,前置 500 万像素自拍摄像头。采用联发科 Helio G35 SoC,只有 2GB 内存和 32GB 存储空间的版本。 手机内置 5000mAh 电池,不支持任何形式的快充,但官方宣称该机的待机时间可长达 40 天。此外,这款手机使用了旧的 micro USB 接口,后置摄像头由一个 1300 万像素摄像头和一个 200 万像素摄像头组成。 IT之家了解到,Realme 在推出 Rea
[手机便携]
腾达C60S,打开QQ就能进行监控的智能摄像头
腾达C60S是一款全新升级的智能网络摄像头,配置原装百万高清镜头和顶级成像传感器,720P高清拍摄,画质清晰细腻,另外还支持红外夜视功能,红外可视距离高达10米;支持QQ物联,用户打开手机QQ即可实时监控,无需安装APP,简单易用;支持抓拍云储存、QQ报警推进等功能。 什么是QQ物联? QQ物联是腾讯发布的智能硬件开放平台,其将QQ账号体系及关系链、QQ消息通道能力等核心能力,实现用户与设备及设备与设备之间的互联互通互动。QQ物联依靠腾讯多年安全经验的积累,拥有稳定安全的加密传输通道,腾达智能摄像头C60S所有数据通过QQ安全加密传输,能够保障用户信息的安全,防止隐私泄露。 腾达C60S使用方法 一、连接电源&添加
[网络通信]
单片机89C51与A/D转换器MAX195的接口设计
MAX195是16位逐次逼近方式的ADC。它将高精度、高速度、低电源功耗(消耗电流仅10μA)的关闭方式等性能结合在一起。内部校准电路对线性度与偏置误差进行校正,所以无需外部调整便可达到全部额定的性能指标。电容性的DAC结构使之具有特有的85kbps跟踪/保持功能,变换时间仅需9.4μs。三态串行数据输出及引脚可选的单极性(0~VREF)或双极性(-VREF~+VREF)的输入范围使之可广泛应用于便携式仪表、医用信号采集及多传感器测量等系统中。 1 MAX195引脚及说明 MAX195有16个引脚,其排列如图1所示。 2 MAX195转换原理及时序 MAX195片内含有电容性的数字模拟变换器(D
[单片机]
采用LMV1090放大器和AT89C51单片机改进型噪声抑制话音采集方案
机载超短波电台在战斗机中承担着与地面塔台及友机之间的通话任务,其通话质量的高低直接影响飞行员的作战与训练质量。目前在飞机上大量使用的还是老式的模拟话音电台,此种电台缺少语音增强装置,对于战斗机座舱内强烈的噪声缺少针对性的抑制措施。随着新阶段飞行任务的增大,低清晰度的通话质量势必会对飞行任务的完成及飞行员的身心健康造成较大的影响。本文拟通过新型的模拟语音处理方法,重新设计话音采集及控制部分,提高采集语音的信噪比,改善机载超短波电台的通信质量。 1、 机载电台话音采集装置 某型飞机超短波电台由控制器、收发机、功率附加器、射频转换器及通信天线构成。该电台的话音采集装置主要包括麦克风和控制器,其中控制器通过座椅连接器与飞行帽上的耳机及
[单片机]
应用MSP50C30设计电子语音导游机
摘要:文章在简要介绍了MSP50C30的结构和特性的基础上,给出了利用MSP50C30设计电子语音导游机的硬件电路和软件编程方法。
关键词:MSP50C30 MELP算法 语音合成 电子导游机
1 概述
随着我国经济的发展,旅游业也获得了长足的发展,节假日外出旅游已成为人们的首选,对大多数零散游客来说,希望有一种不受制于人的辅助导游手段,迫切需要一种携带方便、存储容量大且不会机械磨损的电子语音导游机(简称导游机),但目前市场上已在使用的导游机,要私体积大,不便于携带;要么容量不够,放音时间有限,因此制约了其应用和推广。要实现较长时间的数字放音有两种方式:一是扩大存储空间,但无限扩大存储空间必增加系统成本,二是采用语音压缩方法来
[嵌入式]
C语言编译过程中的错误分析
语言的最大特点是:功能强、使用方便灵活。C编译的程序对语法检查并不象其它高级语言那么严格,这就给编程人员留下“灵活的余地”,但还是由于这个灵活给程序的调试带来了许多不便,尤其对初学C语言的人来说,经常会出一些连自己都不知道错在哪里的错误。看着有错的程序,不知该如何改起,本人通过对C的学习,积累了一些C编程时常犯的错误,写给各位学员以供参考。 1.书写标识符时,忽略了大小写字母的区别。 main() { int a=5; printf("%d",A); } 编译程序把a和A认为是两个不同的变量名,而显示出错信息。C认为大写字母和小写字母是两个不同的字符。习惯上,符号常量名用大写,变量名用
[单片机]