×

关于μC/OS-II实时操作系统内存管理的改进方法分析

消耗积分:1 | 格式:rar | 大小:0.6 MB | 2017-10-27

分享资料个

μ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的基地址。
 

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !

'+ '

'+ '

'+ ''+ '
'+ ''+ ''+ '
'+ ''+ '' ); $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code ==5){ $(pop_this).attr('href',"/login/index.html"); return false } if(data.code == 2){ //跳转到VIP升级页面 window.location.href="//m.lene-v.com/vip/index?aid=" + webid return false } //是会员 if (data.code > 0) { $('body').append(htmlSetNormalDownload); var getWidth=$("#poplayer").width(); $("#poplayer").css("margin-left","-"+getWidth/2+"px"); $('#tips').html(data.msg) $('.download_confirm').click(function(){ $('#dialog').remove(); }) } else { var down_url = $('#vipdownload').attr('data-url'); isBindAnalysisForm(pop_this, down_url, 1) } }); }); //是否开通VIP $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code == 2 || data.code ==5){ //跳转到VIP升级页面 $('#vipdownload>span').text("开通VIP 免费下载") return false }else{ // 待续费 if(data.code == 3) { vipExpiredInfo.ifVipExpired = true vipExpiredInfo.vipExpiredDate = data.data.endoftime } $('#vipdownload .icon-vip-tips').remove() $('#vipdownload>span').text("VIP免积分下载") } }); }).on("click",".download_cancel",function(){ $('#dialog').remove(); }) var setWeixinShare={};//定义默认的微信分享信息,页面如果要自定义分享,直接更改此变量即可 if(window.navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == 'micromessenger'){ var d={ title:'关于μC/OS-II实时操作系统内存管理的改进方法分析',//标题 desc:$('[name=description]').attr("content"), //描述 imgUrl:'https://'+location.host+'/static/images/ele-logo.png',// 分享图标,默认是logo link:'',//链接 type:'',// 分享类型,music、video或link,不填默认为link dataUrl:'',//如果type是music或video,则要提供数据链接,默认为空 success:'', // 用户确认分享后执行的回调函数 cancel:''// 用户取消分享后执行的回调函数 } setWeixinShare=$.extend(d,setWeixinShare); $.ajax({ url:"//www.lene-v.com/app/wechat/index.php?s=Home/ShareConfig/index", data:"share_url="+encodeURIComponent(location.href)+"&format=jsonp&domain=m", type:'get', dataType:'jsonp', success:function(res){ if(res.status!="successed"){ return false; } $.getScript('https://res.wx.qq.com/open/js/jweixin-1.0.0.js',function(result,status){ if(status!="success"){ return false; } var getWxCfg=res.data; wx.config({ //debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId:getWxCfg.appId, // 必填,公众号的唯一标识 timestamp:getWxCfg.timestamp, // 必填,生成签名的时间戳 nonceStr:getWxCfg.nonceStr, // 必填,生成签名的随机串 signature:getWxCfg.signature,// 必填,签名,见附录1 jsApiList:['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); wx.ready(function(){ //获取“分享到朋友圈”按钮点击状态及自定义分享内容接口 wx.onMenuShareTimeline({ title: setWeixinShare.title, // 分享标题 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享给朋友”按钮点击状态及自定义分享内容接口 wx.onMenuShareAppMessage({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 type: setWeixinShare.type, // 分享类型,music、video或link,不填默认为link dataUrl: setWeixinShare.dataUrl, // 如果type是music或video,则要提供数据链接,默认为空 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ”按钮点击状态及自定义分享内容接口 wx.onMenuShareQQ({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口 wx.onMenuShareWeibo({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ空间”按钮点击状态及自定义分享内容接口 wx.onMenuShareQZone({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); }); }); } }); } function openX_ad(posterid, htmlid, width, height) { if ($(htmlid).length > 0) { var randomnumber = Math.random(); var now_url = encodeURIComponent(window.location.href); var ga = document.createElement('iframe'); ga.src = 'https://www1.elecfans.com/www/delivery/myafr.php?target=_blank&cb=' + randomnumber + '&zoneid=' + posterid+'&prefer='+now_url; ga.width = width; ga.height = height; ga.frameBorder = 0; ga.scrolling = 'no'; var s = $(htmlid).append(ga); } } openX_ad(828, '#berry-300', 300, 250);