主题中讨论的其他器件:UNIFLASH、 C2000WARE
您好!
将 Core1和 Core 2的 OUT 文件转换为 txt 格式并运行 serial_flash_programr.exe 后
我成功加载 Core 1、但加载 Core 2时失败-我在地址0x090002处获得验证错误、程序未运行。
当我使用 UNIFLASH 加载输出文件时、地址0x090002没有错误和问题、然后运行的程序正常。
请告知我如何解决此问题?
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
您好!
将 Core1和 Core 2的 OUT 文件转换为 txt 格式并运行 serial_flash_programr.exe 后
我成功加载 Core 1、但加载 Core 2时失败-我在地址0x090002处获得验证错误、程序未运行。
当我使用 UNIFLASH 加载输出文件时、地址0x090002没有错误和问题、然后运行的程序正常。
请告知我如何解决此问题?
您好、Zvi、
根据 C2000 MCU 的串行闪存编程 文档、 在使用 CCS 加载2个内核时、是否确保对两个内核使用正确的构建设置? 一个设置为 RAM、另一个设置为闪存? 验证错误表示该位置尚未编程(没有预期的数据)、因此它可能位于另一个位置。
此致、
查尔斯
您好、Charles、
我不使用 CCS 加载、我尝试使用串行闪存引导加载程序加载、当它失败时、我使用 UNIFLASH 刻录内核2的原始输出文件。
两个内核都设置为闪存。 使用 UNIFLASH 刻录后没有问题。
我们使用 Matlab / Simulink 来生成代码、两个内核的配置方式相同。
在引导加载程序失败后、我还使用 UNIFLAH 读取闪存存储器、我可以看到从地址0x090002开始未对8个字节进行编程。
另一方面、当使用 UNIFLASH 刻录文件时、这8个字节不为空。
是否有 hex2000不为引导加载程序生成数据?
此致。
您好、Charles、
我认为现在是时候一起查看链接器命令文件了-因为其中没有任何内容表明我们错误地映射了内存:
#include "MW_F2837xD_MemoryMap.h"
#ifdef CLA_BLOCK_INCLUDED
// Define a size for the CLA scratchpad area that will be used
// by the CLA compiler for local symbols and temps
// Also force references to the special symbols that mark the
// scratchpad are.
CLA_SCRATCHPAD_SIZE = 0x100;
--undef_sym=__cla_scratchpad_end
--undef_sym=__cla_scratchpad_start
#endif //CLA_BLOCK_INCLUDED
MEMORY
{
PAGE 0 :
/* BEGIN is used for the "boot to SARAM" bootloader mode */
BEGIN : origin = 0x000000, length = 0x000002
BEGIN_FLASH : origin = 0x080000, length = 0x000002
#ifdef CLA_BLOCK_INCLUDED
RAMLS_PROG : origin = 0x008000, length = 0x001800
RAMLS_CLA_PROG : origin = 0x00A800, length = 0x000800
#else
#if BOOT_FROM_FLASH
RAMLS_PROG : origin = 0x008000, length = 0x002000
#else
RAMLS_PROG : origin = 0x008000, length = 0x003000
#endif //BOOT_FROM_FLASH
#endif //CLA_BLOCK_INCLUDED
#ifdef CPU1
#if (CPU1_RAMGS_PROG_LENGTH > 0)
RAMGS_PROG : origin = CPU1_RAMGS_PROG_START, length = CPU1_RAMGS_PROG_LENGTH
#endif //(CPU1_RAMGS_PROG_LENGTH > 0)
#else
#if (CPU2_RAMGS_PROG_LENGTH > 0)
RAMGS_PROG : origin = CPU2_RAMGS_PROG_START, length = CPU2_RAMGS_PROG_LENGTH
#endif //(CPU2_RAMGS_PROG_LENGTH > 0)
#endif //CPU1
RESET : origin = 0x3FFFC0, length = 0x000002
/* Flash sectors */
#if defined(F28376D) || defined(F28374D)
FLASHA_N : origin = 0x080002, length = 0x01FFFE /* on-chip Flash */
#else
FLASHA_N : origin = 0x080002, length = 0x03FFFE /* on-chip Flash */
#endif //defined(F28376D) || defined(F28374D)
PAGE 1 :
#ifdef CPU1
BOOT_RSVD : origin = 0x000002, length = 0x000120 /* Part of M0, BOOT rom will use this for stack */
#else
BOOT_RSVD : origin = 0x000002, length = 0x00007E /* Part of M0, BOOT rom will use this for stack */
#endif //CPU1
#ifdef CPU1
RAMM0M1 : origin = 0x000122, length = 0x0006DE
#else
RAMM0M1 : origin = 0x000080, length = 0x000780
#endif //CPU1
RAMD0D1 : origin = 0x00B000, length = 0x001000
#ifdef CLA_BLOCK_INCLUDED
RAMLS_CLA_DATA : origin = 0x009800, length = 0x001000
#else
#if BOOT_FROM_FLASH
RAMLS_DATA : origin = 0x00A000, length = 0x001000
#endif //BOOT_FROM_FLASH
#endif //CLA_BLOCK_INCLUDED
#ifdef CPU1
RAMGS_DATA : origin = CPU1_RAMGS_DATA_START, length = CPU1_RAMGS_DATA_LENGTH
#else
RAMGS_DATA : origin = CPU2_RAMGS_DATA_START, length = CPU2_RAMGS_DATA_LENGTH
#endif //CPU1
RAMGS_IPCBuffCPU1 : origin = RAMGS_IPC_CPU1_START, length = RAMGS_IPC_CPU1_LENGTH
RAMGS_IPCBuffCPU2 : origin = RAMGS_IPC_CPU2_START, length = RAMGS_IPC_CPU2_LENGTH
CLA1_MSGRAMLOW : origin = 0x001480, length = 0x000080
CLA1_MSGRAMHIGH : origin = 0x001500, length = 0x000080
CPU2TOCPU1RAM : origin = 0x03F800, length = 0x000400
CPU1TOCPU2RAM : origin = 0x03FC00, length = 0x000400
#ifdef EMIF1_CS0_INCLUDED
EMIF1_CS0_MEMORY : origin = 0x80000000, length = 0x10000000
#endif //EMIF1_CS0_INCLUDED
#ifdef EMIF1_CS2_INCLUDED
EMIF1_CS2_MEMORY : origin = 0x00100000, length = 0x00200000
#endif //EMIF1_CS2_INCLUDED
#ifdef EMIF1_CS3_INCLUDED
EMIF1_CS3_MEMORY : origin = 0x00300000, length = 0x00080000
#endif //EMIF1_CS3_INCLUDED
#ifdef EMIF1_CS4_INCLUDED
EMIF1_CS4_MEMORY : origin = 0x00380000, length = 0x00060000
#endif //EMIF1_CS4_INCLUDED
#ifdef EMIF2_CS0_INCLUDED
EMIF2_CS0_MEMORY : origin = 0x90000000, length = 0x10000000
#endif //EMIF2_CS0_INCLUDED
#ifdef EMIF2_CS2_INCLUDED
EMIF2_CS2_MEMORY : origin = 0x00002000, length = 0x00001000
#endif //EMIF2_CS2_INCLUDED
}
SECTIONS
{
#if BOOT_FROM_FLASH
/* Allocate program areas: */
.cinit : > FLASHA_N PAGE = 0, ALIGN(8)
.pinit : > FLASHA_N, PAGE = 0, ALIGN(8)
.text : > FLASHA_N PAGE = 0, ALIGN(8)
codestart : > BEGIN_FLASH PAGE = 0, ALIGN(8)
ramfuncs : LOAD = FLASHA_N,
RUN = RAMLS_PROG,
LOAD_START(_RamfuncsLoadStart),
LOAD_SIZE(_RamfuncsLoadSize),
LOAD_END(_RamfuncsLoadEnd),
RUN_START(_RamfuncsRunStart),
RUN_SIZE(_RamfuncsRunSize),
RUN_END(_RamfuncsRunEnd),
PAGE = 0, ALIGN(8)
/* Initalized sections go in Flash */
.econst : > FLASHA_N PAGE = 0, ALIGN(8)
.switch : > FLASHA_N PAGE = 0, ALIGN(8)
/* Allocate IQmath areas: */
IQmath : > FLASHA_N, PAGE = 0, ALIGN(8) /* Math Code */
IQmathTables : > FLASHA_N, PAGE = 0, ALIGN(8)
#ifdef CLA_BLOCK_INCLUDED
/* CLA specific sections */
Cla1Prog : LOAD = FLASHA_N,
RUN = RAMLS_CLA_PROG,
LOAD_START(_Cla1funcsLoadStart),
LOAD_END(_Cla1funcsLoadEnd),
RUN_START(_Cla1funcsRunStart),
LOAD_SIZE(_Cla1funcsLoadSize),
PAGE = 0, ALIGN(8)
.ebss : > RAMGS_DATA , PAGE = 1
#else
.ebss : >> RAMGS_DATA | RAMLS_DATA, PAGE = 1
#endif //CLA_BLOCK_INCLUDED
#else
codestart : > BEGIN, PAGE = 0
ramfuncs : > RAMLS_PROG PAGE = 0
.cinit : > RAMLS_PROG, PAGE = 0
.pinit : > RAMLS_PROG, PAGE = 0
.switch : > RAMLS_PROG, PAGE = 0
.econst : > RAMLS_PROG, PAGE = 0
/* Allocate IQ math areas: */
IQmath : > RAMLS_PROG, PAGE = 0 /* Math Code */
IQmathTables : > RAMLS_PROG, PAGE = 0
#ifdef CLA_BLOCK_INCLUDED
/* CLA specific sections */
Cla1Prog : > RAMLS_CLA_PROG, PAGE=0
.text : >> RAMLS_PROG | RAMGS_PROG, PAGE = 0
#else
.text : > RAMLS_PROG, PAGE = 0
#endif //CLA_BLOCK_INCLUDED
.ebss : > RAMGS_DATA , PAGE = 1
#endif //BOOT_FROM_FLASH
.stack : > RAMM0M1, PAGE = 1
.reset : > RESET, PAGE = 0, TYPE = DSECT /* not used, */
.esysmem : > RAMD0D1, PAGE = 1
.cio : > RAMLS_PROG, PAGE = 0
#if defined(EMIF1_CS0_INCLUDED) && defined(EMIF2_CS0_INCLUDED)
.farbss : > EMIF1_CS0_MEMORY | EMIF2_CS0_MEMORY, PAGE = 1
.farconst : > EMIF1_CS0_MEMORY | EMIF2_CS0_MEMORY, PAGE = 1
#elif !defined(EMIF1_CS0_INCLUDED) && defined(EMIF2_CS0_INCLUDED)
.farbss : > EMIF2_CS0_MEMORY, PAGE = 1
.farconst : > EMIF2_CS0_MEMORY, PAGE = 1
#elif defined(EMIF1_CS0_INCLUDED) && !defined(EMIF2_CS0_INCLUDED)
.farbss : > EMIF1_CS0_MEMORY, PAGE = 1
.farconst : > EMIF1_CS0_MEMORY, PAGE = 1
#else
//No EMIF memory sections
#endif //defined(EMIF1_CS0_INCLUDED) && defined(EMIF2_CS0_INCLUDED)
#ifdef EMIF1_CS0_INCLUDED
Em1Cs0 : > EMIF1_CS0_MEMORY, PAGE = 1
#endif //EMIF1_CS0_INCLUDED
#ifdef EMIF2_CS0_INCLUDED
Em2Cs0 : > EMIF2_CS0_MEMORY, PAGE = 1
#endif //EMIF2_CS0_INCLUDED
#ifdef EMIF1_CS2_INCLUDED
Em1Cs2 : > EMIF1_CS2_MEMORY, PAGE = 1
#endif //EMIF1_CS2_INCLUDED
#ifdef EMIF1_CS3_INCLUDED
Em1Cs3 : > EMIF1_CS3_MEMORY, PAGE = 1
#endif //EMIF1_CS3_INCLUDED
#ifdef EMIF1_CS4_INCLUDED
Em1Cs4 : > EMIF1_CS4_MEMORY, PAGE = 1
#endif //EMIF1_CS4_INCLUDED
#ifdef MW_EMIF2_CS2_INCLUDED
Em2Cs2 : > EMIF2_CS2_MEMORY, PAGE = 1
#endif //MW_EMIF2_CS2_INCLUDED
#ifdef CLA_BLOCK_INCLUDED
/* CLA C compiler sections */
//
// Must be allocated to memory the CLA has write access to
//
Cla1DataRam0 : > RAMLS_CLA_DATA, PAGE=1
Cla1ToCpuMsgRAM : > CLA1_MSGRAMLOW, PAGE = 1
CpuToCla1MsgRAM : > CLA1_MSGRAMHIGH, PAGE = 1
CLAscratch :
{ *.obj(CLAscratch)
. += CLA_SCRATCHPAD_SIZE;
*.obj(CLAscratch_end) } > RAMLS_CLA_DATA, PAGE = 1
.scratchpad : > RAMLS_CLA_DATA, PAGE = 1
.bss_cla : > RAMLS_CLA_DATA, PAGE = 1
.const_cla : LOAD = FLASHA_N,
RUN = RAMLS_CLA_DATA,
RUN_START(_Cla1ConstRunStart),
LOAD_START(_Cla1ConstLoadStart),
LOAD_SIZE(_Cla1ConstLoadSize),
PAGE = 1
#endif //CLA_BLOCK_INCLUDED
#ifdef CPU1
/* The following section definitions are required when using the IPC API Drivers */
GROUP : > CPU1TOCPU2RAM, PAGE = 1
{
PUTBUFFER
PUTWRITEIDX
GETREADIDX
WRITEFLAG1CPU1
WRITEFLAG2CPU1
READFLAG1CPU1
READFLAG2CPU1
}
GROUP : > CPU2TOCPU1RAM, PAGE = 1
{
GETBUFFER : TYPE = DSECT
GETWRITEIDX : TYPE = DSECT
PUTREADIDX : TYPE = DSECT
WRITEFLAG1CPU2: TYPE = DSECT
WRITEFLAG2CPU2: TYPE = DSECT
READFLAG1CPU2: TYPE = DSECT
READFLAG2CPU2: TYPE = DSECT
}
#else
/* The following section definitions are required when using the IPC API Drivers */
GROUP : > CPU2TOCPU1RAM, PAGE = 1
{
PUTBUFFER
PUTWRITEIDX
GETREADIDX
WRITEFLAG1CPU2
WRITEFLAG2CPU2
READFLAG1CPU2
READFLAG2CPU2
}
GROUP : > CPU1TOCPU2RAM, PAGE = 1
{
GETBUFFER : TYPE = DSECT
GETWRITEIDX : TYPE = DSECT
PUTREADIDX : TYPE = DSECT
WRITEFLAG1CPU1: TYPE = DSECT
WRITEFLAG2CPU1: TYPE = DSECT
READFLAG1CPU1 : TYPE = DSECT
READFLAG2CPU1 : TYPE = DSECT
}
#endif //CPU1
GROUP : > RAMGS_IPCBuffCPU1, PAGE = 1
{
CPU1TOCPU2GSRAM
}
GROUP : > RAMGS_IPCBuffCPU2, PAGE = 1
{
CPU2TOCPU1GSRAM
}
}
/*
//===========================================================================
// End of file.
//===========================================================================
*/
#ifndef MW_F2837xD_MemoryMap_h_
#define MW_F2837xD_MemoryMap_h_
/* Below defines are used to allocate global shared memory in linker
* command file and for assign memory region to specific CPU.
* When you need to update global shared memory map, update through
* this file instead of linker command file.
* Copyright 2021 The MathWorks, Inc.*/
#if (BOOT_FROM_FLASH == 0) && defined(CLA_BLOCK_INCLUDED)
#if defined(F28376D) || defined(F28374D)
#define CPU1_RAMGS_PROG_START 0x011000
#define CPU1_RAMGS_PROG_LENGTH 0x002000
#define CPU2_RAMGS_PROG_START 0x016000
#define CPU2_RAMGS_PROG_LENGTH 0x002000
#define CPU1_RAMGS_DATA_START 0x00E000
#define CPU1_RAMGS_DATA_LENGTH 0x003000
#define CPU2_RAMGS_DATA_START 0x013000
#define CPU2_RAMGS_DATA_LENGTH 0x003000
#else
#define CPU1_RAMGS_PROG_START 0x013000
#define CPU1_RAMGS_PROG_LENGTH 0x002000
#define CPU2_RAMGS_PROG_START 0x01A000
#define CPU2_RAMGS_PROG_LENGTH 0x002000
#define CPU1_RAMGS_DATA_START 0x00E000
#define CPU1_RAMGS_DATA_LENGTH 0x005000
#define CPU2_RAMGS_DATA_START 0x015000
#define CPU2_RAMGS_DATA_LENGTH 0x005000
#endif
#else
#define CPU1_RAMGS_PROG_START 0x013000
#define CPU1_RAMGS_PROG_LENGTH 0x000000
#define CPU2_RAMGS_PROG_START 0x01A000
#define CPU2_RAMGS_PROG_LENGTH 0x000000
#if defined(F28376D) || defined(F28374D)
#define CPU1_RAMGS_DATA_START 0x00E000
#define CPU1_RAMGS_DATA_LENGTH 0x005000
#define CPU2_RAMGS_DATA_START 0x013000
#define CPU2_RAMGS_DATA_LENGTH 0x005000
#else
#define CPU1_RAMGS_DATA_START 0x00E000
#define CPU1_RAMGS_DATA_LENGTH 0x007000
#define CPU2_RAMGS_DATA_START 0x015000
#define CPU2_RAMGS_DATA_LENGTH 0x007000
#endif
#endif
#define RAMGS_IPC_CPU1_START 0x0C000
#define RAMGS_IPC_CPU1_LENGTH 0x001000
#define RAMGS_IPC_CPU2_START 0x0D000
#define RAMGS_IPC_CPU2_LENGTH 0x001000
#endif
您好、Zvi、
查看 cmd 文件后、我看到您已将整个闪存扇区 A 至 N 用于闪存、但是正如示例链接器 cmd 文件中的勘误建议所指出的、FLASHN_RSVD 必须受到保护(origin = 0x0BFFF0、length = 0x000010)以避免"内存预取: 超出有效内存"。 是否可以避免为您的应用程序编程此部分、尝试更改使用的部分?
请告诉我这一点。
查尔斯
Zvi、
下面是 TMS320F2837xD 勘误表的链接。 有关预取的建议可在第32页找到、也可在示例文件中找到( 器件 LED 示例中讨论 FLASHN_RSVD 的2837xD_FLASH_lnk_CPU1.cmd)。
谢谢、
查尔斯
您好、Zvi、
查尔斯让我看一下这个帖子。
快速问题:我注意到下面链接器 cmd 文件中的内容。 您能否检查您的映射文件以查看 您报告的地址0x220026分配的内容?
#IF 已定义(EMIF1_CS0_INDED)&&已定义(EMIF2_CS0_INDED)
.farbss:> EMIF1_CS0_MEMORY | EMIF2_CS0_MEMORY,PAGE = 1.
farconst:> EMIF1_CS0_MEMORY | EMIF2_CS0_MEMORY,PAGE = 1.
#elif!defined (EMIF1_CS0_included)& defined (EMIF2_CS0_included)
.farbss:> EMIF2_CS0_MEMORY,PAGE = 1
.farconst:> EMIF2_CS0_MEMORY,PAGE = 1
#elif defed (EMIF1_CS0_INDED)&&!defined (EMIF2_CS0_INDED)
.farbss:> EMIF1_CS0_MEMORY,PAGE = 1
.farconst:> EMIF1_CS0_MEMORY,PAGE = 1
其他
//无 EMIF 内存段
#endif //定义(EMIF1_CS0_included)&&定义(EMIF2_CS0_included)
可能有一些已初始化的内容映射在此处、 因此闪存内核正在尝试对其进行编程(这将失败、因为它不是闪存地址)。
谢谢、此致、
Vamsi