一种过程级软硬件协同设计自动化开发方法

文档序号:6597324阅读:188来源:国知局
专利名称:一种过程级软硬件协同设计自动化开发方法
技术领域
本发明属于计算机领域,涉及嵌入式领域中的可重构片上系统(RSoC)的软硬件协同设计,具体涉及一种过程级软硬件协同设计自动化开发方法。

背景技术
在传统嵌入式系统设计领域,应用程序通常整个用软件实现。随着以FPGA技术为基础的可重构器件的速度越来越快、使用越来越普遍,将应用实现成软硬件混合系统能够达到更好的性价比。如何将应用划分到软件和硬件两部分并将其整合以满足系统功能与性能需求,同时实现成本的最小化导致了软硬件协同设计的产生。
传统的软硬件协同设计方法学一般都按照“先划分再实现”的步骤来设计,系统设计好之后,系统组成和硬件结构不能再改变。由于没有考虑到可重构计算单元的动态重构能力,很难高效的利用可重构计算资源。另外软硬件划分涉及到组合爆炸,是NP难问题,进行软硬件划分需要设计人员具备很高的专业技能。同时,由于可重构计算系统即包含有软件可编程的微处理器又包含有硬件可重构的逻辑器件,需要应用程序员同时拥有软件和硬件设计知识,并需要考虑动态重构以及软硬件通信细节。
目前动态软硬件划分按照其划分任务粒度的不同,可以分为指令级、过程级和进(线)程级。指令级动态软硬件划分方法完全不用设计人员干预,编译器、操作系统都可以不变,软硬件划分完全由专门硬件完成。但由于需要额外的专用硬件进行在线反汇编、综合和布局布线,硬件开销比较大。另一方面指令级动态软硬件划分粒度目前局限在基本块内,结构也局限于单循环结构,性能提升效果有限。
进(线)程级动态软硬件划分把软件和硬件任务都当作进程或线程,由操作系统统一管理,可以支持现有硬件设计资源,便于集成开发。动态软硬件划分可转换为软硬件进(线)程动态调度问题,利用和扩展操作系统进(线)程管理功能而实现。同时,软硬件进(线)程通信、同步也可利用操作系统提供的相应机制实现,较为灵活方便。但进(线)程调度、通信、同步基本由软件完成,时间开销较大。虽然在一些研究中提出了支持可重构计算操作系统的专门硬件,但主要负责配置信息和可重构资源管理,进程调度和切换还是由软件完成。另外,目前的进(线)程级动态软硬件划分研究中对软硬件透明编程模型还关注不够,软件和硬件进(线)程对设计人员是可见的,程序员创建一个软件或硬件进(线)程的同时,实际已暗示了相应功能的软硬件划分。
过程级动态软硬件划分的基本思想是建立软硬件协同函数库,将计算任务分解成函数,以函数为软硬件划分和调度的基本单位。在功能描述阶段,并不区分函数的软硬件性质;在程序运行时才根据动态软硬件划分的结果,通过动态连接技术将函数连接到相应的硬件或软件实现。这样可以做到真正的在线划分、动态重构和设计透明。函数的调用时间相对进(线)程切换开销要小得多,同时不需要对指令流进行循环提取、反汇编、在线综合等操作,是一种较理想的方案。
目前的各种RSoC软硬件开发流程存在诸多不足,主要表现如下功能描述与系统设计之间的存大较大鸿沟、编程不透明、动态可重构资源难以有效利用、开发工具种类繁多、开发流程冗长复杂。
由上可以看出,迫切需要一种自动化的开发流程来实现RSoC的软硬件协同设计。


发明内容
本发明要解决技术问题是提供一种过程级软硬件协同设计自动化开发方法,使用该方法,可达到可重构器件对程序用户透明的目的。支持运行时的动态软硬件划分,使划分对程序员透明,提高了可重构资源的利用率,提高了系统开发的效率。
本发明为解决上述技术问题所采用的技术方案是 一种过程级软硬件协同设计自动化开发方法,其特征在于,包括以下步骤 步骤A利用高级语言完成系统功能描述,系统功能描述中包括软硬件协同函数的调用,所有的软硬件协同函数都放置在同一个软硬件协同函数库中; 步骤B软硬件函数的动态划分在程序运行时,采用动态软硬件划分方法对程序调用的软硬件协同函数进行划分,即确定具体的软硬件协同函数将要采用软件实现还是硬件实现; 步骤C链接和执行步骤动态链接器根据动态软硬件划分方法的划分结果,对具体的函数进行链接,对于采用软件实现的函数;就将该采用软件实现的函数翻译为软件指令此处的软件指令为机器代码交给中央处理器执行;对于采用硬件实现的函数,则调用硬件实现的函数的配置文件,配置可重构资源并执行该硬件实现的函数; 步骤D判断和结束步骤;判断是否所有的函数执行完毕,如果执行完毕就结束,否则返回用于划分的参数到步骤B进入下一次循环;所述的函数包括软硬件协同函数和非软硬件协同函数,非软硬件协同函数即普通函数。
所述的动态连接器具体完成以下4个任务 第一个任务是将当前函数区分成软硬件协同函数和普通函数定义一个用于存放软硬件协同函数库的路径的环境变量,程序运行时,对于程序调用的当前函数,取出该当前函数的链接映射(link_map)中的存放调用来源的变量值(l_origin),将存放调用来源的变量值(l_origin)与环境变量的值比较,如果相同,则确定该当前函数为软硬件协同函数;否则,为普通函数; 第二个任务是检测当前调用的函数是否为软硬件协同函数,如果是,则将用于决定即将执行函数的地址的变量(GOT)值修改为软硬件协同函数库中具体函数(硬件函数或者软件函数的入口地址,用于进行协同函数库的访问,如果不是,则调用elf_machine_fixup_plt函数,elf_machine_fixup_plt函数的作用为定位普通函数执行方式的地址; 第三个任务是给软硬件协同函数库提供注册接口,为动态软硬件划分方法提供反馈的性能参数,所述的性能参数包括当前函数的结束时间、软/硬件运行时间、软/硬件调用次数、本软硬件协同函数的软/硬件总运行时间以及记录所有软硬件协同函数的软/硬件总运行时间的变量; 第四个任务是使编译后的可执行文件使用修改后的动态链接器,具体为将操作系统链接(link_os_linux)和linux操作系统中的gnu链接改成动态链接器的绝对路径。
所述的软硬件协同函数库的构造方法为 所述的软硬件协同函数库包括多个软硬件协同函数,每一个软硬件协同函数包括头文件、具体函数实现文件和硬件配置文件; 在具体函数实现文件中构造每一个具体函数的软件函数实现和硬件接口代码;在软件函数实现和硬件接口代码中设置检测硬件函数执行时间或软件函数执行时间的代码; 在硬件配置文件具有通过硬件实现具体函数的硬件描述语言代码; 在所述的头文件中声明多个具体函数的名称和参数形式;为程序调用具体的软件函数实现和硬件接口代码提供统一的函数接口; 调用软硬件协同函数时,在新建的程序文件中添加所需调用函数的头文件;在新建的程序文件中采用函数名调用的方式,调用头文件提供的统一函数接口;在程序编译时采用动态编译方式,在动态编译过程中根据划分算法选择该函数是调用软件函数实现或硬件接口代码; 检测硬件函数执行时间或软件函数执行时间为使用系统运行环境导出函数来实现。
所述的动态软硬件划分方法为分支界定算法或贪婪算法或考虑硬件预配置因素的动态软硬件划分方法,所述的考虑硬件预配置因素的动态软硬件划分方法具体为 在程序运行过程中,进行动态的软硬件划分,在可重构硬件资源上进行一个或多个函数的配置,对待划分函数维护一个待划分函数列表list(f1,…,fm),其中fk为硬件加速比,k为待划分的一个函数;k=1,…,m,m为待划分函数个数,硬件加速比定义为

F对应待划分函数的集合;Ck为函数k在程序运行过程中被调用的次数,Timeswk为函数k的软件执行时间;

为0时表示函数k当前划分为硬件,反之表示函数k当前为软件;Trfk对应函数k的硬件实现函数的配置时间;Timehwk为函数k的硬件执行时间;Commk为函数k的硬件实现函数的软硬件通信代价,为硬件与软件的参数传递时间; 具体划分步骤如下 步骤1从列表list(f1,…,fm)中选出最大值fi; 步骤2如果fi已经被划分为硬件,则从列表中删除fi,更新列表,返回步骤1,否则,进入下一步; 步骤3检测当前的可重构资源是否足够,是则将函数i划分为硬件,并配置到可重构资源上,从列表中删除fi,更新列表,返回步骤1; 否则,进入下一步; 步骤4fi与fj比较,fj为函数j的硬件加速比,函数j为已经配置在可重构资源上的函数中的一个函数,且在所有的已经配置在可重构资源上的函数中,函数j所对应的加速比最小;如果fi大于fj,则将函数j划分为软件,从可重构资源中删除函数j,返回步骤3;如果fi小于fj,则进入步骤4.1; 步骤4.1检测list是否为空,不空,则保存本次划分结果,结束;如果是空,则计算关系矩阵Cst,选出该关系矩阵Cst中最大值元素cst,将cst对应的函数t加入到待划分函数列表list(f1,…,fm)中更新待划分函数列表list(f1,…,fm),进入步骤4.2; 所述的Cst记录函数调用次序信息,关系矩阵Cst为m*N个元素,N为m个待划分的函数可能调用的所有函数的个数;s元素表示当前划分的所有函数,元素cij表示函数i被调用后立刻就调用了函数j的次数。
本发明的有益效果 本发明的过程级软硬件协同设计自动化开发方法,使用过程级软硬件统一编程模型,来屏蔽底层硬件实现的差异,达到可重构器件对程序用户透明的目的。该编程模型将硬件加速器封装成C语言函数,方便用户编程,且支持运行时的动态软硬件划分,使划分对程序员透明,提高了可重构资源的利用率。
系统设计人员通过调用已根据应用特性进行优化的软硬件协同函数库,即可利用高级语言完成系统功能描述;动态软硬件划分算法在程序运行时对其进行划分,选择、调度需要转换到软件或硬件实现的库函数,并通过动态链接器实时切换函数的运行方式,从而形成了一个由功能描述到系统实现的自动化流程。
本发明最大的一个优点是综合了软硬件协同工作以及开发流程易于实现的优点,由于采用了软硬件协同函数,因此,设计人员不必同时精通软件和硬件实现,对设计人员的素质要求显著降低,使得软硬件协同设计的时间能显著缩短;动态软硬件划分方法为优化的动态划分算法,能最大限度的发挥硬件执行速度快的优点,从而使得程序的执行效率高。



图1是过程级软硬件协同设计集成开发环境构架; 图2是过程级软硬件协同设计的结构图; 图3是过程级软硬件协同设计的原理图; 图4是过程级软硬件协同设计流程图; 图5是过程级软硬件协同设计运行时数据流图; 图6是本发明的总流程图; 图7为考虑硬件预配置因素的动态软硬件划分方法的流程图。

具体实施例方式 下面结合附图和具体实施例对本发明作进一步说明。
系统设计人员通过调用已根据应用特性进行优化的软硬件协同函数库,即可利用高级语言完成系统功能描述;系统功能描述中包括协同函数的调用,动态软硬件划分算法在程序运行时对程序调用的软硬件协同函数进行划分,选择、调度需要配置到软件或硬件实现的库函数,并通过动态链接器实时切换函数的运行方式,调用具体的软件或硬件函数,从而形成了一个由功能描述到系统实现的自动化流程。
所述动态链接器为划分算法可以用预配置的划分算法,也可以是其他的划分算法。其他的算法,如分支界定算法或贪婪算法提供划分参数,并读取动态软硬件划分的决策结果,将应用程序中对抽象函数的调用映射到具体的软件实体代码或硬件接口代码上。
动态链接器的实现 动态链接控制的第一个任务是检测是否调用协同函数,如果是,则修改GOT入口进行协同函数库的访问,如果不是,调用elf_machine_fixup_plt函数该函数的作用为定位函数上次执行方式的地址;检测到对协同函数的调用,就一律不再调用elf_machine_fixup_plt函数(系统函数)。GOT(该变量用于决定即将执行函数的地址)入口项一步进行了修改 动态链接控制的第二个任务是将函数区分成协同函数和普通函数。新添了额外的环境变量”LD_COL_LIB”协同函数库的路径只有一个,它指出协同函数库所在路径,共享库对应的链接映射link_map节点建立好后,通过将该环境变量的值LD_COL_LIB和其存放调用来源的变量l_originl_origin属于链接映射的一个成员。比较便可以知道该函数是否在协同函数库中,。程序运行时,对于程序调用的某一个函数,取出该函数的link_map中的l_origin,将l_origin与LD_COL_LIB(自己添加的变量)比较,如果相同,则确定该函数为协同函数。否则,为普通函数。
动态链接控制的第三个任务是给协同函数库提供注册接口,为动态软硬件划分算法提供反馈的性能参数函数的结束时间、软/硬件运行时间、软/硬件调用次数、本协同函数的软/硬件总运行总时间以及记录所有协同函数软/硬件总运行时间的变量等
动态链接控制的第四个任务是使编译后的可执行文件使用修改后的动态链接器。具体为将gcc(GNU(一个组织名称)计划开发的C语言编译器)中的specs文件中的linux系统中的操作系统链接(link_os_linux)和linux操作系统中的gnu(组织名称,用于该组织开发的软件)链接改成动态链接器的绝对路径。
首先进行系统功能描述 接着根据划分算法对函数(该函数为软硬件协同函数库中的函数)进行软硬件划分,确定函数以何种方式执行。
接着动态链接器根据划分软件函数算法的划分结果,进行对应函数库的链接,如果执行,是软件函数就将之翻译为软件指令交给中央处理器(CPU),如果是硬件函数的话,就调用硬件函数的配置文件,配置可重构资源,进行处理。
判断是否所有的函数执行完毕,如果执行完毕就结束,否则返回用于划分的参数。开发流程如图6. 动态软硬件划分算法的实现 从协同函数库相关信息文件(记录了该库包含的协同函数名及对应的加速器名称,面积)中抽取该协同函数的相关信息。
执行时间、方式约束可以由程序员在编程的时候指定,这些约束给出函数一次执行可消耗的最多时间/哪些函数必须以软件或硬件方式执行,这些约束可以作为独立的源文件开发
其余参数都通过动态链接器和协同函数库协作获取,其中最近的函数调用顺序,动态链接器用一个有限长的链表记录,而时间的具体获取方式为动态链接器给软硬件协同函数库提供访问其内部数据结构的接口,它们的实现中含有来获取高精度时间的汇编指令。
划分算法设计者除了提供划分算法和性能监测函数用于将用于监测的变量名传递给动态链接器
动态链接器为划分函数的注册提供了接口 预留了划分算法的接口。为方便对新开发的动态软硬件划分算法进行评估,本协同设计框架给划分算法设计人员实验新算法提供了注册接口.
动态链接还提供接口,以注册反射函数将变量名对应的变量值返回给性能监测函数该函数可以注册两个函数,这两个函数除了通过共同的参数列表进行数据通信外,还可以通过全局变量进行通信。它们一个在划分算法执行前执行,得到划分前的性能参数,一个在划分算法执行后调用,得到划分后的性能参数,用于划分前后的性能进行对比,划分算法设计者可以用它们来监测整个划分过程。
两个函数都被传入同一个文件描述符fd,所有的性能监测数据(包括动态链接器内部监测到的)将被写入该文件。
实施例1 过程级软硬件协同设计集成开发环境构架如图1。提供图形化的系统描述与设计,以及划分算法设计环境。主要分为用户界面、编译器、调试器三大部分组成。
用户界面在系统描述与设计模式下(图1实线部分),设计人员可进行系统功能描述的代码和性能约束代码等的输入;在划分算法设计模式下(图1虚线部分),设计人员可以完成算法及性能监测代码的输入工作。集成环境将为设计人员新建的工程生成特定的文件、目录等,整个工程由.project(工程文件的后缀名)文件管理,.project文件将即时反映工程文件的任何变化,记录工程类型,工具路径,编译链接选项,相关环境变量等,为软件综合提供基础。
编译器负责编译和链接,将应用程序编译成可执行文件,将划分算法等编译成共享库。通过将.project文件转换成配置文件(Makefile)文件,由配置(make)函数调用GNU(一个组织名称)计划的C语言编译器GCC对C语言代码完成编译。
调试器通过xmd、gdb工具对下载到片上系统的性能约束文件进行调试。
在划分算法设计模式下,新开发的算法被编译成共享库后下载到FPGA上替换原有的划分算法库,应用程序运行完毕后将生成相关性能监测数据,这些数据将保存到特定格式的文件中,集成开发环境将该文件读回并规格化以适当的形式显示,以便与之前的算法进行对比改进。
系统的描述与设计和软硬件划分算法设计可以通过不同的开发流程同时进行。前者和软件开发流程完全一样,设计人员调用协同函数编写代码,然后进行编译、下载、调试,协同开发环境将对整个过程中的细节问题进行管理。而划分算法的设计流程是一个迭代过程,需针对具体应用特点进行规划与设计。
过程级软硬件协同设计的结构图如图2。主要由编程模型、综合工具和仿真工具三大部分组成。编程模型是用户设计自动化工具和主要的开发环境,用户可以在编程模型中完成系统功能描述、联合综合、联合调试和生成可执行代码等主要工作。综合工具和仿真工具主要用于用户自定义函数库的建立与验证工作。用户自定义的硬件函数可通过仿真工具进行结构仿真、形为仿真和时序仿真,并通过综合工具形成系统认可的网表文件或配置文件,而不需要再借助专门的商用工具来完成。综合工具与仿真工具的设计流程同传统数字设计流程相似,大大提高了系统的实用性和可扩展性。图2中的动态链接接口和软硬件协同函数器,是本发明的独特创新之处。
过程级软硬件协同设计的原理如图3。面向可重构片上系统的软硬件协同设计自动化可分解为软硬件划分自动化和软硬件实现自动化两部分。软硬件划分自动化主要通过对动态软硬件划分算法的研究来进行。动态软硬件划分算法根据运行时动态获取的环境信息和任务的特征参数来决定任务的实现方式。
软硬件实现自动化主要是在软硬件协同函数库的支持下,通过动态连接技术实现(如图4)。其中,软硬件协同函数库是软硬件实现自动化的基础与支撑,是动态软硬件划分的对象。动态连接技术用来实现程序运行时动态重构,将划分为软件执行的任务关联到微处理器上的可执行代码,将划分为硬件执行的任务关联到可重构器件上的逻辑电路。
动态软硬件划分算法需要两个对象,一是任务图,在这里是函数调用关系图。它在系统功能描述时生成,可通过特殊工具程序进行提取。二是任务特征参数和运行环境信息。任务特征参数包括任务面积、软件执行时间、硬件执行时间等,也是由系统描述决定,从系统描述中提取。运行时环境信息包括资源使用情况、硬件函数配置状态、任务调用次数等,需要在运行时由动态链接器实时获取。
动态链接器的实现 可执行文件格式(ELF)文件中GOT入口项一步进行了修改——在发现所调用函数为协同函数时不再调用elf_machine_fixup_plt函数。
新添了额外的系统环境变量”LD_COL_LIB”,它指出协同函数库所在路径,共享库对应的link_map节点建立好后,通过将该环境变量的值和其l_origin成员比较便可以知道该函数是否在协同函数库中。(link_map为链接库的数据结构) 以“dl”开头的函数由链接器导出,其中dl_get_cfl_path给出协同函数库的所在目录。其余的三个函数用来在运行时测量协同函数的执行情况,为软硬件划分算法提供参数,在下面会进行介绍。
具体做法是将gcc的specs文件的“link_os_linux”和“link_os_gnu”两项修改为 *lin_os_linux: -m elf32ppclinux%{!shared:%{!static:%{rdynamic:-export-dynamic} %{!dynamic-linker:-dynamic-linker/mylibc/lib/ld-2.3.3.so}}} *lin_os_gnu: -m elf32ppclinux%{!shared:%{!static:%{rdynamic:-export-dynamic} %{!dynamic-linker:-dynamic-linker/mylibc/lib/ld-2.3.3.so}}} 带下划线为修改后的链接器的绝对路径名。
动态软硬件划分 程序员编写划分算法源码。
执行时间、方式约束可以由程序员在编程的时候指定,这些约束给出函数一次执行可消耗的最多时间/哪些函数必须以软件或硬件方式执行,这些约束可以作为独立的源文件开发,该源文件的后缀为”.limt”。
其余参数都通过动态链接器和协同函数库协作获取 划分算法模块也作为共享库开发,动态链接器为划分函数的注册提供了接口,划分算法在程序运行前进行注册。划分算法设计者除了提供划分算法和性能监测函数外,还提供了”void partition_register(void)”这样一个函数,其调用的函数为链接器提供的用来注册划分算法和性能监测函数的函数. void partition_register(void) {dl_partition_register(my_partition_v1) dl_partition_register(my_reflex_before,my_reflextion_after); } 为方便对新开发的动态软硬件划分算法进行评估,本协同设计框架给划分算法设计人员实验新算法提供了注册接口①。
动态链接还提供如②所示接口,以注册反射函数。该函数可以注册两个函数,这两个函数除了通过共同的参数列表进行数据通信外,还可以通过全局变量进行通信。它们一个在划分算法执行前执行,一个在划分算法执行后调用,划分算法设计者可以用它们来监测整个划分过程。
typedef sw_hw_partition_result(*Partition_Func) (address_and_exec_info*,utime64,utime64); typedef void(*Reflextion_Func)(address_and_exec_nifo*,utime64,utime64,int fd); ①:Partition_Func_dl_partition_register(Partition_Func fn) ②:void dl_partition_register(Reflextion_Func before_partition,Reflextion_Func after_partition); 两个函数都被传入同一个文件描述符fd,所有的性能监测数据(包括动态链接器内部监测到的)将被写入该文件。
该文件的格式遵循“1级项目名2级项目名…值;”格式,这种格式的文件将方便其在软硬件协同设计集成开发环境中进行自动化处理。
协同函数通过调用dl_update_time_front更新函数的起始执行时间并得到对应于该函数的唯一id。函数运行结束后,软/硬件协同函数将分别通过调用dl_sw_update_time/dl_hw_update_time更新函数的结束时间、软/硬件运行时间、软/硬件调用次数、本协同函数的软/硬件总运行总时间以及记录所有协同函数软/硬件总运行时间的变量等。
过程级软硬件协同设计流程如图4。本发明主要面向图形图像领域,为基于可重构片上系统的软硬件协同设计提供一种方便、快捷的解决方案。设计人员可以像编写常规软件代码一样轻松的完成软硬件混合系统的开发,而不会感觉到软硬件之间的差异。系统的软硬件划分和实现工作都由工具自动完成。整个系统开发过程分为三个阶段 系统的描述与设计设计人员调用软硬件协同函数库中的函数(该函数库提供的接口采用C语言或Java语言编写,如用Java语言进行描述调用的则是软硬件方法),利用C语言完成功能代码的编写;设计人员也可以添加性能约束代码,如指定协同库中函数的运行方式是全硬件或是全软件实现,以及函数执行时间约束。默认情况下协同函数库中的函数既可以以软件形式在微处理器上运行,也可以以硬件方式加载到可重构硬件上执行。
软件综合编译生成系统描述的可执行文件,并获取其中调用到的软硬件协同函数(即协同函数库中实现相同接口的软/硬件函数)信息,包括硬件函数封装的加速器的面积,协同函数执行的性能约束等。
运行时动态软硬件划分软件综合阶段所生成的可执行文件将被加载到可重构片上系统中执行,软硬件划分算法根据动态链接器实时获取的程序运行情况及片上系统的资源利用率,决定被调用的协同函数划分将由微处理器(对应软件函数)还是可重构部件上(对应硬件函数)执行。
过程级软硬件协同设计的整个运行时环境的数据流如图5。当应用程序调用某一函数时,运行时环境需对函数名进行分析,从而判断是否具有相应的硬件函数实现,如果没有,则继续运行软件代码,否则在软硬件函数运行时信息表中为其创建一个新的记录并从硬件函数库中读入相应的配置信息。这一数据结构中主要包括软硬件函数执行时间、函数调用次数、硬件函数面积等将被提供给软硬件划分算法的参数信息。软硬件动态链接过程根据划分结果为函数选择一种执行位置(要么在微处理器上,要在FPGA上),如果调用的是硬件函数,则首先查询可重构资源管理器,若该硬件函数尚未配置,则需要进行动态重构,接着运行硬件加速器,最后将执行结果写入数据区域。
可重构资源由可重构资源管理器进行管理,它是一个设备驱动程序,负责与可编程器件配置控制器等硬件电路(可编程器件厂商一般在其开发板上提供了配置控制器)通信,管理可编程器件上硬件模块的配置和运行。在这里主要是查询所需的硬件模块状态,进行相应配置和更新记录操作,包括控制硬件模块配置,更新硬件模块配置信息、状态信息和运行信息,以及从预留地址空间中分配端口地址等,最后返回所分配的地址。
简单开发过程本过程包含3DES和Hamming编码的系统,利用开发工具提供的支持。程序员使用了软硬件协同函数库中的tripleDES函数,并输入了待处理的数据和密码。此时程序员并不知道(也无从知道)函数的执行方式(硬件执行还是软件执行),也不需要去了解硬件模块上的寄存器的状态、数目、类型和通信等细节。
以下为核心部分代码 tri_des_encrypt(buf,buf,sizeof(buf),key,sizeof(key));//调用协同函数进行协同编程 for(int j=0,k=0;j<(sizeof(buf)/3)+1;j++,k+=3) { fh[j]=*((unsigned int*)(buf+k)); hamming_encode(&fh[j]); } for(int j=0,k=0;j<(sizeof(buf)/3)+1;j++,k+=3) { hamming_decode(&fh[j]); tmp=(unsigned int*)(buf+k); *tmp=fh[j]; } tri_des_decrypt(buf,buf,sizeof(buf),key,sizeof(key)); 程序运行过程中,根据动态软硬件划分的结果来执行函数。
本发明是在软硬件协同函数库的基础上实施的,软硬件协同函数库的实现步骤和实例如下 一种软硬件协同函数库的构造方法,其特征在于, 所述的软硬件协同函数库包括多个软硬件协同函数,每一个软硬件协同函数包括头文件、具体函数实现文件和硬件配置文件; 在具体函数实现文件中构造每一个具体函数的软件函数实现和硬件接口代码;在软件函数实现和硬件接口代码中设置检测硬件函数执行时间或软件函数执行时间的代码; 在硬件配置文件具有通过硬件实现具体函数的硬件描述语言代码; 在所述的头文件中声明多个具体函数的名称和参数形式;为程序调用具体的软件函数实现和硬件接口代码提供统一的函数接口; 调用软硬件协同函数时,在新建的程序文件中添加所需调用函数的头文件;在新建的程序文件中采用函数名调用的方式,调用头文件提供的统一函数接口;在程序编译时采用动态编译方式,在动态编译过程中根据划分算法选择该函数是调用软件函数实现或硬件接口代码。
检测硬件函数执行时间或软件函数执行时间为使用系统运行环境导出函数来实现。
说明所述的划分算法可以采用任意的算法来实现,只要能实现选择是软件函数实现或硬件接口代码的功能即可。比如,有一种算法,根据当前硬件是否空闲来决定,当硬件空闲时,选择硬件实现即调用硬件接口代码。
软硬件协同函数库设计的步骤为 首先为软硬件协同函数声明一个对外接口(头文件中的函数声明);头文件如何声明在具体例子中有体现。
1.以软件编程方式实现函数的软件部分,该部分为一般软件描述方式。
2.硬件接口代码的实现。硬件接口的标识是在软件接口标识前面增加了hw_前缀,区别协同函数软硬件的不同实现方式。
3.1从可重构资源管理器获取硬件模块端地址。利用系统函数mmap函数进行物理地址(即获取到的地址)映射成虚拟地址。
3.2函数库包含一个init函数,该函数将在main函数调用前得到执行,它完成两件事,一件是打开物理内存设备文件,为地址映射提供文件描述符参数;一件是调用dl_get_cfl_path函数获得当前软硬协同函数库的绝对路径,该函数也是动态链接器为编程模型提供的接口,程序中值得注意的地方在于刚进入函数时调用三个系统导出函数,可以自动测量和保存该硬件函数的执行时间,对于软件函数也有类似代码。
3.3其中必须必须声明一个执行参数传递和计算的函数,它获得虚拟地址后就能与硬件通信。该函数执行的都是一些对寄存器的读写工作(寄存器读写对硬件开发人员是熟知的过程),为了实现运行时应用程序划分改变,协同函数的指令在编译时不能直接编译进应用程序的主文件,所以将软硬件协同函数库编译成共享库文件,即声明在头文件中。
3.4可重构资源管理器负责管理可重构资源,调度硬件加速器的配置与执行,它是操作系统的一部分,作为内核驱动开发。我们仅为它提供编程接口。(只提供接口) 将软件实现代码和硬件接口代码封装。封装封装的内容为软件实现代码和硬件接口代码。封装打包具体实现为采用编译命令对所写好的.c文件(即3des.c)进行编译(在linux系统中,编译命令为gcc-fPIC-c*.c。Gcc-shared-wl,-soname,lib3des.so.l-o lib3des.so.1.0*.o,在其他系统中可以采用其他C的交叉编译器进行编译).通过编译以后整个程序就被封装打包好,可供用户调用。用户可以通过封装好的统一接口进行调用硬件接口函数,通过硬件配置文件,实现该功能的硬件部分。
硬件实现的配置文件是采用硬件描述语言实现,通过硬件开发工具进行设置,具体实现由所需实现功能相关。
将软件函数和硬件接口代码封装在一起,并与硬件实现方式的配置文件一起构成软硬件协同函数,这样即完成了一个软硬件协同函数的建立。要建立成库,则需多实现几个软硬件协同函数即可。
所述的软硬件协同函数可以采用包含头文件方式被其他程序调用,调用的步骤为 1.将软硬件协同函数库复制到开发工具的根目录下; 2.在新建的程序文件中添加所需调用函数的头文件; 3.在新建的程序文件中采用函数名调用的方式,调用头文件提供的统一函数接口。
4.在程序编译时采用动态编译方式,由程序运行环境依据当前情况选择软件或硬件实现部分。
本发明的提供的软硬件协同函数库的构造方法,包括以下步骤 首先为软硬件协同函数声明一个对外接口(头文件中的函数声明);软硬件协同函数是对同一功能的不同方式实现软件函数的实现是以软件编码方式实现,硬件的实现则是由硬件接口代码和函数功能实现的硬件配置文件构成;将软件函数和硬件接口代码封装在一起,并与硬件实现方式的配置文件一起构成软硬件协同函数,由多个软硬件协同函数,形成一个抽象的软硬件协同函数库;形成的函数库可以在其他程序中调用。
定义了一个头文件,在其中声明了软件函数和硬件接口函数提供一个统一的函数调用接口,以便于用户调用。
1)在协同函数的实现部分,硬件接口的标识是在软件接口标识前面增加了hw_前缀,区别协同函数软硬件的不同实现方式,以便系统在运行时依据当前运行情况选择软件或硬件实现部分 2)使用系统函数mmap将硬件模块实现部分的物理地址映射为虚拟地址,以便在虚拟地址空间运行的硬件接口部分与硬件模块的具体实现部分通信。
3)使用系统运行环境导出函数统计协同函数软件实现或硬件实现的执行时间,以便为系统选择软件或硬件实现提供决策信息。
4)声明一个执行参数传递和计算的函数用于在获得虚拟地址后就能与硬件通信。
软件实现部分和硬件实现的接口部分打包到同一个共享库中,与硬件实现的配置文件共同组成一个完整的协同函数。由多个软硬件协同函数组成软硬件协同函数库。
软硬件协同函数库设计的实施例1 本实例中,采用Eclipse开发工具进行设计,软件实体代码和硬件接口代码最后都通过动态链接控制实现。动态链接控制主要是读取动态软硬件划分的决策结果,将应用程序中对抽象函数的调用映射到具体的软件实体代码或硬件接口代码上。动态链接技术在软件设计中早已广泛应用,高级程序设计语言也提供了相应的语法结构,如C语言中的函数指针,C++中的虚函数等。对于不同的操作这里要链接的对象从外部看来无论软件、硬件都体现为函数代码,因为我们对外提供的是一个统一的接口。(每个操作都被看成函数代码,这是C语言程序设计的一个主要思想) 首先给出一段DES的C程序代码(可扩展为其他语言),通过决策机制软硬件划分算法,决定是采用封装好的硬件函数和接口函数或者是采用.h和.c的软件函数执行。
本发明的操作过程是,任意一台现今主流配置的电脑作为开发工具,Eclipse作为开发工具。用户通过该开发工具进行嵌入式系统的设计,在开发过程中可以调用软硬件协同函数库。
第一步,开启电脑。
第二步,打开Eclipse开发工具。
第三步,将软硬件协同函数库拷贝到开发工具的根目录下,如“C:\Eclipse\”目录下 第三步,新建软件工程。
第四步,添加程序源文件,并调用3des.h。调用的代码为 #include<3des.h> 第五步,编写软硬件协同函数库测试函数。(测试函数主要是定义我所调用的函数所需要的数据,并调用该函数) 如调用的函数为一个加法函数add(a,b),那么在头文件已经包含的情况下我的测试函数如下(这是一个标准的C语言程序) int main() int c,d,e; c=4; d=5; e=add(c,d);//调用该函数 ….. 第六步,进行工程的动态编译(动态编译为软件设计人员都熟知的过程)。
实例1 函数实现具体实例 3DES的实现过程 1.设置头文件首先为3des函数声明一个对外接口(为简单起见,这里假设函数只包含3des的加密和解密函数),它包含在3des.h文件中,应用程序包含此文件就能利用库中函数实现完成编程;代码如下 /*3des.h*/----头文件名; #define ENCRYPT 0 #define DECRYPT 1 typedef enum bool{false,true}bool; extern bool tri_des_encrypt(char*Out,char*In,long datalen,const char*Key,int keylen);----定义加密函数; extern bool tri_des decrypt(char*Out,char*In,long datalen,const char*Key,int keylen);---定义解密函数; 在一个文件对应具体函数的文件,具体函数如3des里面,同时包括软件实现和硬件接口代码。
整个函数库就是一个文件。
2.软件函数采用传统的软件方式实现(这里不详述) 3.硬件接口代码的实现 3.1 int hw_tri_des_encrypt(char*Out,char*In,long datalen,const char*Key,int keylen)函数即为接口函数,关键代码如下 bool hw_tri_des_encrypt(char*Out,char*In,long datalen,const char*Key,intkeylen) { …… TripleDES(true,*datain,k
,k[1],k[2],dataout);//该处为调用参数传递和计算函数 } …… return true; } 3.2函数中包含一个init函数,该函数将在main函数调用前得到执行,它完成两件事,一件是打开物理内存设备文件,将物理地址映射成虚拟地址;一件是调用dl_get_cfl_path函数获得当前软硬协同函数库的绝对路径,该函数也是动态链接器为编程模型提供的接口,在程序中值得注意的地方在于刚进入函数时调用了dl_update_time_front和dl_get_time函数,在函数结尾时调用了dl_hw_update_time函数,这些函数将自动测量和保存该硬件函数的执行时间,对于软件函数也有类似代码.这些函数为系统函数,用以给协同函数库开发人员提供相关信息。(以上三个函数为系统函数可以直接调用)关键代码如下 static void init() { now=&dl_get_time;//保存系统当前时间 upstime=&dl_sw_update_time;//保存软件部分执行时间 uphtime=&dl_hw_update_time;//保存硬件部分执行时间 …… base_addr=mmap(0,XPAR_TRIPLEDES_0_HIGHADDR- XPAR_TRIPLEDES_0_BASEADDR,PROT_READ|PROT_WRITE,MAP_SHARED,fd,XPAR_TRIPLEDES_0 _BASEADDR);//将物理地址映射成虚拟地址 …… return; } 3.3TripleDES为执行参数传递和计算的函数,它获得虚拟地址后就能与硬件通信。该函数执行的都是一些对寄存器的读写工作,这是因为当前3DES硬件实现与总线接口要通过IPIF为一个专(IPIF为专用名词,它是总线与IP核相连的接口),使用IPIF提供的寄存器通信,这些寄存器的基地址与参数base_addr(在上面程序中提到该参数)对应的物理地址相同。为了实现运行时应用程序划分改变,协同函数的指令在编译时不能直接编译进应用程序的主文件,所以将软硬件协同函数库编译成共享库文件,即声明在3des.h中。该过程使用过硬件开发工具的设计人员熟知,因此不再详述。
3.4可重构资源管理器负责管理可重构资源,调度硬件加速器的配置与执行,是操作系统的一部分,作为内核驱动开发。因此我们为其提供了的编程接口如以下代码所示。(通过该部分提高硬件函数的加速,我们仅提供接口具体实现由硬件设计人员设计) typedef struct address_range { unsigned long base; unsighed long high; } address_range;//地址范围 address_range*configure(char*cfl_path,char*cf_relative_path,address_range* phy_address,address_range*ret_bal);//配置资源 int deconfigure(address_range*phy_address);//释放资源 void clean_config_info();//清除设置 5.利用编译命令对所写好的.c文件包含了软件函数和硬件接口代码(即3des.c)进行编译(在linux系统中编译命令为gcc-fPIC-c*.c Gcc-shared-wl,-soname,lib3des.so.l-o lib3des.so.1.0*.o,在其他系统中可以采用其他C的交叉编译器进行编译)。
6.硬件实现的配置文件采用传统的硬件开发工具如EDK等实现(这里不再详细叙述) 7.将这编译好的文件和硬件配置文件,保存到函数库文件夹即可。
软硬件系统函数库调用实例该测试程序保存为3destest.c #include<stdio.h> #include<stdlib.h> #include<string.h> #include<memory.h> #include″3des.h″//该处为调用头文件 int main(int argc,char*argv[]) { ……//前面都是一些函数加密的参数设置 tri_des_encrypt(buf,buf,sizeof(str),key,sizeof(key));//该处为调用协同函数库中加密函数的统一对外接口 ……//这里都是一些函数解密的参数设置 tri_des_decrypt(buf,buf,sizeof(str),key,sizeof(key));//该处为调用协同函数库中解密函数的统一对外接口 …… return 0; } 调用算法的自然语言描述为 如果该函数满足硬件实施的条件(具体由划分算法的标准确定) 则采用以下语句调用硬件实现 hw_tri_des_encrypt(char*Out,char*In,long datal en,const char*Key,intkeylen); 否则,则采用以下语句调用软件函数 DES(char Out[8],char In[8],const PSubKey pSubKey,bool Type);。
考虑硬件预配置因素的动态软硬件划分方法的实施例1 考虑硬件预配置因素的动态软硬件划分方法,其流程图见图7. 算法性能测评 使用C语言描述我们提出的过程级软硬件划分算法。由于实际已有的软硬件划分算法大多采用进程作为划分单位,或采用基本块(指令级划分),而本发明提出的是在过程级进行软硬件划分,以自定义的软硬件抽象函数为划分对象,与这些算法难以直接进行比较实验。所以本文考虑平台的特点,设计了以下三种方法来评估本文算法的性能,一个是无动态重构支持;二是加入部分动态可重构后的划分;三是引入预配置后的划分。三种方法都使用JPEG编码系统进行验证。
仿真或实验表明无动态重构支持的软硬件划分性能最差,动态重构下的划分性能比前者提高了9.93%。引入预配置后,过程级软硬件划分的性能比无动态重构支持的划分提高了18.44%,比动态重构下的划分提高了9.45%。实验表明,随着可重构资源利用效率的不断提高,过程级软硬件划分的优势将更为明显。
一种考虑硬件预配置因素的动态软硬件划分方法,其特征在于,在程序运行过程中,在可重构硬件资源上已配置一个或多个函数,对待划分函数维护一个待划分函数列表list(f1,…,fm),其中fk为硬件加速比,k为待划分的一个函数;k=1,…,m,m为待划分函数个数

F对应待划分函数的集合;Ck为函数k被调用的次数,Timeswk为函数k的软件执行时间;

为0时表示函数k当前划分为硬件,反之表示函数k当前为软件;Trfk对应函数k的硬件实现函数的配置时间;Timehwk为函数k的硬件执行时间;Commk为函数k的硬件实现函数的软硬件通信代价,为硬件与软件的参数传递时间(可以用传统的仿真工具仿真出来,函数的软件执行时间可以由系统中统计函数执行时间的函数得到); 3DES加密函数和解密函数使用一个硬件加速器,配置时间为Commk=9.40E-05s;Hamming编码函数和解码函数使用另一个加速器,

Commk=7.6E-06s对于一个复杂的嵌入式系统,一次运行可能调用,这些函数上千次以上,所以Ck设为2000,根据以上参数可以算出3DES的f=2.07,Hamming编码的f=0.01。
测试例实验同时运行两项任务,3DES加密函数和解密函数使用一个硬件加速器,配置时间为3.0179526s,Hamming编码函数和解码函数使用另一个加速器,配置时间为2.3684901秒,分别测试它们对1K或1M数据进行处理,在不同配置下程序所消耗的时间,其中static表示程序运行时加速器已经静态配置完毕,而dynamic表示加速器将在程序运行时动态配置;all software表示上四个函数执行方式为纯软件执行,all hardware为纯硬件执行,3des hardware表示3DES加/解密函数用纯硬件执行,而hamming编/解码则用纯软件执行,hamming hardware则正好相反,random hardware表示这四个函数的执行方式是随机的,这五个不同的配置可以通过替换划分算法库来实现。
由于软件执行速度慢,从而导致动态重构情况下全软件实现模式性能最差。3DES的软硬件实现是影响程序性能的关键,在处理的数据较大的情况下,只将它动态划分到硬件实现,取得几乎与静态配置同样高的性能,比纯软件实现至少快一个数量级,这是因为①3DES的加速比和执行时间比Hamming更大;②3DES配置时间与运行时间比可以忽略。
权利要求
1.一种过程级软硬件协同设计自动化开发方法,其特征在于,包括以下步骤
步骤A利用高级语言完成系统功能描述,系统功能描述中包括软硬件协同函数的调用,所有的软硬件协同函数都放置在同一个软硬件协同函数库中;
步骤B软硬件函数的动态划分在程序运行时,采用动态软硬件划分方法对程序调用的软硬件协同函数进行划分,即确定具体的软硬件协同函数将要采用软件实现还是硬件实现;
步骤C链接和执行步骤动态链接器根据动态软硬件划分方法的划分结果,对具体的函数进行链接,对于采用软件实现的函数;就将该采用软件实现的函数翻译为软件指令交给中央处理器执行;对于采用硬件实现的函数,则调用硬件实现的函数的配置文件,配置可重构资源并执行该硬件实现的函数;
步骤D判断和结束步骤;判断是否所有的函数执行完毕,如果执行完毕就结束,否则返回用于划分的参数到步骤B进入下一次循环;所述的函数包括软硬件协同函数和非软硬件协同函数,非软硬件协同函数即普通函数。
2.根据权利要求1所述的过程级软硬件协同设计自动化开发方法,其特征在于,
所述的动态连接器具体完成以下4个任务
第一个任务是将当前函数区分成软硬件协同函数和普通函数定义一个用于存放软硬件协同函数库的路径的环境变量,程序运行时,对于程序调用的当前函数,取出该当前函数的链接映射(link_map)中的存放调用来源的变量值(l_origin),将存放调用来源的变量值(l_origin)与环境变量的值比较,如果相同,则确定该当前函数为软硬件协同函数;否则,为普通函数;
第二个任务是检测当前调用的函数是否为软硬件协同函数,如果是,则将用于决定即将执行函数的地址的变量(GOT)值修改为软硬件协同函数库中具体函数的入口地址,用于进行协同函数库的访问,如果不是,则调用elf_machine_fixup_plt函数,elf_machine_fixup_plt函数的作用为定位普通函数执行方式的地址;
第三个任务是给软硬件协同函数库提供注册接口,为动态软硬件划分方法提供反馈的性能参数,所述的性能参数包括当前函数的结束时间、软/硬件运行时间、软/硬件调用次数、本软硬件协同函数的软/硬件总运行时间以及记录所有软硬件协同函数的软/硬件总运行时间的变量;
第四个任务是使编译后的可执行文件使用修改后的动态链接器,具体为将操作系统链接(link_os_linux)和linux操作系统中的gnu链接改成动态链接器的绝对路径。
3.根据权利要求1所述的过程级软硬件协同设计自动化开发方法,其特征在于,所述的软硬件协同函数库的构造方法为
所述的软硬件协同函数库包括多个软硬件协同函数,每一个软硬件协同函数包括头文件、具体函数实现文件和硬件配置文件;
在具体函数实现文件中构造每一个具体函数的软件函数实现和硬件接口代码;在软件函数实现和硬件接口代码中设置检测硬件函数执行时间或软件函数执行时间的代码;
在硬件配置文件具有通过硬件实现具体函数的硬件描述语言代码;
在所述的头文件中声明多个具体函数的名称和参数形式;为程序调用具体的软件函数实现和硬件接口代码提供统一的函数接口;
调用软硬件协同函数时,在新建的程序文件中添加所需调用函数的头文件;在新建的程序文件中采用函数名调用的方式,调用头文件提供的统一函数接口;在程序编译时采用动态编译方式,在动态编译过程中根据划分算法选择该函数是调用软件函数实现或硬件接口代码;
检测硬件函数执行时间或软件函数执行时间为使用系统运行环境导出函数来实现。
4.根据权利要求1~3任一项所述的过程级软硬件协同设计自动化开发方法,其特征在于,所述的动态软硬件划分方法为分支界定算法或贪婪算法或考虑硬件预配置因素的动态软硬件划分方法,所述的考虑硬件预配置因素的动态软硬件划分方法具体为
在程序运行过程中,进行动态的软硬件划分,在可重构硬件资源上进行一个或多个函数的配置,对待划分函数维护一个待划分函数列表list(f1,…,fm),其中fk为硬件加速比,k为待划分的一个函数;k=1,…,m,m为待划分函数个数,硬件加速比定义为F对应待划分函数的集合;Ck为函数k在程序运行过程中被调用的次数,Timeswk为函数k的软件执行时间;
为0时表示函数k当前划分为硬件,反之表示函数k当前为软件;Trfk对应函数k的硬件实现函数的配置时间;Timehwk为函数k的硬件执行时间;Commk为函数k的硬件实现函数的软硬件通信代价,为硬件与软件的参数传递时间;
具体划分步骤如下
步骤1从列表list(f1,…,fm)中选出最大值fi;
步骤2如果fi已经被划分为硬件,则从列表中删除fi,更新列表,返回步骤1,否则,进入下一步;
步骤3检测当前的可重构资源是否足够,是则将函数i划分为硬件,并配置到可重构资源上,从列表中删除fi,更新列表,返回步骤1;
否则,进入下一步;
步骤4fi与fj比较,fj为函数j的硬件加速比,函数j为已经配置在可重构资源上的函数中的一个函数,且在所有的已经配置在可重构资源上的函数中,函数j所对应的加速比最小;如果fi大于fj,则将函数j划分为软件,从可重构资源中删除函数j,返回步骤3;如果fi小于fj,则进入步骤4.1;
步骤4.1检测list是否为空,不空,则保存本次划分结果,结束;如果是空,则计算关系矩阵Cst,选出该关系矩阵Cst中最大值元素cst,将cst对应的函数t加入到待划分函数列表list(f1,…,fm)中更新待划分函数列表list(f1,…,fm),进入步骤4.2;
所述的Cst记录函数调用次序信息,关系矩阵Cst为m*N个元素,N为m个待划分的函数可能调用的所有函数的个数;s元素表示当前划分的所有函数,元素cij表示函数i被调用后立刻就调用了函数j的次数。
全文摘要
本发明提供了一种过程级软硬件协同设计自动化开发方法,其特征在于,包括以下步骤步骤1利用高级语言完成系统功能描述,系统功能描述中包括软硬件协同函数的调用;步骤2软硬件函数的动态划分;步骤3链接和执行步骤;步骤4判断和结束步骤;判断是否所有的函数执行完毕,如果执行完毕就结束,否则返回用于划分的参数到步骤2进入下一次循环。本发明使用过程级软硬件统一编程模型,来屏蔽底层硬件实现的差异,达到可重构器件对程序用户透明的目的。该编程模型将硬件加速器封装成C语言函数,方便用户编程,且支持运行时的动态软硬件划分,使划分对程序员透明,提高了可重构资源的利用率。
文档编号G06F9/44GK101763265SQ20101002208
公开日2010年6月30日 申请日期2010年1月19日 优先权日2010年1月19日
发明者李仁发, 陈宇, 徐成, 吴强, 刘彦, 朱海, 袁虎, 钟俊, 刘滔, 邝继顺, 李蕊, 李肯立, 罗娟, 赵欢, 杨科华, 任小西, 杨书凡, 彭日光, 李春江, 黄瑜臣, 张维, 李浪 申请人:湖南大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1