TMS320F28002x——代码放在ram中运行详解
应用简介
从RAM执行代码比从FLASH执行代码要快。但是C2000 MCU在从FLASH执行时支持代码预期和数据缓存,从而最大限度地减少开销。需要注意的是,代码预期和数据缓存在上电时都会被禁用。应用软件必须启用代码预期并适当地配置等待状态,还需要启用数据缓存。详细方式可以查看C2000 Ware中的InitFlash()函数。
下表列出了FLASH和RAM执行相同循环代码的周期数。
说明 |
F28004x上的周期数 |
未启用代码预取的FLASH |
72006 |
启用代码预取的FLASH |
59996 |
RAM |
54002 |
执行循环的周期数 |
54000 |
从上表中的数据可以看出,将时间关键代码从FLASH的加载地址复制到RAM中执行能够有效提升代码的运行速率。
在RAM中运行与FLASH中运行指的是什么?
程序编译完之后生成的.bin文件,包含代码段,代码段中全部是汇编指令,而汇编指令中包含多个函数,各函数的地址不同,如存在A函数和B函数,假设RAM地址区间是0x0000-0x8000,FLASH的地址区间是0xA000-0xF000,A函数要调用B函数,则A函数调用B函数的那段汇编指令中包含的是B函数的存储地址,A函数和B函数都在FLASH中存储。
情况一:B函数是配置为在RAM中运行,则B函数的代码段会通过一定手段(通过其他函数去完成)被copy到RAM区域中,所以A函数调用B函数时,A函数的跳转指令中包含的地址数据可能是0x1000。
情况二:B函数是配置为在FLASH中运行,所以A函数调用B函数时,A函数的跳转指令中包含的地址数据可能是0xB000.
综上,在代码不更改的情况下,将某函数或整个程序配置为在RAM运行和配置为在FLASH运行这两种情况下,编译结束之后得到的.bin文件代码段是不同的。
下图为280025的RAM区和FLASH地址段:
芯片的启动执行地址
从FLASH启动代码时,芯片复位后,会从0x080000地址开始执行。
.cmd文件分析
MEMORY部分,分别定义RAM和FLASH的地址和大小,并做了不同的分区,格式如:
NAME : origin = 0xxxxx, length = 0xxx。
SECTIONS部分,用来定义编译生成的代码的存放和运行地址。若需要将代码存放和运行地址分开,需要按一下方式进行设置:
在相应的文件中声明外部变量
在.cmd文件中定义了六个变量,分别指示代码存放的起始地址,结束地址以及大小,代码运行的起始地址,结束地址及大小。在程序调用时,需要通过这几个外部变量对FLASH的内容拷贝到RAM中进行处理。
6 声明在RAM中运行的函数
在对应的.c文件中定义映射到.TI.ramfunc的函数,代码函数会在RAM中运行,其函数的函数头的地址将会是RAM段的地址:
#pragma CODE_SECTION(GPIO_Test, ".TI.ramfunc");
7 代码迁移到RAM中
在调用指定的函数之前,需要将存放在FLASH中的函数代码复制到RAM中,通常在main函数的开始就执行此步骤:
8 编译代码
重新编译代码,我们在map文件中查看对应函数的运行地址: