您现在的位置:融合网首页 > 芯片 > 技术 >

基于μC/OS任务调度算法的嵌入式数据管理(3)

来源:互联网 作者:秩名 责任编辑:admin 发表时间:2018-11-07 11:59 
核心提示:2.2 算法的改进 C/OS的最大任务数为64,这意味着直接采用C/OS任务调度算法实现的数据管理的最大记录数也仅为64个,这显然不适用于多数应用场合,因此需对算法进行改进。本方法引入页的概念,即每64个记录为1页,数

2.2  算法的改进

μC/OS的最大任务数为64,这意味着直接采用μC/OS任务调度算法实现的数据管理的最大记录数也仅为64个,这显然不适用于多数应用场合,因此需对算法进行改进。本方法引入“页”的概念,即每64个记录为1页,数据存储前先查找包含空记录的页号,然后在该页中查找空记录。查找包含空记录的页号的方法与查找空记录的方法相同(即都根据μC/OS中的“查找当前处于就绪态的最高优先级任务”的方法查找),因此最大记录数为64记录/页×64页=4096个记录。依此类推,可继续扩大存储记录数。为了理解方便,下文代表记录空闲状态和页内记录号的全局变量定义为OSRdyTbl[64][8]、OSRdyGrp[64]和prio,代表页空闲状态和页号的全局变量定义为OSRdyPage、OSRdyPageTbl[8]和PrioPage,代表记录在整个存储空间的序号定义为RecordNo(则RecordNo = PrioPage×64+prio)。

2.3  嵌入式数据管理主要步骤的实现

2.3.1  数据初始化

在嵌入式系统刚运行时,所有记录应为空状态,因此需将代表记录空闲状态和页空闲状态的全局变量OSRdyTbl[]、OSRdyGrp、OSRdyPageTbl[]和OSRdyPage的所有字节均初始化为0xff(因为“1”代表空闲)。

2.3.2  数据存储

数据存储前先要找到优先级最高的空记录,其流程为先找到含空记录的页号,然后在该页中查找空记录号,最后根据页号和空记录号计算出当前可用于存储且优先级最高的存储空间的序号。详细程序如下:

High3=OSUnMapTbl[OSRdyPageGrp];//高3位

Low3=OSUnMapTbl[OSRdyPageTbl][High3]];//低3位

PrioPage=(High3《3)+Low3;//先找到含空记录的页号

High3=OSUnMapTbl[OSRdyGrp[PrioPage]];

Low3=OSUnMapTbl[OSRdyTbl[PrioPage][High3]];

prio=(High3《3)+Low3;//获得页中的空记录号

RecordNo=PrioPage*64+prio;//获得空记录在整个存储空间中的序号

根据以上程序得到序号后,就可以将数据存储到相应存储空间了,存储完成后需将该序号的存储空间设置为“满”状态,具体流程为:先将该页中的记录号置为“满”状态(即清零相应位),然后判断本页中是否所有记录均为“满”,若是则置该页的状态为“满”。详细程序如下:

PrioPage=RecordNo / 64;//页号

prio=RecordNo % 64;//记录号

if ((OSRdyTbl[PrioPage][prio》3] &=~OSMapTbl[prio & 0x07])==0)

OSRdyGrp[PrioPage] &=~OSMapTbl[prio》3]; //置页中的记录号为“满”状态

if(OSRdyGrp[PrioPage]==0){//若该页中的所有记录均为“满”则置该页为“满”状态

if ((OSRdyPageTbl[PrioPage》3] &=~OSMapTbl[PrioPage & 0x07])==0)

OSRdyPage &= ~OSMapTbl[PrioPage》3];

}

2.3.3  数据删除

数据删除即将存储序号RecordNo对应的页号和记录号的存储状态设置为“空”(则该记录可用于后续的存储),具体流程为:先设置页号为“空”(因为只要该页中任意一个记录为“空”,则页的状态即为“空”),然后设置记录号的状态为“空”,详细程序如下:

PrioPage=RecordNo / 64;//页号

prio=RecordNo % 64;//记录号

OSRdyPage |=OSMapTbl[PrioPage》3];

OSRdyPageTbl[PrioPage》3] |=OSMapTbl[PrioPage & 0x07];//设置该页的存储状态为“空”(责任编辑:admin)

  • “扫一扫”关注融合网微信号

免责声明:我方仅为合法的第三方企业注册用户所发布的内容提供存储空间,融合网不对其发布的内容提供任何形式的保证:不保证内容满足您的要求,不保证融合网的服务不会中断。因网络状况、通讯线路、第三方网站或管理部门的要求等任何原因而导致您不能正常使用融合网,融合网不承担任何法律责任。

第三方企业注册用户在融合网发布的内容(包含但不限于融合网目前各产品功能里的内容)仅表明其第三方企业注册用户的立场和观点,并不代表融合网的立场或观点。相关各方及作者发布此信息的目的在于传播、分享更多信息,并不代表本网站的观点和立场,更与本站立场无关。相关各方及作者在我方平台上发表、发布的所有资料、言论等仅代表其作者个人观点,与本网站立场无关,不对您构成任何投资、交易等方面的建议。用户应基于自己的独立判断,自行决定并承担相应风险。

根据相关协议内容,第三方企业注册用户已知悉自身作为内容的发布者,需自行对所发表内容(如,字体、图片、文章内容等)负责,因所发表内容(如,字体、图片、文章内容等)等所引发的一切纠纷均由该内容的发布者(即,第三方企业注册用户)承担全部法律及连带责任。融合网不承担任何法律及连带责任。

第三方企业注册用户在融合网相关栏目上所发布的涉嫌侵犯他人知识产权或其他合法权益的内容(如,字体、图片、文章内容等),经相关版权方、权利方等提供初步证据,融合网有权先行予以删除,并保留移交司法机关查处的权利。参照相应司法机关的查处结果,融合网对于第三方企业用户所发布内容的处置具有最终决定权。

个人或单位如认为第三方企业注册用户在融合网上发布的内容(如,字体、图片、文章内容等)存在侵犯自身合法权益的,应准备好具有法律效应的证明材料,及时与融合网取得联系,以便融合网及时协调第三方企业注册用户并迅速做出相应处理工作。

融合网联系方式:(一)、电话:(010)57722280;(二)、电子邮箱:2029555353@qq.com dwrh@dwrh.net

对免责声明的解释、修改及更新权均属于融合网所有。

相关新闻>>

    热门关键字

    关于我们 - 融合文化 - 媒体报道 - 在线咨询 - 网站地图 - TAG标签 - 联系我们
    Copyright © 2010-2020 融合网|DWRH.net 版权所有 联系邮箱:dwrh@dwrh.net 京公网安备 11011202002094号 京ICP备11014553号