基于前后台系统驱动程序与应用程序的相互加载的方法

文档序号:6432115阅读:146来源:国知局
专利名称:基于前后台系统驱动程序与应用程序的相互加载的方法
技术领域
本发明主 涉及一种嵌入式软件开发,尤其是指一种实现驱动程序和应用程序相互加载的方法。
背景技术
随着消费电子产品技术的不断发展,功能的不断变大,程序的代码量也越来越大,如何有效的对软件进行维护是开发工程师一个非常棘手的问题,特别是越来越多的产品都带有远程更新等功能,远程更新速度(特别是无线的)也日益成为衡量产品的一项标准,在前后台系统中,若能将固定部分软件和更新部分软件分离,不但大大的提高了升级速度,而且大大的降低了升级过程中由不确定因素造成的升级失败原因等明显优势。

发明内容
为解决上述前后台系统升级速度慢的问题,本发明提供一种基于前后台系统驱动程序与应用程序的相互加载的方法,包括步骤A :在ROM空间中分配用于存放驱动程序代码的驱动代码区和用于存放应用程序代码的应用代码区;步骤B :在RAM空间中分配用于为驱动程序运行提供空间的驱动层空间、用于为应用程序提供运行空间的应用层空间、用于存放驱动程序函数入口地址和应用程序函数入口地址的程序交互区;步骤C :将函数的入口地址写入所述程序交互区,通过编译建立驱动映射表,所述驱动映射表包括函数入口地址与程序代码的一一对应关系,驱动程序与应用程序通过所述驱动映射表相互调用。其中,所述步骤A还包括在ROM空间中分配保护区,所述保护区位于驱动代码区和应用代码区之间。其中,所述步骤B还包括在RAM空间中分配用于供驱动程序和应用程序运行共用的堆栈空间。其中,所述步骤C中驱动程序和应用程序相互调用是通过定义宏的方式来实现。其中,还包括步骤D :将所述步骤C中的所述各个宏封装为一个函数,提供给其他应用函数的调用。其中,还包括对驱动映射表的维护步骤,所述维护步骤包括对驱动映射表的增加、删除或修改。其中,所述步骤B还包括在RAM空间中分配Vector中断向量表,存放相应的中断向量。采用这种技术方案,由于驱动程序和应用程序的代码存放于不同的ROM空间,在运行时,由于驱动程序和应用程序使用在RAM空间的驱动层空间和应用层空间作为其对应的内存,从而实现了驱动程序和应用程序的分开运行,因此在系统更新的时候,只需要更新应用程序部分,而不需要更新固定的驱动程序部分,从而提高了升级速度,而且大大的降低了升级过程中又不确定因素造成的升级失败原因,增加了寿命以及减少了费用等优点。


