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.

[参考译文] CCS/TMS320F28335:IAP 应用程序中应用程序项目的 cmd 文件修改

Guru**** 2616675 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/684746/ccs-tms320f28335-cmd-file-modification-of-application-project-in-iap-application

器件型号:TMS320F28335

工具/软件:Code Composer Studio

您好、先生、

我之前问过有关矢量表的问题。 网址: e2e.ti.com/.../2509689

矢量表没有问题。 谢谢。

但目前我对 cmd 文件修改有疑问。

当前状态:
次级引导区域:FLASH_H + FLASH_G (0x30 0000H 至0x30 FFFFh)
应用领域:FLASH_F + FLASH_D (0x31 0000H 至0x32 7FFFH)

我的想法和测试步骤是:
1.Flash_A 地址:0x33 FFF6H 存储 secondary 引导的入口点地址,因为它将在上电后运行 secondary 引导。
应用程序不应使用 FLASH_A,否则它将与 secondary 引导冲突。 对吧?

2.进入调试模式以使用应用程序查看入口点的数据,因为大多数修改应该在应用程序项目上:
1) 1)未修改原始 cmd 文件。
进入应用程序的调试模式、查看0x33 FFF6H 的地址、记录该地址的数据、它应该是应用程序的入口点、名为 DATA_1。
2)修改了 cmd 文件、删除了 FLASH_A、将区域 FLASH_F 分配给 FLASH_D
进入应用程序的调试模式,查看0x32 7FFEH 的地址,记录该地址的数据,它应该是应用程序的入口点,名为 data_2。

我认为 data_1和 data_2应该是相同的,对吧?

但是,当执行步骤2时,当前我遇到加载失败,错误消息是:.out 加载失败。
C28xx:闪存编程器:写入闪存时遇到错误。
C28xx:GEL:文件:.\.out 加载失败。

3) 3)我尝试更改起始地址:
开始:origin = 0x327FFE,length = 0x000002
但也失败了:错误#10264:开始内存范围重叠

我的问题是:
如何正确修改我的 cmd 文件?


以下是我当前的应用程序 cmd 文件:
//======================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== //
存储器

第0页:/*程序内存*/
/*内存(RAM/FLASH/OTP)块可移动到第1页进行数据分配*/

ZONE0:origin = 0x004000、      长度= 0x001000 /* XINTF 区域0 */
RAMM0:origin = 0x000050、      长度= 0x0003B0 /*片上 RAM 块 M0 */
/* RAML0:origin = 0x008000、    length = 0x001000*/*片上 RAM 块 L0 */
/* RAML1:origin = 0x009000,    length = 0x001000*/*片上 RAM 块 L1 */
/* RAML2:origin = 0x00A000,    length = 0x001000*/*片上 RAM 块 L2 */
/* RAML3:origin = 0x00B000,    length = 0x001000*/*片上 RAM 块 L3 */
ZONE6:origin = 0x0100000、      长度= 0x100000 /* XINTF 区域6 */
/* ZONE7A:origin = 0x0200000,  length = 0x00FC00*/* XINTF 区域7-程序空间*/
FLASHF_D:origin = 0x310000,  length = 0x018000 //片上闪存*/
// FLASHH:origin = 0x300000,   length = 0x008000 //片上闪存*/
// FLASHG:origin = 0x308000,   length = 0x008000 //片上闪存*/
// FLASHF:origin = 0x310000,   length = 0x008000 //片上闪存*/
// FLASHE:origin = 0x318000,   length = 0x008000 //片上闪存*/
// FLASHD:origin = 0x320000,   length = 0x008000 //片上闪存*/
FLASHC:origin = 0x328000、      长度= 0x008000 //片上闪存*/
// FLASHA:origin = 0x338000,   length = 0x007F80 //片上闪存*/
csm_RSVD:origin = 0x33FF80,  length = 0x000076 // FLASHA 的一部分。 当 CSM 正在使用时、使用所有0x0000进行编程。 *
开始:origin = 0x33FFF6、       长度= 0x000002 /* FLASHA 的一部分。 用于"引导至闪存"引导加载程序模式。 *
CSM_PWL:origin = 0x33FFF8,   length = 0x000008 // FLASHA 的一部分。 FLASHA 中的 CSM 密码位置*/
OTP:origin = 0x380400,         长度= 0x000400 /*片上 OTP */
ADC_CAL:origin = 0x380080,    length = 0x000009 //保留存储器中的 ADC_cal 函数*/

