一种C编译器利用海明距离优化SRAM页选择的方法及系统与流程

文档序号:16390108发布日期:2018-12-22 11:16阅读:477来源:国知局
一种C编译器利用海明距离优化SRAM页选择的方法及系统与流程

本发明属于嵌入式c编译器设计技术领域,涉及一种c编译器利用海明距离优化sram(静态存储器)页选择的方法。

背景技术

市场上应用程序五花八门,这些应用程序基本上都是使用一种或者多种高阶语言和一套优秀的集成开发环境ide(包含编译工具链)来进行开发,但是对于嵌入式领域来说,高阶的c语言可以说是嵌入式领域的王者开发语言,因为c语言不管从开发效率、移植性、代码可读性来说都是汇编语言和其他高阶语言无法比拟的,而使用c语言就离不开c编译器。

目前市面上的c编译器产品有很多,且很多c编译器效率都是非常高,比如clang、gcc、picc、keilc、iarc等编译器编译效率都是业内翘楚,但是针对一些多sram(静态存储器)页的体系结构中,一些编译器为了设计的便利性,在页选择过程中插入切换页的一条伪指令如picc的banksel语句,然后汇编器根据该芯片的型号生成对应的页选择机器指令,假设某种芯片ic型号sram有4页,每一页为一个bank,那么banksel伪指令语句被汇编器解析就会生成两条指令,这两条指令是设置页寄存器为正确的值,假设页选择寄存器为bsr,地址为0x08,那么c代码为:

bank0unsignedchara=0;

bank1unsignedcharb=1;

编译后生成的汇编代码为:

banksel0

movlw0

movwfa

banksel1

movlw1

movwfb

由于该芯片ic有4页,每一页为一个bank,那么一个banksel语句为两条指令,分别设置bsr的第0和1位,因为使用2个bit(比特,二进制位信息单位)可以表示0‐3,刚好可以表示4个bank,最后生成的代码为:

bcfbsr,0

bcfbsr,1

movlw0

movwfa

bsfbsr,0

bcfbsr,1;有冗余

movlw1

movwfb

以上汇编代码在页选择上会有部分冗余代码的产生,如何对sram页选择代码进行优化,是本申请提出的要解决的技术问题。

海明距离,在信息论中,两个等长字符串之间的海明距离是两个字符串对应位置的不同字符的个数。换句话说,它就是将一个字符串变换成另外一个字符串所需要替换的字符个数。例如:字符串"1011101"和"1001001"的海明距离是2(第3、5位字符不同);字符串"2173896"和"2233796"的海明距离是3(第2、3、5位字符不同)。



技术实现要素:

本发明主要解决的技术问题是:如何在c编译器中利用海明距离对sram页选择进行优化,生成高效率的页选择指令,从而提高代码生成效率,为此本发明提供了一种c编译器利用海明距离优化sram页选择的方法。

本发明是通过以下的技术方案来实现的。

本发明的第一个技术主案是提出一种c编译器利用海明距离优化sram页选择的系统,其包含有:

获取基本块(basicblock)指令集模块,该模块依次遍历指定函数中所有的基本块,并把基本块中的所有指令均保存到一个指令容器中;

获取海明距离值模块,该模块根据两个bank值(srcbank和destbank)使用海明距离算法计算出它们的海明距离值,如果海明距离值为1,该模块还能计算出这两个bank值到底在哪个bit位置上不同;

sram页选择优化执行模块,该模块在遇到访问sram变量的时候,根据当前的bank值和该sram变量的访问bank值使用海明距离算法计算出它们的海明距离值,然后依据海明距离值来决定是否要插入页选择指令,以及插入何种页选择指令。

其原理是遍历函数所有基本块,并获取基本块中的指令集,然后根据当前bank值和单元基本块中的页选择指令使用海明距离算法获取海明距离值,最后根据海明距离值生成优化的sram页选择指令,从而提高代码生成效率。

基于上述的系统,本发明还提供一种c编译器利用海明距离优化sram页选择的方法,包括如下步骤:

s1,依次遍历函数的所有基本块,把任一基本块中的指令保存到顺序容器中;

s2,根据sram中当前bank值和访问bank值,计算出海明距离值,访问bank值是指将要访问sram变量所在的bank值;

s3,当存在访问sram变量时,根据海明距离值来决定是否要插入页选择指令,以及插入何种页选择指令。

在上述的技术方案中,进一步的,所述s1步骤中具体包括:

s11、初始化获取基本块指令;

s12、获取函数的一个基本块,获取失败则结束;

s13、从基本块中取出一条指令,保存该指令到特定的容器中,如取出失败则结束;

s14、从基本块中取出下一条指令,保存该指令到特定的容器中,如取出失败则获取函数的下一个基本块。

在上述的技术方案中,进一步的,所述s2步骤中还包括:当计算出的海明距离值为1时,还要计算出这两个bank值之间的不同处于哪个bit位置上。

在上述的技术方案中,进一步的,所述s2步骤中具体包括:

s21、初始化获取海明距离值;

s22、设置当前bank值为src,下一条访问sram指令的bank值的值为dest;

s23、获取src的第n位的值,获取dest第n位的值,n=0‐8为整数;

s24、判定上述第n位的两个值是否不同,是则海明距离值加1,否则获取src的第n+1位的值与获取dest第n+1位的值;

s25、保存位值不同的位置值。

在上述的技术方案中,进一步的,所述s3步骤中具体包括:

