二、程序整体拷贝到RAM中执行
有些时候程序的执行对于速度要求很高,此时就需要将程序整体拷贝到RAM中去执行。程序整体拷贝同样需要进行特殊修改和设置。要想详细了解下面设置的原理,可以查找相关资料来详细了解程序启动的过程。
1、程序启动的过程一般为:
code_start->wd_disable->c_int00->mian()
为了完成程序的拷贝,需要在C语言初始化之前插入一个程序拷贝的环节,修改之后的流程为:
code_start->wd_disable->copy_sections->c_int00->mian()
为此在DSP2833x_CodeStartBranch.asm中将所有的c_int00替换为copy_sections。
2、在DSP2833x_CodeStartBranch.asm中将该文件中的wd_disable前的 .text改为 .sect "wddisable",从而将该段程序归入到段wddisable中,并在F28335.cmd文件中定义该段:
wddisable : > FLASHA, PAGE = 0
之所以这么定义,是因为.text段是需要拷贝到RAM执行的,而在程序拷贝之前首先需要关闭看门狗,从而避免出现错误。如果仍然将程序放在.text段中,则看门狗禁止程序无法执行,会出现错误,因此在FLASH中定义一个新的段,从而让看门狗关闭的程序在FLASH中提前执行,
3、在工程中添加DSP28xxx_SectionCopy_nonBIOS.asm文件,该文件提供对各个段进行拷贝的程序,十分重要。这部分代码不需要修改,直接使用就行。
4、将文件DSP2833x_usDelay.asm中的.sect "ramfuncs"改为 .text。从而将该段代码归入到.text段中,随段拷贝到RAM中执行。
5、删除F28335_sysctrlinit.c文件中的代码:
#pragma CODE_SECTION(InitFlash, "ramfuncs");
从而将InitFlash代码归到.text段中。
6、在F28335.cmd文件中定义相应的段,代码如下。定义codestart、wddisable、copysections 三段在FLASH中执行,定义初始化段的各段的下载区间LOAD、执行区间RUN(前两者存储区间自己选择)、下载开始地址、执行开始地址、段大小(后三者名字不可改变)。注意下面代码、格式以及标点符号必须严格不错。
codestart : > BEGIN PAGE = 0
wddisable : > FLASHA, PAGE = 0
copysections : > FLASHA, PAGE = 0
.cinit : LOAD = FLASHD, PAGE = 0
RUN = RAML123, PAGE = 0
LOAD_START(_cinit_loadstart),
RUN_START(_cinit_runstart),
SIZE(_cinit_size)
.pinit : LOAD = FLASHD, PAGE = 0
RUN = RAML123, PAGE = 0
LOAD_START(_pinit_loadstart),
RUN_START(_pinit_runstart),
SIZE(_pinit_size)
.text : LOAD = FLASHD, PAGE = 0
RUN = RAML123, PAGE = 0
LOAD_START(_text_loadstart),
RUN_START(_text_runstart),
SIZE(_text_size)
.const : LOAD = FLASHD, PAGE = 0
RUN = RAML123, PAGE = 0
LOAD_START(_const_loadstart),
RUN_START(_const_runstart),
SIZE(_const_size)
.econst : LOAD = FLASHD, PAGE = 0
RUN = RAML123, PAGE = 0
LOAD_START(_econst_loadstart),
RUN_START(_econst_runstart),
SIZE(_econst_size)
.switch : LOAD = FLASHD, PAGE = 0
RUN = RAML123, PAGE = 0
LOAD_START(_switch_loadstart),
RUN_START(_switch_runstart),
SIZE(_switch_size)
7、最后需要将拨码开关调到1111的地方,然后编译烧写即可。
|