IQTABLES:origin = 0x3FE000,    length = 0x000b50 //引导 ROM 中的 IQMath 表*/
IQTABLES2:origin = 0x3FEB50,   length = 0x00008c //引导 ROM 中的 IQMath 表*/
FPUTABLES:origin = 0x3FEBDC, length = 0x0006A0 //引导 ROM 中的 FPU 表*/
ROM:origin = 0x3FF27C、         长度= 0x000D44 //引导 ROM */
复位:origin = 0x3FFFC0,       长度= 0x000002 //引导 ROM 的一部分*/
向量:origin = 0x3FFFC2,    length = 0x00003E //引导 ROM 的部分*/

第1页:/*数据存储器*/

/*内存(RAM/FLASK/OTP)块可被移动至 PAGE0以进行程序分配*/
/*寄存器保留在第1页中*/

BOOT_RSVD:origin = 0x000000,       长度= 0x000050 // M0的一部分,引导 ROM 将使用此堆栈*/
/* RAMM0:origin = 0x000050、          长度= 0x0003B0*//*片上 RAM 块 M0 */
RAMM1:origin = 0x000400、            长度= 0x000400 //片上 RAM 块 M1 *
RAML0_7:origin = 0x008000、          长度= 0x008000 //片上 RAM 块 L1 *
/* RAML4:origin = 0x00C000、          长度= 0x001000*//*片上 RAM 块 L1 */
/* RAML5:origin = 0x00D000、          长度= 0x001000*//*片上 RAM 块 L1 */
/* RAML6:origin = 0x00E000、          长度= 0x001000*//*片上 RAM 块 L1 */
/* RAML7:origin = 0x00F000、          长度= 0x001000*//*片上 RAM 块 L1 */
/* ZONE7B:origin = 0x20FC00,         长度= 0x000400*///* XINTF 区域7 -数据空间*/
ZONE7:origin = 0x200000、            长度= 0x010000 /* XINTF 区域7 -数据空间*/
FLASHB:origin = 0x330000、           长度= 0x008000 //片上闪存*/

/*将段分配给内存块。
注:
DSP28_CodeStartBranch.asm 中用于重定向代码的 codestart 用户定义段
闪存时执行
ramfuncs 用户定义的段来存储将从闪存复制到 RAM 中的函数
*

部分

/*分配计划领域:*/
.cinit:> FLASHF_D      PAGE = 0
.pinit:> FLASHF_D,      PAGE = 0
.text:> FLASHF_D       PAGE = 0
codestart:>开始      PAGE = 0

斜坡延迟:负载= FLASHC,
         运行= RAMM0、
         Load_start (_RamdelayLoadStart)、
         Load_End (_RamdelayLoadEnd)、
         run_start (_RamdelayRunStart)、
         PAGE = 0

ramfuncs:load = FLASHC,
         运行= RAMM0、
         load_start (_RamfuncsLoadStart)、
         load_end (_RamfuncsLoadEnd)、
         run_start (_RamfuncsRunStart)、
         PAGE = 0

csmpasswds:>csm_PWL page = 0
csm_rsvd:>csm_RSVD page = 0

/*分配未初始化的数据段:*/
.stack:> RAMM1         PAGE = 1.
.ebss:> RAML0_7        PAGE = 1.
数据:> RAML0_7         PAGE = 1.
.esysmem:> RAMM1      PAGE = 1.

/*初始化段进入闪存*/
/*要使 SDFlash 对这些内容进行编程、必须将它们分配到第0页*/
.econst:> FLASHF_D     PAGE = 0
切换:>FLASHF_D      PAGE = 0

//.sysmem:> RAML0_7   page = 1.
//.cio:> RAML0_7         PAGE = 1.

/*分配 IQ 数学区域:*/
IQMath :> FLASHC             PAGE = 0 /*数学代码*/
IQmathTables :> IQTABLES,     PAGE = 0、TYPE = NOLOAD
IQmathTables2:> IQTABLES2,  PAGE = 0,TYPE = NOLOAD
FPUmathTables:> FPUTABLES,PAGE = 0,TYPE = NOLOAD