s31、初始化sram页选择指令;

s32、设置当前bank值为0;

s33、获取基本块中的第一条指令,获取失败则结束;

s34、获取指令类型,判定是否为访问sram指令,否则获取基本块的下一条指令;

s35、获取该指令访问sram变量所在的访问bank值;

s36、根据当前bank值和访问bank值,计算出海明距离值;

s37、当海明距离值为0时,设置当前当前bank值为访问bank值;当海明距离值为1时,获取当前bank值和访问bank值不同的位置的位值并进行替换,然后设置当前bank值为访问bank值;当海明距离值大于1时,则直接插入banksel指令;

s38、获取基本块的下一条指令。

其中,所述s36步骤中的获取当前bank值和访问bank值不同的位置的位值并进行替换具体是指:

若当前bank值变为访问bank值,对应的位置的值是从0变为1,则插入bsf指令,反之若是从1变为0则插入bcf指令。

在传统的c编译器开发过程中,通过该方法实现sram页选择优化后可减少访问不同sram页所产生的切换页指令,提高c编译器的优化效率,进而提高嵌入式应用程序的运行速度并能够使用节省的romsizes来提供更丰富的功能。

附图说明

图1是实施例中的获取基本块指令集模块的处理流程图。

图2是实施例中的获取海明距离模块的处理流程图。

图3是实施例中的sram页选择优化执行模块的处理流程图。

图4是实施例中的系统结构框图。

具体实施方式

以下结合附图与具体实施例对本发明的技术方案做进一步的详细说明。

参照图4所示,本实施例是一种c编译器利用海明距离优化sram页选择的系统,主要包括有获取基本块指令集模块、获取海明距离值模块和sram页选择优化执行模块,各模块的功能和处理流程详细如下:

一、获取基本块指令集模块

获取基本块指令集模块的功能是依次遍历函数的所有基本块,把任一基本块中的指令保存到顺序容器中,以便供后续优化使用。

参照图1所示,该模块实现的处理流程如下:

1)、初始化获取基本块指令集模块;

2)、获取函数的第一个基本块,如获取失败则结束;

3)、从基本块中取出第一条指令,并保存该指令到特定的容器中,如果取出失败则结束;

4)、从基本块中取出下一条指令,并保存该指令到特定的容器中,如果取出失败则获取函数的下一个基本块,依次重复2至4过程,直接结束。

二、获取海明距离值模块

获取海明距离值模块的功能是根据当前bank值和将要访问的sram变量所在的访问bank值计算出海明距离值,如果海明距离值为1,该模块还能计算出这两个bank值(bank值也称页值)到底在哪个bit位置上不同,以便后续sram页选择优化执行模块利用海明距离值生成优化的代码。

参照图2所示,该模块实现的处理流程如下:

1)、初始化获取海明距离值模块;

2)、设置当前bank值为src,下一条访问sram指令的访问bank值的值为dest;

3)、获取src的第n位bit的值为srcbitval(n=0),获取dest第n位bit的值为destbitval(n=0),n<8为整数,因为一般的嵌入式芯片sram页都不会超过256页,即2的8次方,n可根据芯片型号确定;

4)、判定上述第n位bit的两个值是否相同,是则海明距离值(dist)加1,否则执行获取src的第n+1位bit的值与获取dest第n+1位bit的值;

5)、保存bit位不同的位置值n到bitpos中;

6)、进入获取src的第n+1位bit的值与获取dest第n+1位bit的值,重复4至6的步骤,直至n大于或等于8则完成。

三、sram页选择优化执行模块

sram页选择优化执行模块的功能是依次遍历函数的每一个基本块(basicblock),并把基本块中保存到获取基本块指令集模块容器中的指令集进行遍历,遍历的过程中当遇到访问sram指令时,使用该sram变量的访问bank值(destbank值)和当前bank值(srcbank值)去获取海明距离值,如果海明距离值为0,则说明在同一个bank,那么无需插入切换bank的指令,如果海明距离值为1,说明需要插入切换bank指令,若srcbank值变为destbank值,对应的bit位置是从0变为1那么则插入bsf指令,如果是从1变为0则插入bcf指令,如果海明距离值大于1则直接插入banksel语句。

参照图3所示,该模块实现的处理流程如下:

1)、初始化sram页选择优化执行模块;

2)、设置当前bank值curbank=0;

3)、获取基本块中的第一条指令,获取失败则结束;

4)、获取指令类型,判定是否为访问sram指令,否则直接进行获取基本块的下一条指令;

5)、是则获取该指令访问sram变量所在的访问bank值newbank;

6)、根据当前bank值curbank和访问bank值newbank,计算出curbank与newbank的海明距离值distval;

7)、当海明距离值distval=0时,设置当前bank值curbank=newbank;

当海明距离值distval=1时,获取curbank和newbank值不同的位置bitpos,若curbank值变为newbank值,对应的bit位置的值是从0变为1,则插入bsfbsr,bitpos指令到指令集合,反之若是从1变为0则插入bcfbsr,bitpos指令到指令集合,设置当前bank值curbank=newbank;

当海明距离值大于1时,则直接插入banksel指令到指令集合;

8)、然后进入获取基本块的下一条指令,重复4至8步骤,直至结束。

本实施例的说明只限于说明本发明的技术方案,但本发明的创造不仅限于本实施例,熟悉本领域的技术人员,在不违背本发明创造的基础上,所做的同等变型或替换,均包含在本发明申请权利要求保护范围内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1