裸机下的存储空间分配管理方法与流程
未命名
09-09
阅读:84
评论:0

1.本发明属于电数字数据处理领域,具体涉及一种存储空间的分配管理方法。
背景技术:
2.目前,大部分嵌入式软件受限于成本、资源等,使用的都是裸机系统。裸机系统一般没有文件管理系统,需要开发人员自行进行存储空间的分配,将存储单元(eeprom芯片、flash芯片等)划分成多个存储空间,每个存储空间存放一个对应的存储元素。
3.通用的做法是在开发时将相关存储空间的地址和大小(即数据长度)预先分配好,每一块存储空间的起始绝对地址需要根据前面其它存储空间的大小通过累加得到进行累加得到。该方式的缺点是:每次更新存储元素时,必须准确的获知所有存储元素的长度和所有存储元素的偏移地址,而获取的方式是人工累加计算后写入到系统程序中,存在写错的可能性,无法完全确保存储数据信息的正确性。
技术实现要素:
4.本发明提出了一种裸机下的存储空间分配管理方法,其目的是:解决传统存储空间分配管理方法所存在的存储数据信息计算繁琐、效率低下、难以保证正确性的问题。
5.本发明技术方案如下:一种裸机下的存储空间分配管理方法,用于将存储单元的整体空间划分为多个与存储元素相对应的存储空间,并提供读写存储元素时所需要的存储数据信息,步骤包括:步骤1、确定不同类型的存储元素所对应的数据类型:如果存储元素只包含一个数据内容,则使用编程语言中的基本数据类型或数组来映射该存储元素;如果存储元素包含两个以上的数据内容时,则定义结构体类型tparai,且不同的tparai分别映射不同类型的存储元素;tparai中的各成员与所对应的存储元素中的各数据内容按序一一对应,且成员的长度与所对应的数据内容的长度相一致;定义结构体类型teeprom,向teeprom中添加成员,成员的数据类型为基本数据类型、数组或tparai,teeprom的各成员与存储单元中的各存储元素按序一一对应,从而完成teeprom与存储单元的整体空间之间映射关系的构建;所述teeprom不进行实例化;将teeprom中的成员作为一级成员,将类型为tparai的成员所包含的成员作为二级成员;步骤2、定义函数get_addr(addr_name):当addr_name为一级成员的名称时,get_addr(addr_name)根据所述映射关系返回addr_name对应的存储元素在存储单元中的起始地址;当addr_name为二级成员的名称时,get_addr(addr_name)根据所述映射关系返回addr_name对应的存储元素中的数据内容在存储单元中的起始地址;步骤3、定义函数get_struct_mem_len(structname,itemname);
所述structname为teeprom或任一tparai类型的名称,所述itemname为structname对应的类型下的成员的名称;函数get_struct_mem_len(structname,itemname)用于返回structname类型的结构体中成员itemname的长度;步骤4、对存储元素或存储元素中的数据内容进行读写时,先使用get_addr(addr_name)和get_struct_mem_len(structname,itemname)获取读写对象在存储单元中的地址和长度,然后将地址和长度作为读写函数的参数进行读写操作。
6.作为所述裸机下的存储空间分配管理方法的进一步改进:所述函数get_addr(addr_name)的实现方式为定义宏:#define get_addr(addr_name) ((dword)&(((teeprom *) start_addr)-》addr_name))start_addr为存储单元的起始存储地址。
7.作为所述裸机下的存储空间分配管理方法的进一步改进:所述函数get_struct_mem_len(structname,itemname)的实现方式为定义宏:#define get_struct_mem_len(structname,itemname) sizeof(((structname *)(0))-》itemname)。
8.作为所述裸机下的存储空间分配管理方法的进一步改进:定义结构体类型时,使用pack方式强制进行1字节对齐。
9.作为所述裸机下的存储空间分配管理方法的进一步改进:还设置有存储单元用于存储数据的空间大小变量master_mem_space,定义teeprom之后,判断teeprom的大小是否超过master_mem_space,如果超过则提示越界。
10.作为所述裸机下的存储空间分配管理方法的进一步改进:tparai类型中包含字符数组类型的成员buf,还包含unsigned short类型的成员flag。
11.相对于现有技术,本发明具有以下积极效果:(1)本发明利用编程语言在查询结构体的成员的相关信息时,编程语言对成员位置、大小的计算逻辑与存储空间中数据地址、长度的计算逻辑有相似之处的特点,通过虚拟结构体的方式对整个存储单元的空间进行虚拟映射,从而在不进行实际的空间分配的情况下,实现了对存储空间的灵活分配管理,并且通过编程语言的相关计算可自动得到准确无误的地址和长度值,无需人工计算,提高了配置效率,保证了地址和长度的正确性;(2)需要调整存储空间的分配时,只需要重新定义结构体teeprom,编程语言将根据新定义的结构体自动推算出各成员的新地址和长度,无需重新计算,极大的提高了灵活性,降低了维护成本;(3)本发明还通过sizeof函数实现了存储空间的越界判断;(4)虚拟结构体无需进行实例化,不占用实际的ram空间。
具体实施方式
12.下面详细说明本发明的技术方案:一种裸机下的存储空间分配管理方法,用于将存储单元的整体空间划分为多个与存储元素相对应的存储空间,并提供读写存储元素时所需要的存储数据信息。
13.存储单元是指保存存储元素的物理硬件,如eeprom。存储元素是指保存的某类数据的集合,它可以是一个数据内容,也可以是由多个数据内容组成。不同的存储元素,其数据内容组成可能不同。存储数据信息包括存储元素及其数据内容在存储单元中的地址和长
度,该地址一般是指读写时需要明确的起始地址,长度即数据的大小。其中,存储元素的长度与它所对应的存储空间的长度是一致的。对于包含多个数据内容的存储元素,它所对应的存储空间还需要被分为多个子空间,对应存储元素中的各个数据内容。
14.本实施例中,所述分配管理方法通过c语言实现。本方法的核心在于基于c语言的结构体功能,使用结构体虚拟整个存储单元的存储空间,结构体下的数据成员用于虚拟每个存储元素。结构体的数据成员不局限于结构体,也可以是其它的数据类型。整个结构体的外层代表整个存储单元,结构体的内部数据成员代表具体的存储元素。
15.需要强调的是,本方法中的结构体只定义、不进行实例化,不占用ram的空间。其目的是利用结构体类型的定义来模拟存储元素及其数据内容,利用编程语言本身具有的计算逻辑来模拟计算存储元素地址和长度的过程,因此,结构体类型的定义本身就是一种“映射关系”,只要完成了结构体的定义,就等同于完成了“存储空间的分配与管理”。程序编译时,存储元素的地址和大小,都是基于结构体类型通过指针偏移直接获得的,无需考虑“累加计算”等细节问题。
16.具体的,本方法的步骤包括:步骤1、确定不同类型的存储元素所对应的数据类型:如果存储元素只包含一个数据内容,则使用编程语言中的基本数据类型或数组来映射该存储元素。
17.如果存储元素包含两个以上的数据内容时,则定义结构体类型tparai,且不同的tparai分别映射不同类型的存储元素;tparai中的各成员与所对应的存储元素中的各数据内容按序一一对应,且成员的长度与所对应的数据内容的长度相一致。
18.定义结构体类型teeprom,向teeprom中添加成员,成员的数据类型为基本数据类型、数组或tparai,teeprom的各成员与存储单元中的各存储元素按序一一对应,从而完成teeprom与存储单元的整体空间之间映射关系的构建。
19.定义结构体类型时,使用pack方式强制进行1字节对齐,避免字节对齐浪费存储空间的问题。
20.本实施例中,结构体的具体定义如下:#pragma pack(1)//第一种存储元素内部数据内容的分配typedef struct tpara1_t{char buf[100];//占用100个字节unsigned short flag1;//占用2个字节unsigned short flag;//占用2个字节}tpara1; //共占用104个字节//第二种存储元素内部数据内容的分配typedef struct tpara2_t{char buf[50];unsigned short flag;}tpara2;共占用52个字节//存储单元的整体分配
typedef struct teeprom_t{tpara1 para1;//添加存储元素1,为第一种存储元素tpara2 para2; //添加存储元素2,为第二种存储元素char buf_1[100]; //该存储元素只包含100个字节的数据内容,直接用数组来表示,未使用结构体来表示tpara2 para3;//添加存储元素3,同样为第二种存储元素}teeprom;//共占用308个字节#pragmapack()所述teeprom不进行实例化。即,本方法只定义结构体类型,并不实例化结构体类型的对象、占用具体的ram空间。
[0021]
下面,将teeprom中的成员作为一级成员,将类型为tparai的成员所包含的成员作为二级成员。
[0022]
步骤2、定义函数get_addr(addr_name):当addr_name为一级成员的名称时,get_addr(addr_name)根据所述映射关系返回addr_name对应的存储元素在存储单元中的起始地址。
[0023]
当addr_name为二级成员的名称时,get_addr(addr_name)根据所述映射关系返回addr_name对应的存储元素中的数据内容在存储单元中的起始地址。
[0024]
所述函数get_addr(addr_name)的实现方式为定义宏:#define get_addr(addr_name) ((dword)&(((teeprom *) start_addr)-》addr_name))start_addr为存储单元的起始存储地址。通常start_addr=0,即从存储单元物理空间的位置0开始保存。如果物理空间用来保存的区域的起始地址并非0,可通过定义芯片的起始地址start_addr来确保地址正确。例如前100个字节用于存放其它数据,则start_addr设为 100。
[0025]
get_addr(addr_name)的计算过程为:通过指针转换的方式,将start_addr指向的地址作为一个teeprom类型结构体的起始地址,以此为基准,得到teeprom类型中addr_name的地址,这个地址的值就代表了该对象在存储单元中的实际起始地址。
[0026]
例如,start_addr=100,则有:get_addr(para2)得到的是当teeprom结构体起始地址为100时,para2的起始地址,即100+104=204;get_addr(para1.flag)得到的是当teeprom结构体起始地址为100时,para1中的flag1所对应的数据内容的起始地址,即100+100=200。
[0027]
步骤3、定义函数get_struct_mem_len(structname,itemname);所述structname为teeprom或任一tparai类型的名称,所述itemname为structname对应的类型下的成员的名称;函数get_struct_mem_len(structname,itemname)用于返回structname类型的结构体中成员itemname的长度。
[0028]
所述函数get_struct_mem_len(structname,itemname)的实现方式为定义宏:#define get_struct_mem_len(structname,itemname) sizeof(((structname *)(0))-》itemname)。
[0029]
此处,将地址0(也可是其它任一地址)强制转为structname *类型,然后用sizeof方法取出其中itemname的数据长度。例如,get_struct_mem_len(tpara1,buf)为获取结构
体tpara1中buf的长度,返回值为100,即对应的长度为100字节;get_struct_mem_len(teeprom,buf_1)为获取结构体teeprom中buf_1的长度,返回值为100。
[0030]
步骤4、对存储元素或存储元素中的数据内容进行读写时,先使用get_addr(addr_name)和get_struct_mem_len(structname,itemname)获取读写对象在存储单元中的地址和长度,然后将地址和长度作为读写函数的参数进行读写操作。
[0031]
读写示例如下://获得para1.buf对应的数据内容在存储单元中的起始地址:para1bufadr = get_addr(para1.buf);//获得para1.buf对应的数据内容的长度:para1buflen = get_struct_mem_len(tparal,buf);//获得para2.flag对应的数据内容在存储单元中的起始地址:para2flagadr = get_addr (para2.flag);//获得para2.flag对应的数据内容的长度:para2flaglen = get_struct_mem_len (tpara2,flag);//调用writeeeprom函数,传入地址para1bufadr和长度 para1buflen,将buf中的数据写入到para1.buf对应的存储空间的数据内容所在的存储区域中:writeeeprom(para1bufadr, para1buflen,buf);//调用writeeeprom函数,传入地址para2flagadr和长度 para2flaglen,将&testflag指向的数据写入到para2.flag对应的存储空间的区域中:writeeeprom(para2flagadr, para2flaglen,&testflag);//重置buf和testflag的值memset(buf,0x00,100);testflag = 0;//调用readeeprom函数,传入地址para1bufadr和长度 para1buflen,将para1.buf对应的存储空间的区域中的数据读取到buf中:readeeprom(para1bufadr, para1buflen, buf);//调用readeeprom函数,传入地址para2flagadr和长度 para2flaglen,将para2.flag对应的存储空间的区域中的数据读取到&testflag指向的变量中:readeeprom(para2flagadr, para2flaglen,&testflag);需要更改存储空间的分配时,可以直接修改teeprom的定义,修改后,不需要修改函数get_addr,可以直接按原来的方式获取到任一对象的起始地址。
[0032]
程序中还设置有存储单元用于存储数据的空间大小变量master_mem_space,定义teeprom之后,判断teeprom的大小是否超过master_mem_space,如果超过则提示越界。
技术特征:
1.一种裸机下的存储空间分配管理方法,用于将存储单元的整体空间划分为多个与存储元素相对应的存储空间,并提供读写存储元素时所需要的存储数据信息,其特征在于步骤包括:步骤1、确定不同类型的存储元素所对应的数据类型:如果存储元素只包含一个数据内容,则使用编程语言中的基本数据类型或数组来映射该存储元素;如果存储元素包含两个以上的数据内容时,则定义结构体类型tparai,且不同的tparai分别映射不同类型的存储元素;tparai中的各成员与所对应的存储元素中的各数据内容按序一一对应,且成员的长度与所对应的数据内容的长度相一致;定义结构体类型teeprom,向teeprom中添加成员,成员的数据类型为基本数据类型、数组或tparai,teeprom的各成员与存储单元中的各存储元素按序一一对应,从而完成teeprom与存储单元的整体空间之间映射关系的构建;所述teeprom不进行实例化;将teeprom中的成员作为一级成员,将类型为tparai的成员所包含的成员作为二级成员;步骤2、定义函数get_addr(addr_name):当addr_name为一级成员的名称时,get_addr(addr_name)根据所述映射关系返回addr_name对应的存储元素在存储单元中的起始地址;当addr_name为二级成员的名称时,get_addr(addr_name)根据所述映射关系返回addr_name对应的存储元素中的数据内容在存储单元中的起始地址;步骤3、定义函数get_struct_mem_len(structname,itemname);所述structname为teeprom或任一tparai类型的名称,所述itemname为structname对应的类型下的成员的名称;函数get_struct_mem_len(structname,itemname)用于返回structname类型的结构体中成员itemname的长度;步骤4、对存储元素或存储元素中的数据内容进行读写时,先使用get_addr(addr_name)和get_struct_mem_len(structname,itemname)获取读写对象在存储单元中的地址和长度,然后将地址和长度作为读写函数的参数进行读写操作。2.如权利要求1所述的裸机下的存储空间分配管理方法,其特征在于:所述函数get_addr(addr_name)的实现方式为定义宏:#define get_addr(addr_name) ((dword)&(((teeprom *) start_addr)->addr_name))start_addr为存储单元的起始存储地址。3.如权利要求1所述的裸机下的存储空间分配管理方法,其特征在于:所述函数get_struct_mem_len(structname,itemname)的实现方式为定义宏:#define get_struct_mem_len(structname,itemname) sizeof(((structname *)(0))->itemname)。4.如权利要求1所述的裸机下的存储空间分配管理方法,其特征在于:定义结构体类型时,使用pack方式强制进行1字节对齐。5.如权利要求1所述的裸机下的存储空间分配管理方法,其特征在于:还设置有存储单元用于存储数据的空间大小变量master_mem_space,定义teeprom之后,判断teeprom的大
小是否超过master_mem_space,如果超过则提示越界。6.如权利要求1至5任一所述的裸机下的存储空间分配管理方法,其特征在于:tparai类型中包含字符数组类型的成员buf,还包含unsigned short类型的成员flag。
技术总结
本发明公开了一种裸机下的存储空间分配管理方法,属于电数字数据处理领域。本发明利用编程语言在查询结构体的成员的相关信息时,编程语言对成员位置、大小的计算逻辑与存储空间中数据地址、长度的计算逻辑有相似之处的特点,通过虚拟结构体的方式对整个存储单元的空间进行虚拟映射,从而在不进行实际的空间分配的情况下,实现了对存储空间的分配管理,并且通过编程语言的相关计算可自动得到准确无误的地址和长度值,无需人工计算,提高了配置效率,保证了地址和长度的正确性,还具有灵活性高、维护成本低等优点。维护成本低等优点。
技术研发人员:姜文浩 马金臣 李丕凯 李彤辉 王俊生 李嘉敏 张培杰 贾斌 崔群辉
受保护的技术使用者:烟台东方威思顿电气有限公司
技术研发日:2023.08.03
技术公布日:2023/9/7
版权声明
本文仅代表作者观点,不代表航家之家立场。
本文系作者授权航家号发表,未经原创作者书面授权,任何单位或个人不得引用、复制、转载、摘编、链接或以其他任何方式复制发表。任何单位或个人在获得书面授权使用航空之家内容时,须注明作者及来源 “航空之家”。如非法使用航空之家的部分或全部内容的,航空之家将依法追究其法律责任。(航空之家官方QQ:2926969996)
航空之家 https://www.aerohome.com.cn/
飞机超市 https://mall.aerohome.com.cn/
航空资讯 https://news.aerohome.com.cn/