一种嵌入式软件内部模块解耦合的开发加载方法及装置与流程

文档序号:37351596发布日期:2024-03-18 18:32阅读:16来源:国知局
一种嵌入式软件内部模块解耦合的开发加载方法及装置与流程

本发明涉及一种嵌入式软件的开发及加载方法。


背景技术:

1、耦合性(coupling),也称耦合度,是对模块之间关联程度的度量。在软件工程中,耦合度是指软件内部模块之间的依赖关系,包括控制关系、调用关系、数据传递关系等。软件内部模块之间的联系越多,其耦合性越强,其独立性越差。解耦是指降低软件内部模块之间的耦合度。软件内部模块之间有依赖关系就必然存在耦合,完全解除耦合关系实现绝对零耦合是做不到的,但可以通过一些方法将模块之间的耦合度降低。

2、嵌入式系统(embedded system)是指一种具有特定功能和实时计算性能的计算机系统,通常嵌入到较大的机械或电气系统中。嵌入式软件(embedded software)是指在嵌入式系统中执行例如控制功能的计算机软件,也称嵌入式程序。

3、在基于linux的嵌入式软件开发中,将系统程序(kernel,也称内核)和应用程序进行分离的方法是动态加载(dynamic loading,也称动态装载)。这是指系统程序及应用程序独立开发,应用程序编译及链接后会生成可执行文件放在文件系统中,运行时由系统程序去加载应用程序的可执行文件到内存中执行,这种方式适用于处理器(例如片上系统soc)性能较强且内存(例如ram)空间较大的嵌入式系统。

4、在基于rtos(real-time operating system,实时操作系统,也称即时操作系统)的嵌入式软件开发中,由于rtos本身不具备动态加载方法,实现动态加载的程序复杂度较高,所以程序都采用固定加载。受限于处理器的运算能力及内存空间,不同功能模块的程序如系统程序与应用程序会被一起编译并链接成一个二进制文件,烧写到非易失性存储器(例如闪存flash)中,运行时加载到内存中执行。由于系统程序与应用程序耦合在一起(即存在调用关系),无论修改哪一部分程序,所有程序都要被重新编译及链接,极大地降低了开发效率及程序的可维护性。


技术实现思路

1、本发明所要解决的技术问题是如何将嵌入式软件内部的不同功能模块的程序(例如系统程序及应用程序)有效解耦,实现各部分可独立编译及加载,提高程序的可维护性。

2、为解决上述技术问题,本发明提供了一种嵌入式软件内部模块解耦合的开发加载方法,包括如下步骤。步骤s1:将嵌入式软件划分为系统程序和应用程序两部分;系统程序包括系统函数;应用程序依赖于系统函数的调用。步骤s2:在系统程序中设置加载程序、系统程序分散加载脚本、系统函数索引表、系统函数查询接口。所述加载程序用于加载及执行应用程序。所述系统程序分散加载脚本指定系统程序的可执行文件内部各区域在内存中的加载与运行位置;还在内存中定义一块供所有应用程序使用的加载和运行空间。所述系统函数索引表中包含全部系统函数名称、全部系统函数的运行地址。所述系统函数查询接口用于通过查询系统函数索引表根据系统函数名称字符串返回系统函数运行地址。步骤s3:在应用程序中设置初始化引导程序、应用程序分散加载脚本。所述初始化引导程序用于初始化该应用程序的部分或全部内部区域,并从应用程序分散加载脚本中获取系统函数查询接口的运行地址。所述应用程序分散加载脚本指定应用程序的可执行文件内部各区域的在内存中的所述加载和运行空间中的加载与运行位置;还在内存中定义一块区域用于存放系统函数查询接口的运行地址。所述步骤s2、步骤s3或者同时进行,或者任一在前。步骤s4:分别独立编译、链接系统程序和应用程序,得到系统程序二进制文件和应用程序二进制文件。步骤s5:将系统程序二进制文件烧写到嵌入式设备的非易失性存储器;应用程序二进制文件或者同时烧写到嵌入式设备的非易失性存储器中,或者在需要时进行烧写;系统程序二进制文件、应用程序二进制文件分别烧写到嵌入式设备的非易失性存储器的不同区域。

