主题中讨论的其他器件:C2000WARE
您好!
我正在创建一个我正在尝试下载到目标器件(F28379D)的应用程序。 这是在我的计算机上使用 c2000 serial_flash_programmer 完成的。 在目标端、我使用的是 C2000 SCI 闪存编程器(但在闪存中)。
我的应用程序的开始向量位于(0x098000、length=2)、其余代码位于 FLASHG 和 FLASHH。 这样可以为次级引导加载程序(FLASHA-FLASHF)腾出空间。
我正在使用具有推荐参数的 C2000 Hex Utility 工具(--boot --sci8 --ascii)。 当我下载固件文件时、我收到一个错误。 之所以出错、是因为目标地址超出范围。 如果我更改为 Intel 十六进制格式、这样更容易查看:
:02000004 0001 F9
:20 A000 0000009049B0C92C163048747B059680AF36C82EE173FA86098316B622A22FCF3B26
由于某种原因、地址0x01A000中大约有1、3kB 代码。 在链接器文件中、地址与此行相关:
RAMGS14:origin = 0x01A000、length = 0x001000
RAMGS15:origin = 0x01B000、length = 0x000FF8
这是一个 RAM 扇区。 为什么即使在我的固件输出文件中也是这样? 我无法看到它在代码中的任何位置被使用。 如果我在链接器文件中注释 RAMGS14行、我得到:
:02000004 0001 F9
:20 B000 0000009049B0C92C163048747B059680AF36C82EE173FA86098316B622A22FCF3B16
这来自 RAMGS15扇区。 如果我注释该行、我会得到:
:02000004 0008 F2
:20 0000 0000009049B0C92C163048747B059680AF36C82EE173FA86098316B622A22FCF3BC6
来自以下行:
FLASHA : origin = 0x080000, length = 0x002000
...这不是用在我的代码..
最后、如果我在链接器文件中注释 FALSHA 行、我将得到预期的输出-固件代码从 FLASHG 开始到 FLASHH。
我的问题是:为什么会获得这些额外的代码部分?
链接器文件如下所示:
内存
{
第0页:/*程序存储器*/
/*存储器(RAM/FLASH)块可移动到页1进行数据分配*/
/*开始用于"引导至闪存"引导加载程序模式*/
BEGIN:origin = 0x098000、length = 0x000002 // MAG:was 0x080000、0x000002 origin = 0x098000、length = 0x000002
//RAM_RES_BOOT_ROM:origin = 0x000002、length = 0x000121 //保留
RAMM0:origin = 0x000123、length = 0x0002DD
//RAM_RES_TI_RTOS:origin = 0x000780、length = 0x000080 //保留
RAMD0:origin = 0x00B000、length = 0x000800
RAMLS0:origin = 0x008000、length = 0x000800
RAMLS1:origin = 0x008800、length = 0x000800
RAMLS2:origin = 0x009000、length = 0x000800
RAMLS3:origin = 0x009800、length = 0x000800
RAMLS4:origin = 0x00A000、length = 0x000800
RAMGS14:origin = 0x01A000、length = 0x001000
RAMGS15:origin = 0x01B000、length = 0x000FF8
// RAMGS15_RSVD:origin = 0x01BFF8,length = 0x000008 //根据勘误建议"存储器:预取超出有效存储器",保留代码,且不使用此代码
复位:origin = 0x3FFFC0、length = 0x000002
/*闪存扇区*/
//FLASH_TI_OTP:origin = 0x070000、length = 0x000400 //数据表中列出
//DCSM_OTP:origin = 0x078000、length= 0x000400 //在数据表中列出(用户可配置)
FLASHA:origin = 0x080000、length = 0x002000 /*片上闪存*// MAG:was 0x080002、length = 0x001FFE
// FLASHB:origin = 0x082000,length = 0x002000 /*片上闪存*/保留用于引导加载程序
// FLASHC:origin = 0x084000, length = 0x002000 /*片上闪存*/保留...
// FLASHD : origin = 0x086000, length = 0x002000 /*片上 Flash */保留...
// FLASHE : origin = 0x088000, length = 0x008000 /*片上 Flash */ Reserved ...
// FLASHF : origin = 0x090000, length = 0x008000 /*片上 Flash */ Reserved ...
FLASHG:origin = 0x098002、length = 0x007FFE /*片上闪存*// MAG:原为0x098000、0x008000、但由于 codestart 而更改
FLASHH:origin = 0x0A0000、length = 0x008000 /*片上闪存*/
// FLASHI : origin = 0x0A8000,length = 0x008000 /*片上闪存*/保留用于上传新应用程序
// FLASHJ:origin = 0x0B0000,length = 0x008000 /*片上闪存*/保留...
FLASHK : origin = 0x0B8000,length = 0x002000 /*片上闪存*/
FLASHL:origin = 0x0BA000、length = 0x002000 /*片上闪存*/
FLASHM:origin = 0x0BC000,length = 0x002000 /*片上闪存*/
FLASHN:origin = 0x0BE000、length = 0x001FF0 /*片上闪存*/
// secure_rom:origin = 0x3F0000,length = 0x008000 //数据表中列出
// boot_ROM:origin = 0x3F8000,length = 0x007FC0 //数据表中列出
// vectors : origin = 0x3FFFC0, length = 0x000040 //数据表中列出
// FLASHN_RSVD:origin = 0x0BFFF0、length = 0x000010 //根据勘误建议"存储器:预取超出有效存储器"保留代码,且不用于此代码*/
第1页:/*数据存储器*/
/*存储器(RAM/FLASH)块可移动到 PAGE0进行程序分配*/
BOOT_RSVD:origin = 0x000002、length = 0x000121 // M0的一部分、引导 ROM 将此用于堆栈
RAMM1:origin = 0x000400、length = 0x0003F8 //片上 RAM 块 M1
// RAMM1_RSVD:origin = 0x0007F8,length = 0x000008 //根据勘误建议"存储器:在有效存储器之外进行预取",保留和不使用代码
RAMD1:origin = 0x00B800,length = 0x000800
RAMLS5 : origin = 0x00A800 , length = 0x000800
RAMGS0:origin = 0x00C000、length = 0x001000
RAMGS1:origin = 0x00D000、length = 0x001000
RAMGS2:origin = 0x00E000、length = 0x001000
RAMGS3:origin = 0x00F000、length = 0x001000
RAMGS4:origin = 0x010000、length = 0x001000
RAMGS5:origin = 0x011000;length = 0x001000
RAMGS6:origin = 0x012000、length = 0x001000
RAMGS7:origin = 0x013000、length = 0x001000
RAMGS8:origin = 0x014000、length = 0x001000
RAMGS9:origin = 0x015000、length = 0x001000
RAMGS10:origin = 0x016000、length = 0x001000
// RAMGS11:origin = 0x017000,length = 0x000FF8 //取消 F28374D、F28376D 器件的注释
// RAMGS11_RSVD:origin = 0x017FF8,length = 0x000008 //根据勘误建议"存储器:预取超出有效存储器",保留代码,且不使用此代码
RAMGS11:origin = 0x017000、length = 0x001000
RAMGS12:origin = 0x018000,length = 0x001000
RAMGS13:origin = 0x019000、length = 0x001000
CPU2TOCPU1RAM:origin = 0x03F800、length = 0x000400
CPU1TOCPU2RAM:origin = 0x03FC00、length = 0x000400
}
部分
{
/*分配计划领域:*/
.cinit :> FLASHG | FLASHH PAGE = 0、ALIGN (8)
.text:>> FLASHG | FLASHH page = 0、align (8)
codestart :> begin page = 0, align (8)
/*分配未初始化的数据段:*/
.stack:> RAMM1页= 1
.switch:> FLASHG PAGE = 0、ALIGN (8)
.reset:>RESET、PAGE = 0、TYPE = DSECT // DSECT =未使用
#if defined (__TI_EABI__)//基于 ELF 的 ABI
init_array:> FLASHG、page = 0、align (8)
.bss :>> RAMGS2 | RAMGS3 | RAMGS4 | RAMGS5 | RAMGS6 | RAMGS7 | RAMGS8 | RAMGS9 | RAMGS10 | RAMGS11 | RAMGS12 | RAMGS13,页面= 1
.bss:output:> RAMLS3、page = 0
.bss:CIO:> RAMLS5,page = 1
.data :>> RAMLS5 | RAMGS0 | RAMGS1 ,页面= 1
.sysmem :> RAMLS5 | RAMGS0,页面= 1
/*初始化段进入闪存*/
.const:> FLASHH、PAGE = 0、ALIGN (8)
#else
.pinit:> FLASHG、page = 0、align (8)
.ebss :>> RAMLS5 | RAMGS0 | RAMGS1 , page = 1
.esysmem :> RAMLS5 ,页面= 1
.cio:> RAMLS5、page = 1
/*初始化段进入闪存*/
econst:>> FLASHH PAGE = 0、ALIGN (8)
#endif
Modbus:>> RAMGS13,页面= 1
Filter_Regs:52 > RAMGS0,页面= 1
SHARERAMGS0:> RAMGS0、PAGE = 1
SHARERAMGS1 :> RAMGS1 ,页面= 1
SHARERAMGS2 :> RAMGS2, page = 1
ramgs0:> RAMGS0,页面= 1
ramgs1:> RAMGS1、page = 1
#ifdef __TI_Compiler_version__
#if __TI_Compiler_version__>= 15009000
#if defined (__TI_EABI __)
.TI.ramfunc:{}load = FLASHG、
RUN = RAMLS0、
Load_start (RamfuncsLoadStart)、
Load_Size (RamfuncsLoadSize)、
Load_End (RamfuncsLoadEnd)、
RUN_START (RamfuncsRunStart)、
RUN_SIZE (RamfuncsRunSize)、
RUN_END (RamfuncsRunEnd)、
PAGE = 0、ALIGN (8)
#else
.TI.ramfunc:{}load = FLASHG、
RUN = RAMLS0、
Load_start (_RamfuncsLoadStart)、
Load_Size (_RamfuncsLoadSize)、
Load_End (_RamfuncsLoadEnd)、
RUN_START (_RamfuncsRunStart)、
RUN_SIZE (_RamfuncsRunSize)、
RUN_END (_RamfuncsRunEnd)、
PAGE = 0、ALIGN (8)
#endif
#else
ramfuncs:load = FLASHG,
RUN = RAMLS0、
Load_start (_RamfuncsLoadStart)、
Load_Size (_RamfuncsLoadSize)、
Load_End (_RamfuncsLoadEnd)、
RUN_START (_RamfuncsRunStart)、
RUN_SIZE (_RamfuncsRunSize)、
RUN_END (_RamfuncsRunEnd)、
PAGE = 0、ALIGN (8)
#endif
#endif
/*使用 IPC API 驱动程序时需要以下部分的定义*/
组:> CPU1TOCPU2RAM , page = 1
{
PUTBUFFER
PUTWRITEIDX
GET READIDX
}
组:> CPU2TOCPU1RAM , page = 1
{
GETBUFFER :类型= DSECT
GETWRITEIDX :类型= DSECT
PUTREADIDX :类型= DSECT
}
/*以下段定义适用于 SDFM 示例*/
filter1_RegsFile:> RAMGS1、page = 1、fill=0x1111
Filter2_RegsFile:> RAMGS2、page = 1、fill=0x2222
Filter3_RegsFile:> RAMGS3、page = 1、fill=0x3333
Filter4_RegsFile:> RAMGS4、page = 1、fill=0x4444
Difference_Regs 阵列阵列阵列阵列阵列阵列阵列阵列阵列阵列阵列阵列阵列阵列阵列阵列阵列
}
/*
//========================================
//文件结尾。
//========================================
*/
C2000版本 4_03_00_00
Code Composer Studio 版本:12.2.0.00009