/*分配可通过 DMA 访问的 RAM 段:*/
DMARAML4:>RAML0_7,PAGE = 1
DMARAML5:>RAML0_7,PAGE = 1
DMARAML6:>RAML0_7,PAGE = 1
DMARAML7:>RAML0_7,PAGE = 1

/*分配 XINTF 区域7的0x400来存储数据*/
/* ZONE7DATA:> ZONE7B,PAGE = 1*/

/*.reset 是编译器使用的标准段。 它包含*/
/* C 代码_c_int00起始地址。 /*
/*当使用引导 ROM 时,此部分和 CPU 矢量*/
/*不需要表。 因此、默认类型设置为*/
/* DSECT */
.reset:> reset,page = 0,type = DSECT
VECTORS:> VECTORS PAGE = 0,TYPE = DSECT

/*分配 ADC_cal 函数(出厂时已预先编程到 TI 保留存储器中)*/
ADC_cal:load = ADC_CAL、page = 0、type = NoLoad


//======================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== //

希望您能回答。

谢谢。

此致、

文森特

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    文森特

    您无法更改起始地址。 原因:一旦引导 ROM 意识到必须引导以刷写、它会自动跳转到0x33FFF6。

    在引导至闪存模式时、如果您存储次级引导的入口点地址、则在每次加电时会自动跳转到次级引导代码。 但是、存储次级引导的入口点地址对将应用程序存储在 A 部分没有限制。存储器位置0x338000 - 0x33FF7F 仍可用于存储应用程序代码的代码/数据段。

    下面是我对您的要求的理解:当您引导至闪存时、您输入次级引导代码并检查您是否要根据外部激励更新您的应用代码(例如、基于 GPIO 状态(或)读取特定字以更改应用代码)。

    • 如果外部激励不要求更改应用程序代码、您只需跳转到应用程序代码即可。
    • 如果外部激励要求更改应用程序代码、您需要擦除应用程序代码(部分(或)完全)并使用新的应用程序代码重新编程。

    我是对的吗?

    如果是、请在线程提供帮助

    此致、

    曼诺伊

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Manoj、

    很抱歉稍后回复。

    是的、您对我的要求的理解是正确的。

    但我不清楚如何更改应用程序的 cmd 文件,换句话说,应该在应用程序项目的 cmd 文件中修改这些点。

    下面是我对应用程序 cmd 文件 修改的理解:(应用程序区域= Flash_F 至 Flash_D,secondary _boot 区域= Flash_H 至 Flash_G)

    1. begin :0x33FFF6--您说不应更改此地址。  这里是我之前尝试更改为0x327FFE (应用程序入口点)的位置。

     2..cinit / .pinit /.text       :> FLASHF_D        -- 将应用程序代码放入 Flash_F 至 Flash_D

     三、函数       :LOAD = FLASHC,          -- 将 ramfuncs 代码放入 Flash_C 中, 包括 flash_API 代码

    4..econst /.switch  :>FLASHF_D   PAGE = 0-- 将常量代码放入 Flash_F 至 Flash_D

     IQMath        :> FLASHC   第页= 0      --将数学代码放入 Flash_C 中

    关于 second_boot 的 cmd 文件中的这些内容,我认为它只需要修改.cinit/.pinit/.text/.econst/.switch area to Flash_H to Flash_G,对吧?

    我还添加了一个从 secondary 引导跳转到应用程序的句子:

    ===================================================================================================

    for (;;)

    //
    //此循环将被中断,因此整体而言
    //引脚切换之间的延迟将更长。
    //
    //delay_US (延迟);
    LoopCount++;
    //GpioDataRegs.GPBTOGGL.bit.GPIO32=1;
    LedLoop ();

    if (LoopCount = 10)

    ASM ("LB 0x327FFE");              //跳转到应用程序

    ================================================================================

    我认为在执行 asm ("LB 0x327FFE")之后,它将进入应用程序项目来执行应用程序。我尝试修改的起始地址是应用程序起始地址,而不是 secondary 引导。 我认为、如何修改应用项目的起始地址是我的关键点。

    如上所述、我通过调试工具 XDS100尝试将 APP 和次级引导编程到闪存中。

    1) 1)首先对应用程序进行编程、然后对 secondary 启动进行编程、 关闭电源然后再次打开电源、它将自动运行 secondary 启动。

    2) 2)我的预期是在对 APP 和 secondary 启动执行编程后、 地址0x33FFF6 = secondary 启动的入口点、地址0x327FFE =应用的入口点。

       但当前地址0x327FFE = 0xFFFF、因此我认为应用程序的 cmd 文件修改是错误的。

    这就是为什么我认为我应该修改应用的起始值。

    我的目的是:

    a.首先通过调试工具 XDS100将应用程序代码编程到闪存(应用代码区域)中、因为目前还没有相关的 PC 升级工具来发送 hex 文件。

      因此、使用调试工具将应用程序代码编程到闪存中是一种方法。

    b.然后通过调试工具 XDS100将 secondary 引导项目调试到闪存中、运行该项目以跳转到应用程序。

    c.继续运行、它将开始运行应用程序代码。

    我认为可以执行此方法来验证次级引导是否正确跳转到应用程序。

    我不知道我是否清楚地描述了我的问题。   

    希望您能回答。

    谢谢。

    此致、

    文森特

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    文森特

    如果要执行器件上电的次级引导、请将次级引导的入口点地址放在0x33FFF6中。 在次级引导代码中、当您决定跳转到应用程序项目时、只需跳转到应用程序项目的起始地址(注意:这应该具有有效的操作码)。 您无需在 cmd 文件中输入应用程序代码的入口点地址。

    此致、
    曼诺伊
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Manoj、

    我怀疑您说过"直接跳转到我的应用项目的起始地址"。

    作为此 URL 参考: https://e2e.ti.com/support/microcontrollers/c2000/f/171/t/273790  ,我认为 secondary 启动应该跳转到应用程序的入口点。

    关于这个入口点,据我的理解,它应该是整个应用程序区域的最后两个地址。

    例如、我的应用、闪存区域= Flash_F 至 Flash_D、因此 secondary 引导应该跳转到地址0x327FFE。

    那么、让我总结一下我的问题。

    1.当 secondary 引导跳转到应用程序时,它是否仅使用 ASM (" lb 0x327FFE ");?   

    由于应用领域= Flash_F 到 Flash_D,跳转地址为0x327FFE,对吧? (我执行了跳转到应用程序起始地址0x310000H 的测试、但失败了、它进入了中止。 EXIT.c 的说明)

    3.如果1. 和2. 正确,如何更改应用程序项目的 cmd 文件?  

      1) 1)起始地址= 0x33FFF6、不应更改、对吧?

      2) 2)在我展示的这个主题的设置下、您可以在 cmd 文件内容中看到上述信息的其他区域。

         init/.pinit /.text  : >  FLASHF_D,page = 0    //此处应为应用程序闪存区,应用程序的请求应是 FlashF:0x310000H 的起始地址,  

    今天、我测试了跳转至0x327FFEH 和0x310000H、都失败了。

    1) 跳转至0x310000H (该地址具有有效数据,而不是0xFFFF)时,它会输入 exit.c 的 abort()

    2) 跳转至0x327FFEH (此地址数据:FFFF FFFF 1901 56C3 FFFF 0006)时,它会输入 ILLEGAL_ISR(),不会运行从不运行的应用程序代码。

    BTW、在跳转到 secondary 引导中的应用程序之前、 我禁用 CPU 中断并清除所有 CPU 中断标志:

    IER = 0x0000;
    IFR = 0x0000;

    希望您尽快做出响应。

    谢谢。

    此致、

    文森特

       

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    文森特

    当我指的是应用程序的起始地址时、我指的是应用程序项目的入口点地址。 此条目地址应包含您希望在应用程序代码中执行的第一个运算代码。 它不一定是应用闪存扇区的第一个/最后一个地址。

    入口点地址的大小实际上取决于从次级引导加载程序跳转时要执行的第一个操作码(应用程序代码的)。

    此致、
    曼诺伊
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Manoj、

    感谢您的回答。

    您是否想给我一个示例,例如上面的信息中描述的我的应用程序。

    BTW:您是否介意回答我在5月3日提出的问题?  

    我迫切需要对从 secondar_boot 到应用程序的跳线进行测试。  否则、我必须考虑另一种设计。

    感谢您的理解。

    此致、

    文森特

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    文森特

    请向我强调您未得到澄清的问题。 我觉得我一般都回答了你的问题。

    我将看到我是否有任何示例代码。 但是、我不是积极的。

    此致、
    曼诺伊
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Manoj、

    请参阅下面以红色突出显示的部分。

    1.当 secondary 引导跳转到应用程序时,它是否仅使用 ASM (" lb 0x327FFE ");?

    由于应用领域= Flash_F 到 Flash_D,跳转地址为0x327FFE,对吧? (我执行了跳转到应用程序起始地址0x310000H 的测试、但失败了、它进入了中止。 EXIT.c 的说明)

    3.如果1. 和2. 正确,如何更改应用程序项目的 cmd 文件?

    1) 1)起始地址= 0x33FFF6、不应更改、对吧?

    2) 2)在我展示的这个主题的设置下、您可以在 cmd 文件内容中看到上述信息的其他区域。

    init/.pinit /.text:> FLASHF_D,page = 0 //此处应为应用程序闪存区,应用程序的请求应是 FlashF:0x310000H 的起始地址,

    今天、我测试了跳转至0x327FFEH 和0x310000H、都失败了。

    1)跳转至0x310000H (该地址具有有效数据,而不是0xFFFF)时,它会输入 exit.c 的 abort()

    2)跳转至0x327FFEH (此地址数据:FFFF FFFF 1901 56C3 FFFF 0006)时,它会输入 ILLEGAL_ISR(),不会运行从不运行的应用程序代码。

    BTW、在跳转到 secondary 引导中的应用程序之前、我禁用 CPU 中断并清除所有 CPU 中断标志:

    IER = 0x0000;
    IFR = 0x0000;

    希望您尽快做出响应。

    谢谢。

    此致、

    文森特

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    文森特

    遗憾的是、我没有一个可以共享的示例代码。

    1) 1)这取决于您编写应用程序代码的方式。 这就是为什么在我之前的消息中、我说这个跳转地址应该是你想要在应用代码中执行的第一个操作码。 所以、我不能说 asm ("LB 0x327FFE")是您需要使用的内容。

    2) 2)与上述答案相同

    3) 3)您不需要更改应用程序项目 cmd 文件。 当您独立加载应用程序项目而不使用次级引导加载程序代码时。 执行的第一个运算代码是什么。 第一个地址的运算代码是从次级引导加载程序跳转到的地址。

    4) 4)根据您的应用程序代码、地址0x327FFEH 和0x310000H 可能没有您的应用程序中需要执行的第一个运算代码。

    您能否将您的应用程序项目发送给我? 如果需要、您可以私下给我留言。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Manoj、

    谢谢。  好的、我们将在本主题中继续讨论。

    我可以将我的项目发送给您、而无需重要的 C 文件、希望您能理解。  我认为您可能不需要我的 c 文件,只需要项目设置相关文件,对吧?

    或者您是否只需要 cmd 文件?   

    可以给我一个邮箱吗?

    谢谢。

    此致、

    文森特

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    请给我发送一封私人邮件。 我将回复我的电子邮件地址。 我无法在此处发布我的电子邮件地址。

    我肯定需要您的 CMD 文件。 如果您没有向我发送您的关键 C 文件、这是可以的。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    文森特

    请重新发送到我的电子邮件。 但不要将其作为.rar 文件发送。

    此致、
    曼诺伊
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    文森特

    我收到了3个文件、如下所示:-

    F28335_Boot.txt
    F28335_FLASH.txt
    DSP2833x_Headers_nonBIOS.txt

    在查看 F28335_FLASH.txt (看起来像应用代码.cmd)后、您似乎正在将 codestart 部分分配为 begin (0x33FFF6 - 0x33FFFF)。 您不能这样做、因为这些地址已经由 F28335_Boot.txt 编程。 我建议您进行以下更改。

    存储器部分:
    FLASHC:origin = 0x328000,length = 0x007FFD

    FLASHC_BEGIN:origin = 0x32FFFE,length = 0x2

    部分部分:

    codestart:> FLASHC_Begin

    在引导代码中、您必须使用以下语句来跳转到您的应用程序代码。

    asm (" lb 0x32FFFE");

    此致、

    曼诺伊

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我可以关闭此主题吗? 此问题是否已解决?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    有段时间没有听到客户的反馈。 关闭此主题。