主题:controlSUITE中讨论的其他部件
工具/软件:TI C/C++编译器
您好,
我不知道链接程序生成的代码的长度,即进入闪存的所有部分的长度如何能够被“编译”(即由链接程序计算)到生成的代码中。 我尝试了几种方法:
方法1:
链接程序命令文件:
内存{
...
FLASHE00 :原点= 0x8.8万,
长度= FIRMHEAD_SECTSIZE /*固件标题 */
FLASHE2J :原点= 0x8.8万 + FIRMHEAD_SECTIZE,
长度= 0x3万 - FIRMHEAD_SECTSZE /* firmware */
}
章节
{
/*片上闪存扇区中的固件部分*/
firmware_header:load_size (_firmhead_size),fill = 0xFFFF
{
_firmware_start =.;
firmware_header(.firmware_header)
}
> FLASHE00 页面= 0,对齐(4)
/*将所有其他Flash部分组合在一起*/
固件组load_size (_firmware_size){
codegstart ://page =0,对齐(4)
.text ://page = 0,align(4)
ramfuncs :// load = FLASHE2J,
RUN = RAMLS0 | RAMLS1 | RAMLS2 |RAMLS3,
load_start(_RamfuncsLoadStart),
load_size (_RamfuncsLoadSize),
load_end (_RamfuncsLoadEnd),
run_start(_RamfuncsRunStart),
Run_Size (_RamfuncsRunSize),
Run_End(_RamfuncsRunEnd)(运行结束(_RamfuncsRunEnd))
//page = 0,对齐(4)
/*初始化的部分进入flash */
.cinit ://page = 0,对齐(4)
.Pinit ://page = 0,对齐(4)
econst ://page =0,align(4)
.switch ://page = 0,align(4)
/*片上闪存中的固件部分结束*/
firmware_end :{
_firmware_end =;
}
}> FLASHE2J page =0,align(4),
}
C文件:
/*将firmware_header放在.firmware_header */部分
#pragma data_section (firmware_header,".firmware_header")
由链接程序命令文件*/定义的/*符号
extern UINT32_t firmware_start,firmware_size;
外部 UINT32_t firmware_end;
struct firmware_header firmware_header ={
(UINT32_t)&firmware_size + FIRMHEAD_SECTIZE,
...
};
这会成功编译和链接(使用正确的长度编译),但会发出警告
警告#1.0082万-D:放置被忽略
对于"ramfuncs": 对象作为"Group_1"的一部分放置
将生成RAMfuns RUN部分并将其置于FLASH (错误!)。
方法2:
在命令文件中没有Group,我试图将.firmware_end部分放在所有内容的末尾(见上文),并使用符号的差异作为长度。
这会导致编译错误
//(UINT32_t)(&firmware_end -&firmware_start),//错误#28:表达式必须具有常量值
并且不确定是否确实将.firmware_end放在了末尾,因为(SPRU513L):
8.5 .........................5 sections指令
(请注意,内存放置顺序不仅仅是顺序
sections出现在sections指令中。)
其他试验会产生其他错误:
//(UINT32_t)&firmware_size + FIRMHEAD_SECTIZE)* 2,//错误#28:表达式必须具有常量值
//(UINT32_t)(&firmware_size +&firmhead_size),//错误#31:表达式必须具有积分类型
任何提示
如何获得编译的长度(多个部分长度的总和)?
-如何控制各部分的顺序(.firmhead作为第一个,.firmware_end作为最后一个)? (高不是解决方案。)
谢谢!
弗兰克