图I为本发明实施例提供的总体流程图;图2为本发明实施例提供的ROM空间的结构示意图;图3为本发明实施例提供的RAM空间的结构示意图。
具体实施例方式为详细说明本发明的技术内容、构造特征、所实现目的及效果,以下结合实施方式并配合附图详予说明。请参阅图I以及图2,本发明提供一种基于前后台系统驱动程序和应用程序的相互加载的方法,包括以下步骤,步骤A :在ROM空间中分配用于存放驱动程序代码的驱动代码区和用于存放应用程序代码的应用代码区;步骤B :在RAM空间中分配用于为驱动程序运行提供空间的驱动层空间、分配用于为应用程序提供运行空间的应用层空间和分配用于为驱动程序和应用程序的函数入口地址提供存放空间的程序交互区;步骤C :将函数的入口地址写入所述程序交互区,通过编译建立驱动映射表,所述驱动映射表包括函数入口地址与程序代码的一一对应关系,驱动程序与应用程序通过所述驱动映射表相互调用。下面依照各个步骤详细描述本发明的实施方式。一、请参阅图I和图2,步骤A完成了 ROM空间的分配。ROM空间是用来固化代码以供数据使用的,因此在工程上应用程序和驱动程序都有各自独立的代码和数据,通常在代码运行有分成两个域加载域和运行域,加载域是系统上电开始到将固化在ROM的代码搬迁到各自预先设置好的地址,及RW,ZI段的初始化阶段。运行域则是指加载阶段完成后,真正跳转到主函数的阶段。因此代码的存放地址的匹配与否直接关系到该程序能否运行。由于各个处理器的开发环境下都有设置对应代码的ROM初始入口地址,本实施例将ROM空间为驱动程序和应用程序分别设置了两个分区驱动代码区和应用代码区,将驱动程序的代码写入驱动代码区,将应用程序的代码写入应用代码区,采用这种方案,就能够将驱动程序的入口地址与应用程序的入口地址分开,就能够实现代码地址与主函数调用时的匹配。同时,作为优选的,为了防止后期代码的变大导致空间不足的问题,在ROM空间设置一个保护区,该保护区位于驱动代码区和应用代码区之间,具体是指,在ROM空间分区时,将驱动代码区所处的扇区与保护区相邻,同时,保护区所处的扇区又与应用代码区相邻,这样在物理分区上,该保护区就位于驱动代码区和应用代码区之间。二、请参阅图I和图3,步骤B完成RAM空间的分配。在应用中,工程之间的内存也需相互独立,否则会导致整个系统崩溃,RAM空间的分配,主要是为每个工程分配各自的内存,这样驱动程序和应用程序的代码在运行时就相互独立,从而防止变量间的叠加,篡改等问题。在本实施例中在RAM空间设置驱动层空间和应用层空间,为驱动程序和应用程序提供不同的运行内存空间,使其运行时相互独立。由于在一个工程编译完成后,其RW段,ZI段的大小是固定的可知的,因此只需要给定充足的堆栈空间就可以保证一个代码的正常运行,特别的,由于驱动程序是提供给应用程序调用的,因此堆栈是可以共用的,所以只要保证对应程序下的RW,ZI段的空间即可保证代码的正常运行,同样的,在编译的时候都可以设置各自的内存入口地址,因此只需要将应用驱动的内存首地址分开且有足够的空间即可。基于上述理由,在本实施例中,在RAM空间设置了堆栈空间。另外本实施例中,RAM空间还分配了一个Vector中断向量表,用以存放对应的中断向量。本实施例中,RAM空间的分配顺序为Vector中断向量表,驱动层空间,应用层空间,堆栈空间和程序交互区。需要指出的是,这种空间的分配顺序并不是固定的,这只是所有可行的方案中的一种。在步骤B中已经将RAM空间分配一部分为程序交互区,程序交互区用来存放函数的入口地址,因此交互区的每个单元必须为一个地址长度,在调用的时候,利用指针的方式进行函数调用。指针方式的调用方法为本领域技术人员所熟悉的,这里只举出一种例子1,如I.将void sys_init (void)存放到交互区地址addr中2.定义一个void*p指针,然后将指针P指向addr地址3.调用*p = sys_init,即实现了该程序交互区的初始化 4.应用程序就可以在该地址下调用sys_init()函数。三、请参阅图1,步骤C建立驱动映射表,建立驱动函数调用的各个宏。步骤C中已经将需要传递给应用程序调用的函数入口地址一一写入了程序交互区,也就是建立了为驱动程序调用的驱动映射表。另外本发明还包括对驱动映射表的维护步骤,所述维护步骤包括对驱动映射表的增加、删除或修改。本实施例中,对函数的调用采用变量函数指针,有了函数指针后就可以装载任意形参和返回值的函数了,这里举出一个例子2 :I.将sys_init函数指针填入程序交互区地址addr ;2.在应用程序下定义一个void(*) (void)p的函数指针,将P指向addr ;3.调用P O即可完成sys_init函数的调用。上述方法是用于函数地址是变量的通用情况,但是在完成RAM空间的程序交互去初始化后,所有的函数地址都是固定的,因此作为优选的,本实施例还给出另外一种方法,具体是指直接用一个宏来完成一个函数的声明,如例子3I.将例2中的sys_init函数,在应用程序下定义一个宏#define sys_init ()(Void (*) (Void) addr)();2.完成了步骤1,就可以在应用程序下调用sys_init函数。四、另外,为了节省代码,本实施例还提出一种优化的方法,即步骤D将所述步骤C中的所述各个宏封装为一个函数,提供给其他应用函数的调用。这里举例子4来解释如何优化代码量,调用上面步骤D的SyS_init O宏的汇编代码如下
STMFD rl3!,{r3,rl4}
LDR r0,0x6c LDR r0,[r0,#0]
MOV rl4,pcMOV pc,r0
MOV r0,#0
LDMFD rl3!,{r3,pc}如果将宏封装成一个函数调用,如下
void appsysinit(void)
{ sysinitQ;
}调用该函数产生的汇编代码如下
STMFD rl3!,{r3,rl4}
BLappsysinit
MOV r0,#0
LDMFD rl3!,{r3,pc}与前面相比整整少了三条指令,通过以上不难得出以下结论如果应用调用该函数N次,使用封装函数后将未封装少3* (N-I)条指令,在大工程中这个代码量相差是非常显著的。以下是本实施例的具体实施效果下面是针对某消费电子产品软件使用该发明后的总体情况对比
权利要求
1.一种基于前后台系统驱动程序与应用程序的相互加载的方法,其特征在于,包括 步骤A :在ROM空间中分配用于存放驱动程序代码的驱动代码区和用于存放应用程序代码的应用代码区; 步骤B:在RAM空间中分配用于为驱动程序运行提供空间的驱动层空间、用于为应用程序提供运行空间的应用层空间、用于存放驱动程序函数入口地址和应用程序函数入口地址的程序交互区; 步骤C :将函数的入口地址写入所述程序交互区,通过编译建立驱动映射表,所述驱动映射表包括函数入口地址与程序代码的一一对应关系,驱动程序与应用程序通过所述驱动映射表相互调用。
2.根据权利要求I所述基于前后台系统驱动程序与应用程序的相互加载的方法,其特 征在于所述步骤A还包括在ROM空间中分配保护区,所述保护区位于驱动代码区和应用代码区之间。
3.根据权利要求I所述基于前后台系统驱动程序与应用程序的相互加载的方法,其特征在于所述步骤B还包括在RAM空间中分配用于供驱动程序和应用程序运行共用的堆栈空间。
4.根据权利要求I所述基于前后台系统驱动程序与应用程序的相互加载的方法,其特征在于所述步骤C中驱动程序和应用程序相互调用是通过定义宏的方式来实现。
5.根据权利要求4所述基于前后台系统驱动程序与应用程序的相互加载的方法,其特征在于,还包括 步骤D :将所述步骤C中的所述各个宏封装为一个函数,提供给其他应用函数的调用。
6.根据权利要求I所述基于前后台系统驱动程序与应用程序的相互加载的方法,其特征在于还包括对驱动映射表的维护步骤,所述维护步骤包括对驱动映射表的增加、删除或修改。
7.根据权利要求I所述基于前后台系统驱动程序与应用程序的相互加载的方法,其特征在于所述步骤B还包括在RAM空间中分配Vector中断向量表,存放相应的中断向量。
全文摘要
本发明提供一种基于前后台系统应用驱动相互加载的方法,在ROM空间中分配驱动代码区和应用代码区;在RAM空间中分配驱动层空间、应用层空间和分配用于为驱动程序和程序交互区;将函数的入口地址写入所述程序交互区,通过编译建立驱动映射表,所述驱动映射表包括函数入口地址与程序代码的一一对应关系,驱动程序与应用程序通过所述驱动映射表相互调用,采用这种方案,能够将驱动程序和应用程序的运行分开,从而在更新程序的时候,能够只更新应用部分,缩短了软件更新时间,具有增加寿命及减少费用等优点。
文档编号G06F9/445GK102955707SQ20111025548
公开日2013年3月6日 申请日期2011年8月31日 优先权日2011年8月31日
发明者李延平, 黄海峰 申请人:福建三元达软件有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1