发明内容
为解决上述现有技术所存在的问题,本发明提出了一种嵌入式系统程序执行方法,用于在嵌入式系统中执行应用程序,包括:
应用程序编译生成以段为单元的对象文件;
在运行程序初始化函数之前,禁用WDT计时器;
在RAM中分配空间,并编写拷贝函数,将文件中的各段从FLASH拷贝到RAM。
优选地,所述文件以段的形式组织代码和数据,分为赋值段和未赋值段,其中在嵌入式系统上电时,赋值段含有真实有效的参数,未赋值段用于保留程序运行过程中所需开辟的变量的地址空间,在程序运行时,所有的赋值段链接到非易失性存储器中,未赋值段的代码链接到RAM中,
所述赋值段包括以下内容段:.text、.cinit、.pinit、.switch、
.const、.econst,其中.text、.cinit、.pinit、.switch段为程序空间,.const、.econst段为数据空间,
所述未赋值段包括以下内容段:.bss、.ebss、.stack、.system、.esystem,均为数据空间。
优选地,所述嵌入式系统基于TMS320C6455微处理器,对该微处理器汇编成各自的目标代码段,然后用链接器将其链接起来生成可执行文件,
上电后,程序起始标号的长跳转指令被加载到入口地址处并开始执行,接着指针跳转到WDT计时器禁用代码,之后再执行拷贝函数,将所有段复制到RAM中,所述长跳转指令及WDT计时器禁用代码部分分别置于相应的段下,并组合成汇编文件,添加到工程文件的source路径下,
并且,拷贝函数可将代码段及各个变量段从FLASH拷贝到RAM,应用程序在复制时,通过链接命令文件中指明的信息调用段的起始地址、长度以及运行地址,同时将拷贝函数链接到代码拷贝段中。
优选地,当所有的段都被复制完毕时,通过跳转指令跳转到程序初始化函数,直接进入主函数执行。
优选地,在将段进行拷贝时,首先将该段的大小先暂存到寄存器XAR5,再存储到累加器ACC中;将加载地址存储到XAR6寄存器中;运行地址存储到XAR7寄存器中,再执行copy操作即可完成该段的拷贝。
优选地,所述链接命令文件分为两部分,第一部分用于指明和定义装载代码所用到的所有存储区域即程序空间和数据空间,以便链接器进行配置;第二部分主要是将每一个输出段映射到所分配的存储空间里面去,并指定段的加载地址和运行地址,
对于赋值段,加载和运行分配到不同的存储空间,对未赋值段的加载和运行只需分配到RAM空间,并且在用户代码从FLASH拷贝到片内RAM之前,将WDT计时器禁用段加载和运行于FLASH中。
相比于现有技术,本发明的技术方案的具有以下优点:将整个应用程序都拷贝到RAM中执行,以提高代码整体运行速度。
具体实施方式
多种方式可以用于(包括实施为过程;装置;系统;物质组成;在计算机可读存储介质上包括的计算机程序产品;和/或处理器(诸如如下处理器,该处理器被配置成执行在耦合到处理器的存储器上存储的和/或由该存储器提供的指令))实施本发明。在本说明书中,这些实施或者本发明可以采用的任何其他形式可以称为技术。一般而言,可以在本发明的范围内变更公开的过程的步骤顺序。除非另有明示,描述为被配置成执行任务的部件(诸如处理器或者存储器)可以实施为被临时配置成在给定时间执行该任务的一般部件或者被制造成执行该任务的具体部件。
下文与图示本发明原理的附图一起提供对本发明一个或者多个实施例的详细描述。结合这样的实施例描述本发明,但是本发明不限于任何实施例。本发明的范围仅由权利要求书限定,并且本发明涵盖诸多替代、修改和等同物。在下文描述中阐述诸多具体细节以便提供对本发明的透彻理解。出于示例的目的而提供这些细节,并且无这些具体细节中的一些或者所有细节也可以根据权利要求书实现本发明。
本发明的目的在于提供一种嵌入式应用程序的执行方法。片内FLASH程序的引导启动流程一般为,程序需要系统独立地运行时,要求将应用程序固化到非易失性存储器FLASH中,系统每次上电复位后,便开始FLASH程序引导流程,经过引导,最终跳转到应用程序入口地址处。
BootLoader是位于BootROM中的用于系统引导的程序,可完成芯片复位后的自动引导功能。系统复位后,PC指针跳转到指定地址处并获得复位向量,该向量在芯片出厂前已固化好,将程序流的执行重新定位到引导初始化函数,从而开始引导过程。
引导初始化函数主要把器件初始化成C28X工作模式,然后读取安全代码模块的密码,完成对FLASH、RAM等片内存储器的解锁操作;接着Bootloader将调用引导模式选择函数,检测相应GPIO引脚的电平状态,判断为FLASH引导模式。引导结束后PC指针将跳转至FLASH中起始地址单元处,并执行其中的代码,用户需要在该地址存放一条指令。由于安全代码模块密码从起始地址开始,所以只有2个字的空间可用于存放跳转指令,而一个长跳转指令(在汇编代码中为LB)刚好占用2个字的地址空间。
一般情况下,执行跳转指令将会跳转到执行程序的C环境初始化函数int00,只有当int00运行后,才开始执行主函数。其中,int00是C程序的入口点,主要实现全局和静态变量的初始化,即将.cinit段(存放用来对变量初始化的常数)复制到片内RAM中的.ebss段(为变量分配地址空间)来实现的。当用户程序中包含大量的已初始化全局和静态变量时,在程序初始化函数执行结束并调用主函数前,WDT计时器计数器可能溢出。在程序调试阶段,由于将.cinit段链接到RAM中,上述拷贝操作相当于是从RAM到RAM,速度是比较快的,这个问题一般不会出现。但在系统应用阶段,用户代码需要固化到FLASH存储器中,.cinit段链接至片内FLASH,而从FLASH中复制数据需要占用多个时钟周期,速度较慢,WDT计时器可能会溢出,导致复位。所以本发明在运行程序初始化函数之前先禁用WDT计时器,然后执行至主函数时,根据需要使能或继续禁用WDT计时器的状态。
本发明通过向工程源文件中添加拷贝程序,引导结束后对其执行,由于程序复制阶段,WDT计时器不能使能。因此,从FLASH引导之后,经过禁用WDT计时器操作后,“拷贝程序”才可被执行,FLASH空间的代码会被拷贝到RAM中。最后,PC指针指向RAM中存放代码的首地址处开始执行主程序,从而程序就在RAM中运行起来。应用程序调试成功后,将程序固化在FLASH,上电后自动将FLASH中程序拷贝到RAM,并在RAM中运行。
图1是根据本发明实施例的应用程序执行方法流程图。如图1所示,实施本发明的具体步骤如下:
步骤一:应用程序编译生成段空间形式的文件,该文件包括赋值段和未赋值段,其中赋值段用于提供有效参数,未赋值段用于预留程序运行时所需的变量地址空间。
应用程序经过编译、链接后生成通用对象文件。该文件以段的形式组织代码和数据,可分为赋值段和未赋值段。在嵌入式系统上电时,赋值段含有真实有效的参数,例如指令代码和常量。未赋值段用于保留程序运行过程中所需开辟的变量的地址空间,在上电调用初始化库前,未赋值段并没有真实的内容。
当彻底脱离仿真环境运行程序时,所有的赋值段必须链接到非易失性存储器中,通常是片上FLASH。未赋值段不需要初始化值,如变量,在程序运行的时候,代码会频繁地对其进行读写和实时修改。因此,未赋值段必须链接到RAM中。同样,用户创建的赋值段必须存放到FLASH;未赋值段必须存放在RAM中。
在一个实施例中,赋值段包括.text、.cinit、.pinit、.switch、
.const、.econst段。而.text、.cinit、.pinit、.switch段为程序空间,.const、.econst段为数据空间。.bss、.ebss、.stack、.system、.esystem为未赋值段,这些未赋值段均为数据空间。
步骤二:在运行程序初始化函数之前,禁用WDT计时器,并利用拷贝函数,用于各个变量段从FLASH拷贝到RAM。
仍以TMS320C6455为例,C编译器允许对其独立编写C及汇编程序,并分开编译或汇编成各自的目标代码段,然后用链接器将其链接起来生成可执行文件。在工程中,汇编源代码用简单的汇编或伪指令编写,用于定位段、指针跳转等。为了能实现上述启动功能,最简单的方法是使用汇编代码。
上电后,程序起始标号的长跳转指令被加载到入口地址处并开始执行,接着指针跳转到WDT计时器禁用代码,之后再执行拷贝函数,将所有段复制到RAM中。将跳转指令及WDT计时器禁用代码部分分别置于相应的段下,并组合成汇编文件,添加到工程文件的source路径下。
拷贝函数可将代码段及各个变量段从FLASH拷贝到RAM,以实现程序的整体拷贝。
以赋值段text为例来详述设计过程。程序在复制时可通过链接命令文件中指明的信息调用段的起始地址、长度以及运行地址。该例程中,将text段的大小先暂存到寄存器XAR5,再存储到累加器ACC中;加载地址存储到XAR6寄存器中;运行地址存储到XAR7寄存器中,再执行copy操作即可完成text段的拷贝。
同时应将拷贝函数链接到代码拷贝段中,其他的赋值段“.cinit、const、econst、pinit、switch”也按照类似的方法去实现,一旦所有的段都被复制完毕,可通过一个指令跳转到程序初始化函数。
完成上面流程后,C编译环境被设置好后便可直接进入主函数去执行。
步骤三:编写链接命令文件,在RAM中分配空间,将应用程序段拷贝到RAM中。
将链接命令文件分为两部分。第一部分用于指明和定义装载代码所用到的所有存储区域,即程序空间和数据空间,以便链接器进行配置;第二部分主要是将每一个输出段映射到所分配的存储空间里面去,并指定段的加载地址和运行地址。
3.1考虑到赋值段加载在FLASH中而运行在片上RAM中,因此对这些段的加载和运行必须分配到不同的存储空间。以初始化程序代码段“.text”为例,在链接命令文件第二部分中按照如下步骤,便可实现段的拷贝:
将.text段装载至程序空间的FLASH_AB;
将.text运行于程序空间的RAM;
确定.text段拷贝的起始地址、运行地址和长度。
同理,其他赋值段也可按照相似的方法去配置,来指明段的加载和运行信息。
3.2未赋值段的加载和运行均在片上RAM中,所以对这些段的加载和运行只需分配到RAM空间即可。以未赋值段“.bss”为例,在链接命令文件第二部分中按照如下命令配置即可。
.bss:>RAM_L3PAGE=1
3.3在用户代码从FLASH拷贝到片内RAM之前,WDT计时器禁用段必须加载和运行于FLASH中。
优选地,如果应用程序代码较大,而RAM空间有限,使得用户代码无法完全加载至片内RAM中,通常可将那些需要频繁调用、实时性要求高的代码拷贝到片内RAM中运行,或者外部扩展高速的片外RAM。
综上所述,本发明将整个嵌入式系统的应用程序都拷贝到RAM中执行,保证了程序运行的实时性,适用于交通视频监控等高可用需求的应用领域。
显然,本领域的技术人员应该理解,上述的本发明的各模块或各步骤可以用通用的计算系统来实现,它们可以集中在单个的计算系统上,或者分布在多个计算系统所组成的网络上,可选地,它们可以用计算系统可执行的程序代码来实现,从而,可以将它们存储在存储系统中由计算系统来执行。这样,本发明不限制于任何特定的硬件和软件结合。
应当理解的是,本发明的上述具体实施方式仅仅用于示例性说明或解释本发明的原理,而不构成对本发明的限制。因此,在不偏离本发明的精神和范围的情况下所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。此外,本发明所附权利要求旨在涵盖落入所附权利要求范围和边界、或者这种范围和边界的等同形式内的全部变化和修改例。