TI C2000 , .cmd文件,.TI.ramfunc,将程序分配为在RAM中运行/Flash运行的配置方法和原理讲解,(如28375S ,280049,28335等等芯片)

1 基础知识讲解

1.1 在RAM中运行还是在flash中运行指的是什么?

1.1.1 背景:程序编译完之后生成的.bin文件,.bin文件中包含代码段,代码段中全是汇编指令,而汇编指令中包含多个函数,各函数头的地址不同,如存在A函数和B函数,假设RAM地址区间是0x0000-0x8000,flash的地址区间是0xA000-0xF000,A函数要调用B函数,则A函数调用B函数的那段汇编指令中包含的是B函数头的存储地址,A函数和B函数都在flash中有存储
1.1.2 情况1:B函数是配置为在RAM中运行,则B函数的代码段会通过一定手段(通过其他函数去完成)被copy到RAM区域中,故A函数调用B函数时,A函数的跳转指令中包含的地址数据可能是0x1000。
1.1.3 情况2:B函数是配置为在flash中运行,故A函数调用B函数时,A函数的跳转指令中包含的地址数据可能是0xB000。
1.1.4 结论:在代码不更改的情况下,将某函数或整个程序配置为在RAM运行和配置为在flash中运行这两种情况下,编译结束之后得到的.bin文件代码段是不同的。

1.2 28375S的RAM区和flash地址段

1.2.1 芯片手册截图
在这里插入图片描述
在这里插入图片描述

1.3 在芯片flash中,我们可以存储两份或多份程序代码的.bin文件,我们这可以假设在芯片中存储两个程序P1和P2,芯片复位后,首先运行P1,可由P1跳转到P2,再运行P2

1.3.1 从flash启动代码时,芯片复位后,会从0x80000地址开始执行
在这里插入图片描述

2 配置1:对于P2程序,绝大部分函数分配到flash(起始地址0x84000)中运行,小部分函数分配到RAM(起始地址0x2000)中运行

2.1 在.cmd文件中的PAGE0中定义:

BEGIN: origin = 0x80000 , length = 0x10
FLASH_Code  : origin = 0x84000 + 0x10, length = 0xE000
RAMLS_Fun :	origin = 0x2000, length = 0x1000

2.2 在.cmd文件中的SECTION中定义:

.TI.ramfunc : {} LOAD = FLASH_Code,
                     RUN = RAMLS_Fun,
                     LOAD_START(_RamfuncsLoadStart),
                     LOAD_SIZE(_RamfuncsLoadSize),
                     LOAD_END(_RamfuncsLoadEnd),
                     RUN_START(_RamfuncsRunStart),
                     RUN_SIZE(_RamfuncsRunSize),
                     RUN_END(_RamfuncsRunEnd),
                     PAGE = 0, ALIGN(4)

2.3 在xxx.h中声明外部变量

extern Uint16 RamfuncsLoadStart;
extern Uint16 RamfuncsLoadEnd;
extern Uint16 RamfuncsLoadSize;
extern Uint16 RamfuncsRunStart;
extern Uint16 RamfuncsRunEnd;
extern Uint16 RamfuncsRunSize;

2.4 在xxx.c文件中定义映射到.TI.ramfunc的函数A,代表A函数会在RAM中运行,其函数的函数头的地址将会是RAM段的地址:

#pragma CODE_SECTION(".TI.ramfunc");
void A(void)
{

}

2.5 在调用A函数前,将存放在flash中的A函数的代码搬迁到RAM中,通常在main函数中的最开始就进行此步骤

memcpy(&RamfuncsRunStart,&RamfuncsLoadStart,(size_t)&RamfuncsLoadSize);

2.6 步骤之后,就可以调用A函数了,A函数将会在RAM中运行

void B(void)
{
	A();
}

3 配置2:所有函数都分配到RAM (起始地址0x5000)中运行

3.1 在.cmd文件中的PAGE0中定义:

BEGIN: origin = 0x80000 , length = 0x10
FLASH_Code  : origin = 0x5000 + 0x10, length = 0xE000

3.2 在.cmd文件中的SECTION中定义:

.TI.ramfunc         :  > FLASH_Code       PAGE = 0, ALIGN(4)

3.3 注意:通过1.1和1.2的配置之后,编译生成的.hex文件中的地址信息都是以0x5000为基地址进行的标识
解决方法:在编译过程的后处理中添加后处理程序,后处理程序负责将.hex文件的地址信息修改为以0x84000为基地址的XDS.hex文件,然后通过仿真器将XDS.hex文件烧写到falsh中。
3.4 在一级程序P1中将P2程序的.bin数据全部拷贝到RAM区域,然后再跳转到P2程序中

MemCpy((u08*)0x5000, (u08*)0x84000,0xE000);
((void (*) (void))0x84000)(); 
  • 4
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
"c:/ti/ccs" 是指 Texas Instruments 公司开发的一款集成开发环境,用于嵌入式系统的软件开发。 在这个环境下,使用的编译器是 C2000 Compiler。 "f2837xs_common/source/f2837xs_piectrl.c" 是一个路径或者文件名,指向一个名为 "f2837xs_piectrl.c" 的源代码文件。从前缀 "f2837xs_common/source/" 可以推测出这是一个针对 f2837xs 系列微控制器的代码文件。 根据文件名称,可以猜测 "f2837xs_piectrl.c" 是一个与 PI(Proportional-Integral)控制相关的代码文件。在许多工控领域和机器人控制,PI控制是一种经典的反馈控制算法。它结合了比例控制和积分控制,以实现对系统的精确控制。 在这个文件,很可能会有 PI 控制器的初始化和算法实现。这些代码可能会包括计算控制输出值的公式、设置控制参数、读取传感器反馈值等。通过这些代码,可以实现对某个设备或系统的精确控制,以达到所需的目标或状态。 由于代码文件的路径和使用的编译器都已经给出,我们可以使用 "c:/ti/ccs" C2000 Compiler 来编译这个源代码文件,生成可执行的目标代码或者可以烧录到芯片上的固件文件。编译器将会根据语法规则和编译选项对源代码进行处理,检查潜在的错误,并生成可执行代码。 总之,通过使用 "c:/ti/ccs" C2000 Compiler 编译 "f2837xs_common/source/f2837xs_piectrl.c",我们可以得到一个实现 PI 控制算法的代码文件,并用于嵌入式系统的开发和控制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值