3、示例性地,所述步骤s1中,所述系统程序包括操作系统、硬件驱动程序、必要功能组件、系统函数;其中,必要功能组件是指为应用程序提供基本支持功能的程序;系统函数是指系统程序提供的接口函数。

4、进一步地,所述步骤s2中,系统程序加载任意应用程序时,将该应用程序的可执行文件从非易失性存储器中复制到系统程序分散加载脚本在内存中指定的加载与运行空间,并在内存的这一块加载与运行空间中执行该应用程序。

5、示例性地,所述步骤s2中,所述系统函数索引表是一个二维数组,二维数组内的每项包括两个元素;一个元素是系统函数名,被编译器编译为系统函数的运行地址;另一个元素是系统函数名称字符串。

6、进一步地,所述步骤s3中,每个应用程序中都有一个初始化引导程序;当由系统程序执行某个应用程序时,该应用程序中的初始化引导程序首先被执行。

7、进一步地,所述步骤s3中,所述初始化引导程序用于初始化该应用程序的.bss段及.data段;.bss段是指用来存放应用程序中未初始化的全局变量的一块内存区域;.data段是指用来存放应用程序中已被初始化成非0值的变量的一块内存区域;

8、进一步地,所述步骤s3中,每个应用程序中都有一个应用程序分散加载脚本;应用程序在运行时通过所包含的应用程序分散加载脚本获取到系统函数查询接口的运行地址。

9、进一步地,所述步骤s3中,应用程序分散加载脚本安排在内存中的所述加载和运行空间中依次存放所属应用程序的可执行文件的内部各区域:(1).init段,表示存放该应用程序中初始化引导程序的地址空间;(2).func段,表示存放系统函数查询接口的地址空间;(3).text段,表示存放该应用程序的代码段地址空间;(4).data段,表示存放该应用程序中已被初始化成非0值的变量地址空间;(5).bss段,表示存放该应用程序中未初始化的全局变量地址空间。

10、进一步地,所述步骤s4中,将系统程序源文件编译为系统程序目标文件,再将系统程序目标文件链接为系统程序二进制文件;将应用程序源文件编译为应用程序目标文件,再将应用程序目标文件链接为应用程序二进制文件。

11、本发明还提供了一种嵌入式软件内部模块解耦合的开发加载装置,包括功能模块划分单元、系统程序设置单元、应用程序设置单元、分别编译单元、烧写单元。所述功能模块划分单元用来将嵌入式软件划分为系统程序和应用程序两部分;系统程序包括系统函数;应用程序依赖于系统函数的调用。所述系统程序设置单元用来在系统程序中设置加载程序、系统程序分散加载脚本、系统函数索引表、系统函数查询接口;所述加载程序用于加载及执行应用程序;所述系统程序分散加载脚本指定系统程序的可执行文件内部各区域在内存中的加载与运行位置;还在内存中定义一块供所有应用程序使用的加载和运行空间;所述系统函数索引表中包含全部系统函数名称、全部系统函数的运行地址;所述系统函数查询接口用于通过查询系统函数索引表根据系统函数名称字符串返回系统函数运行地址。所述应用程序设置单元用来在应用程序中设置初始化引导程序、应用程序分散加载脚本;所述初始化引导程序用于初始化该应用程序的部分或全部内部区域,并从应用程序分散加载脚本中获取系统函数查询接口的运行地址;所述应用程序分散加载脚本指定应用程序的可执行文件内部各区域的在内存中的所述加载和运行空间中的加载与运行位置;还在内存中定义一块区域用于存放系统函数查询接口的运行地址。所述分别编译单元用来分别独立编译链接系统程序和应用程序,得到系统程序二进制文件和应用程序二进制文件。所述烧写单元用来将系统程序二进制文件烧写到嵌入式设备的非易失性存储器中;应用程序二进制文件或者同时烧写到嵌入式设备的非易失性存储器中,或者在需要时进行烧写;系统程序二进制文件、应用程序二进制文件分别烧写到嵌入式设备的非易失性存储器的不同区域。

12、本发明取得的技术效果是:(1)系统程序和应用程序的编译解耦,使相同体系结构下不同工具链编译的程序可以相互调用,降低购买工具链的成本。(2)在通常开发中,系统程序和应用程序分别由不同公司开发,如有代码依赖会产生调试困难以及程序升级困难,利用本发明的解耦方法可以降低开发难度,提升开发效率。

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