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.

[参考译文] RTOS/TMS320F28075:在跳转至_c_int00后、RAM 内容丢失

Guru**** 2573695 points
Other Parts Discussed in Thread: SYSBIOS, TMS320F28075

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/628614/rtos-tms320f28075-ram-content-is-lost-after-jump-to-_c_int00

器件型号:TMS320F28075
Thread 中讨论的其他器件:SYSBIOS

工具/软件:TI-RTOS

您好!

我正在使用 SYS/BIOS 开发应用。

----架构----

我的软件架构分为两部分:

1)引导

当系统上电时、程序计数器使用以下指令从_c_intBOOT 地址开始执行(文件 boot28.asm):

_c_intBOOT:  .asmfunc
秘书长的报告
* 初始化堆栈指针。                                               *
秘书长的报告
   MOV    SP、#_stackBOOT    ;设置为栈空间的开头

秘书长的报告
*初始化状态位字段*在复位时未*初始化                 *
秘书长的报告
   SPM   0         ;将产品移位设置为0

秘书长的报告
*设置 C28x 模式                                                          *
秘书长的报告
       C28OBJ                         ;选择 C28x 对象模式
       C28ADDR                        ;清除寻址模式
       C28MAP                         ;设置块 M0和 M1模式

等等

换句话说、我已经用_c_intBOOT 标签替换了_c_int00标签、因为我想在不支持 SYS/BIOS 的情况下管理引导变量和函数。

在一些初始化和检查之后、引导代码跳转到_c_int00地址、从而启动 SYS/BIOS 引导序列。

2)固件

当程序计数器跳转到_c_int00地址时、固件代码开始。 在这个跳转之后、执行流程遵循 SYS/BIOS 标准序列。

--序列和问题----

引导变量位于与固件不同的部分、并且针对指令代码实现了相同的分离。

启动时、.ebss 和.cinit 启动变量被初始化、我看到它们的值正确。

跳转至_c_int00地址后、一些 SYS/BIOS 初始化函数(哪些函数?!?!!! 我不知道...) 然后调用 MyStartup_resetFunction。

我的问题是、在 MyStartup_resetFunction 中、我看到引导变量全部重置为零。

例如、在跳转至_c_int00 MyVariable 之前的值等于0x12345678、在 MyStartup_resetFunction 中、MyVariable 的值等于0。 同一问题会影响所有变量。

似乎有任何从_c_int00到 MyStartup_resetFunction 的指令可复位 RAM。

我的问题是:如何在不丢失引导变量值的情况下启动 SYS/BIOS 引导序列?

----补充资料----

如果我通过 JTAG 仿真器下载引导和固件代码并监控变量、我会看到在调用 MyStartup_resetFunction 时引导变量未复位。

在这种情况下、如果我拔下 JTAG 仿真器并为系统通电、我会看到在调用 MyStartup_resetFunction 时引导变量会复位。

谢谢。

此致、

Demis Biscaro

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

    通过 JTAG 加载/运行时、您能提供确切的步骤。
    2.如何覆盖复位矢量?
    3.您是否100%确定您的引导代码在下电上电时运行(例如、没有 JTAG)?
    4.为什么不能将所有引导代码全部放入 MyStartup_resetFunction 中?
    5.是否可以确认正确配置了 MyStartup_resetFunction? 例如:
    VAR 启动= xdc.useModule('xdc.runtime.Startup');
    startup.resetFxn ="&MyStartup_resetFunction";

    在 c_int00和对复位函数的调用之间运行的代码不多。 您可以在中查看它 \packages/ti\targets\rts2800\boot_cG.asm。

    Todd
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢、Todd。
    您的问题非常有趣。 我将进行一些测试、我将在几天内回复。

    谢谢你。

    此致、

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

    您好 Todd、

    [引用 user="ToddMullanix"]您好、

    通过 JTAG 加载/运行时、您能提供确切的步骤。
    [/报价]

    我将 Code Composer Studio 6.1.1与 XDS100v2 USB 调试探针结合使用。 我通过 JTAG 将 PC 连接到目标、编译工程并按下带有绿色虫子的图标以下载和调试我的软件(引导和固件)。
    执行此操作后、我看到我的引导已执行、并且在进行一些初始化并检查之后、通过在_c_int00地址处跳转来启动固件。

    [引用 user="ToddMullanix"]
    2.如何覆盖复位矢量?
    [/报价]

    我打开了窗口
    Project -> Properties -> CCS Build -> C2000 Linker -> Advanced Options -> Symbol Management
    然后我又去了线路
    "为输出模块指定程序入口点(--entry_point、-e)"
    我已经在编辑框中写入了我的标签(_c_intBOOT)。

    通过这种方式、我发现代码从_c_intBOOT 行开始、而不是从_c_int00行开始。 但只有在我连接了调试探针时、才会发生这种情况。 如果我在不通过 JTAG 重新连接的情况下关闭和打开目标、我会看到我的引导代码未执行。

    [引用 user="ToddMullanix"]
    3.您是否100%确定您的引导代码在下电上电时运行(例如、没有 JTAG)?
    [/报价]

    我已经做了一些测试、我发现您是对的:如果我没有与 JTAG 连接、我的引导代码根本不会执行。 这就是我发现引导 RAM 复位为0的原因。
    现在的问题是:为什么我的引导代码不是仅在我未连接 JTAG 时才执行?

    [引用 user="ToddMullanix"]
    4.为什么不能将所有引导代码全部放入 MyStartup_resetFunction 中?
    [/报价]

    当我启动这个项目时、我没有使用 SYS/BIOS 的经验、我更喜欢保持引导(没有 SYS/BIOS)和固件(有 SYS/BIOS)的不同。
    此外、引导可以擦除固件并使用存储在外部闪存中的更新版本对其进行更新。 因此、我发现更容易保持引导和固件完全不同。

    [引用 user="ToddMullanix"]
    5.是否可以确认正确配置了 MyStartup_resetFunction? 例如:
    VAR 启动= xdc.useModule('xdc.runtime.Startup');
    startup.resetFxn ="&MyStartup_resetFunction";
    [/报价]

    是的、我确认。 我已经签入了 app.cfg 文件、并看到了这些行。

    谢谢你。

    此致、

    演示

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

    感谢您的回答。 您可以使用 ti.sysbios.family.c28.Hwi 模块中的 plugMeta 函数来插入引导代码入口点。 您将把您的函数插入 intNum 0。 我将在明天做一个示例并附上。 基本上、我将在 SYS/BIOS 应用程序的链接器文件中创建一个与引导函数地址相对应的符号。 然后使用该符号并在.cfg 文件中调用 plugMeta。

    出于好奇、您如何在引导代码中跳转到_c_int00?

    此外、您希望单独启动代码的原因完全有意义。

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

    您好 Todd、

    [引用 user="ToddMullanix"]Hi Demis、

    感谢您的回答。 您可以使用 ti.sysbios.family.c28.Hwi模块中的 plugMeta 函数来插入引导代码入口点。 您将把您的函数插入 intNum 0。 我将在明天做一个示例并附上。 基本上、我将在 SYS/BIOS 应用程序的链接器文件中创建一个与引导函数地址相对应的符号。 然后使用该符号并在.cfg 文件中调用 plugMeta。

    [/报价]

    谢谢你 Todd、你很好。 一个示例对我非常有用。

    [引用 user="ToddMullanix"]

    出于好奇、您如何在引导代码中跳转到_c_int00?

    [/报价]

    在我们的项目中、我们通常会在固件闪存中保留少量内存、以存储有关固件的一些信息:固件入口点、版本、产品代码、ECC。这些信息始终存储在同一地址。 这样、引导函数可以为任何固件版本加载这些信息。

    固件入口点通常是 main()函数的地址。 因此,在初始化之后,引导程序将该地址加载到 C 函数指针中,然后通过该指针调用 main()函数来跳转到固件。

    在此项目中、我已声明(但未定义!) c_int00标签作为函数

    extern void _c_int00 (void);

    然后、我已将_c_int00存储在为固件入口点保留的存储器地址中。 因此引导可以跳转到_c_int00而不是 main()函数。

    我在网上找到了将_c_int00声明为 void 函数的提示、以便在 C 语言中正确使用它、但我不记得在哪个网站上...

    谢谢。

    此致、

    演示

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

    Demis、您好!

    我没有很好地完成编写工作,但下面是草案和两个例子。 请告诉我这是否适合您。 完成后、我会将其添加到 processors.wiki.ti.com 并更新此主题以指向它。

    Todd

    e2e.ti.com/.../6036.C2000BootAndSYSBIOS.pdf

    e2e.ti.com/.../2046.C28BootExamples.zip

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Todd、
    感谢您的文档和示例。
    我将尽快进行一些测试、并向您提供反馈。

    此致、

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

    我做了一些更改、并在上面重新发布了这些更改。 这些更改只是为了添加 LED 管理和一两个拼写错误。

    Todd
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的、谢谢 Todd。
    昨天、我尝试遵循您的提示、但我无意中发现了一些问题。
    首先、我只有一个同时包含引导和固件的项目、但这对我来说并不是真正的问题。

    感谢您的文档、我发现我没有在 codestart 部分中放置正确的代码。 但是、我无法更正该问题、因为在 codestart 段中还有"ti_catalog_c2800_initF2837x_begin"代码。 我应该是由我在 app.cfg 中包含的引导模块将其放置在那里:

    VAR Boot = xdc.useModule('ti.catalog.c2800.initF2837x.Boot');
    BOOT.OSCCLKSRCSEL = BOOT.OSCCLK_XTAL;
    boot.OSCCLK = 16;
    boot.SPLLIMULT = 15;
    BOOT.SYSCLKDIVSEL = 1;
    boot.loadSegment ="flash_FW page = 0";
    Boot.runSegment ="RAM_FW_PRG PAGE = 0";
    boot.SPLLFULT = Boot.Fract_0;

    因此、我删除了上面的所有行、但我发现了另一个问题:"BIOS.cpufreq (120000000Hz)与实际 CPU 频率(2500000Hz)不匹配。 请对引导模块的 PLL 设置进行编程、以确保实际的 CPU 频率与 BIOS.cpufreq 相匹配。"

    在我的引导代码(SYS/BIOS 之外)中、我对 PLL 进行编程、以确保 CPU 频率为120000000Hz、但 SYS/BIOS 似乎需要包含引导模块、并通过引导模块对 CPU 频率进行编程。

    我已经查看过您的固件示例、我看到您尚未包含引导模块。 今天、我尝试编译您的示例并了解如何解决我的问题。

    谢谢你。

    此致、

    演示
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我的解决方案在重启后无法正常工作、我还需要替换 SYSBIOS 引导函数。 这似乎相当麻烦。 我将在.cfg 中执行以下操作。

    Program.sectMap[".ti_catalog_c2800_initF2837x_begin"]="开始";

    然后、我在新的项目.asm 文件中提供 Boot_asm.s28代码。 我将分支更改为跳转到新的引导代码、而不是_c_int00。

    我还必须禁用 CODE_START ASM 中的看门狗。

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

    您好 Todd、
    也许我已经解决了我的问题。 我尝试向您解释我的解决方法、以便您可以向我报告您的注意事项。

    首先是一些初步信息。

    我正在 TMS320F28075上开发项目、因此所有地址、扇区等都是指该 DSP。

    我只使用一个项目进行引导和固件操作。

    我将引导代码存储在扇区 A 和 B (地址:0x8002-0x81FFF)中、将固件代码存储在扇区 G、H、I 和 J (地址0x98000-0xB7FFF)中;


    现在、让我们看一下软件架构。

    BootF2807x_CodeStartBranch.asm 文件中、我已经按照如下方式定义了_code_start 标签和 codestart 段。

    假设(现在...) 循环通电后、程序计数器加载_code_start 标签、即要执行的第一条指令是放置在_code_start 地址的指令。


    ;* BootF2807x_CodeStartBranch.asm


    WD_DISABLE   .set   1      ;设置为1可禁用 WD、否则设置为0

       .ref _c_intBOOT
       全局_code_start

    (三
    *函数:codestart 段
    *
    *说明:分支到代码起始点
    (三

      .sect "codestart"

    code_start:
       如果 WD_DISABLE = 1
           LB WD_DISABLE      ;分支到看门狗禁用代码
       其他
           LB _c_intBOOT      ;分支到 RTS 库中的启动。_asm
       .endif

    ;结束 codestart 段

    (三
    *函数:WD_DISABLE
    *
    *说明:禁用看门狗计时器
    (三
       如果 WD_DISABLE = 1

       .text
    WD_DISABLE:
       SETC OBJMODE       ;为28x 目标代码设置 OBJMODE
       EALLOW             ;启用 EALLOW 受保护寄存器访问
       MOVZ DP,#7029h>>>6 ;设置 WDCR 寄存器的数据页
       MOV @7029h、#0068h ;将 WDCR 中的 WDDIS 位置位以禁用 WD
       EDIS               ;禁用 EALLOW 受保护寄存器访问
       LB _c_intBOOT        ;分支到 RTS 库中的启动。_asm

       .endif

    ;结束 wd_disable

       .end
       

    ;* End BootF2807x_CodeStartBranch.asm


    您会看到 codestart 段只包含一条指令:

    LB wd_disable

    跳转到禁用看门狗的 wd_disable 例程。 WD_DISABLE 代码被分配到引导扇区(A 或 B)中的某个位置。

    WD_DISABLE 最后一条指令是

    LB _c_intBOOT

    它将跳转到_c_intBOOT 地址。

    此标签在 Boot28.asm 文件中定义:


    ;* Boot28.asm

    const_copy   .set 0

     全局 _c_intBOOT、_BootCinit、Pinit
     全局 _exit
     .global __stackBOOT
     .global _Boot

    秘书长的报告
    *声明堆栈。  大小由链接器选项-stack 确定。  The *
    *默认值为1K 字。                                               *
    秘书长的报告
    _stackBOOT:   .usect ".stack"、0

    秘书长的报告
    * 初始化复位矢量以指向_c_int00                           *
    秘书长的报告
       .sect .reset
     .long _c_intBOOT

       .text
    秘书长的报告
    *函数 DEF:_c_intBOOT                                               *
    *                                                                         *
    秘书长的报告
    _c_intBOOT:  .asmfunc

    秘书长的报告
    * 初始化堆栈指针。                                               *
    秘书长的报告
       MOV    SP、#_stackBOOT    ;设置为栈空间的开头

    秘书长的报告
    *初始化状态位字段*在复位时未*初始化                 *
    秘书长的报告
       SPM   0         ;将产品移位设置为0

    秘书长的报告
    *设置 C28x 模式                                                          *
    秘书长的报告
           C28OBJ                         ;选择 C28x 对象模式
           C28ADDR                        ;清除寻址模式
           C28MAP                         ;设置块 M0和 M1模式

           如果.TMS320C2800_FPU32
           SETFLG           RNDF32=1     ;启用 FPU32模式中的舍入。
           .endif

    秘书长的报告
    *执行一些操作
    秘书长的报告
    -在引导 RAM 段中初始化.cinit;
    -进行一些检查;
    -等等
    秘书长的报告
    *结束一些工作
    秘书长的报告
                
    秘书长的报告
    * 调用用户的程序                                                    *
    秘书长的报告
       LCR  _Boot           ;执行 Boot()函数
       LCR_EXIT  
       endasmfunc


    ;* End Boot28.asm


    您可以看到、在"执行一些操作"之后、指令是这样的

    LCR_Boot    

    跳转至 Boot()函数,这是用 C 语言编写的第一个函数。

    boot()函数位于 boot.c 文件中

    //
    //* Boot.c
    //

    空引导(空)

       /*指向存储 FIRS 固件函数地址的地址的指针,即_c_int00。 *
       uint32* pFirmwareEntryFunctionAddress;
       
       /*指向跳转至固件的函数指针*/
       void (* pFirmwareEntryFunction)(void);


       /*执行一些其他操作*/
       -硬件外设初始化;
       -一些检查;
       -验证外部串行闪存中是否有新固件版本,并最终安装新固件
       -等等
       /*结束一些其他内容*/

       /*现在是运行固件的时候了,那就是跳转到_c_int00函数。
          所有固件版本都将_c_int00的地址放置在地址0xB7FE2上
          换言之、在固件中、有如下所示的内容:
          
          const UINT32 FirmwareEntryPointAddress =&_c_int00;
          
          链接器将 FirmwareEntryPointAddress 放置在0xB7FE2地址处。

       *
       /*保存0xB7FE2地址*/
       pFirmwareEntryFunctionAddress = 0xB7FE2;

       /*加载0xB7FE2地址的内容、即加载_c_int00函数的地址*/
       pFirmwareEntryFunction =* pFirmwareEntryFunctionAddress;
       
       /* exectute _c_int00函数,即跳转到固件!!! *
       (*pFirmwareEntryFunction)();
       


    //
    //* End Boot.c
    //

    现在简要回顾一下:
    下电上电--[在程序计数器0x80000地址中加载]-->_code_start --[跳转至]--> wd_disable --[禁用然后跳转至]-->_c_intBOOT --[一些东西然后跳转至]--> Boot ()--[一些东西然后跳转至]-->_c_int00:固件运行!

    我的目标是在地址0x80000 (闪存扇区 A 的第一个地址)分配 codestart 段、因为在下电上电后、引导加载程序将0x80000地址加载到程序计数器中。

    为此、几天前我在 MyProject.cmd 链接器文件中添加了以下行

    //
    //* MyProject.cmd
    //
    存储器

    (笑声)

       开始  :origin = 0x080000,length = 0x000002

    (笑声)
          


    部分

    (笑声)

      codestart               :> begin                          page = 0,align (4)

    (笑声)

    //
    //*结束 MyProject.cmd
    //

    但链接过程失败、因为 SYS/BIOS 默认将其自己的段.ti_catalog_c2800_initF2837x_begin (包含_ti_catalog_c2800_initF2837x_Boot_entry 标签)分配给同一地址(0x80000)。

    因此、我的问题是在另一个地址分配.ti_catalog_c2800_initF2837x_begin 段

    今天上午、我终于成功地将.ti_catalog_c2800_initF2837x_begin 段移动到地址0xB0000 (在固件扇区中)、将这两行添加到 App.cfg 文件中

    //
    //* App.cfg
    //
    (笑声)

    Program.sectMap[".ti_catalog_c2800_initF2837x_begin"]= new Program.SectionSpec ();
    Program.sectMap[".ti_catalog_c2800_initF2837x_begin"].loadAddress = 0x000B0000;

    (笑声)
    //
    //*结束 App.cfg
    //

    我选择了0xB0000地址、因为它是固件扇区中的地址、但我可以选择该范围内的任何其他地址。
    这样、_ti_catalog_c2800_initF2837x_Boot_entry 标签就不会被使用、因为我通过直接跳转到 Boot ()函数中的_c_int00来运行固件、正如我之前所解释的那样。

    现在、如果我执行下电上电(即我关闭电路板并再次打开)、我会看到执行了启动、然后固件启动正确。

    此外、我已打开 CCS 窗口
    Project -> Properties -> CCS Build -> C2000 Linker -> Advanced Options -> Symbol Management
    我已经在编辑框中编写了_code_start
    "为输出模块指定程序入口点(--entry_point、-e)"
    因此、即使我通过 JTAG 连接到目标、也会执行引导。

    我希望我已经很好地解释了我的权变措施。

    你有什么意见吗? 您认为这是一种正确的方式来实现我的意思吗?

    感谢您的提示、并向我展示了语法"Program.sectMap"!

    此致、

    演示


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

    我要查看这个。 我很快会回来的。

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

    它基本上看起来很好。 我有两个意见。

    为什么_c_int00使用0xB7FE2。 它似乎是一个相当随机的位置。
    2.是否插入其他 intNum 0函数? 如果发生复位、默认情况下会转到_c_int00、而不是 code_start。

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

    您好 Todd、

    [引用 user="ToddMullanix"]Hi Demis、

    它基本上看起来很好。 我有两个意见。

    为什么_c_int00使用0xB7FE2。 它似乎是一个相当随机的位置。

    [/报价]

    不、这不是一个随机位置、但我知道它可能会出现在您看来。 )

    我尝试解释一下。

    28075 DSP 有14个闪存扇区。 我已保留

    -用于引导的 A-B 扇区;

    -固件的 G、H、I、J 扇区;

    应用数据的 K、L、M、N 扇区;

    - C、D、E、F 扇区、用于引导或固件的未来扩展。

    在固件的底部区域、我分配了一个表(FwTable)、其中包含一些与引导共享的数据。 所有固件版本都在同一地址分配 FwTable 表、因此引导程序始终可以访问此类数据。

    FwTable 被分配到 J 扇区(0xB0000-0xB8000)的底部区域、特别是在0xB7FE0地址处、且其长度为0x20字。 第一个基准面是一个2字基准面、而第二个数据是_c_int00地址、因此它被分配在0xB7FE2地址。

    [引用 user="ToddMullanix"]
    2.是否插入其他 intNum 0函数? 如果发生复位、默认情况下会转到_c_int00、而不是 code_start。
    [/报价]

    不、我没有插入其他 intNum 0函数、因为我认为它不是必需的。

    您的意思是、如果在没有下电上电的情况下发生复位、代码执行从_c_int00开始、对吧?

    因此、我应该将以下行添加到 app.cfg 文件中:

    Hwi.nonDispatchedInterrupts[0]=新的 Hwi.NonDispatchInterrupt ();
    Hwi.nonDispatchedInterrupts[0].fxn ="_code_start";
    Hwi.nonDispatchedInterrupts[0].enableInt = false;
    Hwi.nonDispatchedInterrupts[0].intNum = 0;

    正确吗?

    非常感谢、Todd。

    此致、

    演示

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

    Demis、您好!

    [引用 user="Demis Biscaro">不是,它不是随机位置,但我知道它可能在您看来。 :)[/报价]

    我认为这一发言必须有一个原因。 感谢您的讲解。

    [报价用户="Demis Biscaro"]是否正确?

    是的

    Todd

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

    我将修复我的代码、并可能在下周做一些测试。

    此致、

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

    您好 Todd、

    我已经做了一些测试、但结果不是我(或者我们...) 预期。

    1) 1)复位测试

    我尚未将以下行添加到 app.cfg 文件中:

    Hwi.nonDispatchedInterrupts[0]=新的 Hwi.NonDispatchInterrupt ();
    Hwi.nonDispatchedInterrupts[0].fxn ="_code_start";
    Hwi.nonDispatchedInterrupts[0].enableInt = false;
    Hwi.nonDispatchedInterrupts[0].intNum = 0;

    因为我想检查如果 DSP 复位会发生什么情况。

    我找到了以下结果:

    a)复位原因:看门狗失效

    如果看门狗在启动时到期(不带 SYS/BIOS)、则 DSP 会复位并从_code_start (即从启动开始)重新启动代码执行(正确!)。

    无论 CCS 是通过 JTAG 连接到目标、还是 CCS 未连接、都会发生这种情况。

    如果看门狗在固件中过期(使用 SYS/BIOS)、则 DSP 复位并从_code_start (即从引导(正确!)重新启动代码执行 仅当 CCS 未连接到目标时。

    相反、如果 CCS 连接到目标并且看门狗在固件中过期、则代码执行肯定会停止、并且程序不会再次运行、直到我通过 CCS 复位 DSP 或关闭并打开电源。

    代码执行似乎会跳转到未编程的位置、或类似的位置。

    b)复位原因:强制复位

    我通过在 WDCR 寄存器的 WDCHK 字段中写入0 (零)来强制复位。

    如果在引导时强制进行复位(不带 SYS/BIOS)、DSP 将复位、并且代码执行从_code_start、i、e.从引导中重新启动(正确!)。

    如果在固件中强制进行复位(使用 SYS/BIOS)、则 DSP 会复位、代码执行从_code_start 重新启动、即 i。e.从引导(正确!) 仅当 CCS 未连接到目标时。

    相反、如果 CCS 连接到目标并且在固件代码执行中强制复位绝对停止、并且程序不会再次运行、直到我通过 CCS 复位 DSP 或关闭并打开电源。

    代码执行似乎会跳转到未编程的位置、或类似的位置。

    总之、我已经看到、如果 CCS 未连接、代码执行在以下所有情况下都正确启动:

    -在一个循环通电后(即在关闭和打开电源之后);
    -由于看门狗过期而复位之后;
    -通过 WDCHK 域强制复位后。

    那么、为什么我应该添加这些行来更改 Hwi.nonDispatchedInterrupts[0]配置?

    2) 2)更改 Hwi.nonDispatchedInterrupts[0]配置

    但是、我已尝试更改 Hwi.nonDispatchedInterrupts[0]配置、并将以下行添加到我的 app.cfg 文件中

    Hwi.nonDispatchedInterrupts[0]=新的 Hwi.NonDispatchInterrupt ();
    Hwi.nonDispatchedInterrupts[0].fxn ="_code_start";
    Hwi.nonDispatchedInterrupts[0].enableInt = false;
    Hwi.nonDispatchedInterrupts[0].intNum = 0;

    编译失败、出现以下错误:

    -ti.sysbios.family.c28.hwi/nonchedDispatchInterrupts/'ti_sysbios_family_c28_Hwi0':fxn 的分配不兼容:"_code_start"

    - XDC 运行时错误:ti.sysbios.family.c28.Hwi/nonDispatchedInterrupts/'ti_sysbios_family_c28_Hwi0':fxn 的分配不兼容:"_code_start"

    为什么"_code_start"分配不兼容?

    此致、

    演示

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

    我今天在旅行。 我明天会看这个。

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

    我将与 CCS 团队一起查看他们在器件启动的复位上所做的工作。

    有关构建错误的问题、您有没有
    _code_start=0x080000;
    基于 SYS/BIOS 的应用程序的链接器文件中?

    您需要为 NMI 中断插入 int 0。 您已经测试过复位事件。 我将举一个例子。

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

    [引用 user="ToddMullanix"]Demis、

    我将与 CCS 团队一起查看他们在器件启动的复位上所做的工作。

    [/报价]

    好的、谢谢。

    [引用 user="ToddMullanix"]

    有关构建错误的问题、您有没有
    _code_start=0x080000;
    基于 SYS/BIOS 的应用程序的链接器文件中?

    [/报价]

    不、我的 cmd 链接器文件中没有该语句。

    但是、我通过另一种方式获得了相同的结果:

    存储器

    第0页:/* 程序内存*/

    (笑声)

       /*闪存引导地址*/
       /* begin 用于"引导至闪存"引导加载程序模式  */

       开始  :origin = 0x080000,length = 0x000002

    (笑声)

    部分

    (笑声)


      /*分配计划领域:
                code_start 是 codestart 段开始处的标签*

      codestart               :> begin                          page = 0,align (4)

    (笑声)

    然后、如果我检查我找到的映射文件

    入口点符号:"_code_start" 地址:00080000

    因此、我认为我不需要_code_start=0x80000分配。

    [引用 user="ToddMullanix"]
    您需要为 NMI 中断插入 int 0。 您已经测试过复位事件。 我将举一个例子。

    [/报价]

    好的、谢谢。

    此致、

    演示

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Todd、
    有关此问题的任何新闻?

    谢谢。

    此致、

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

    您好 Todd、

    有关此主题的任何新闻?

    我正在开发项目、但仍然遇到相同的问题、即如果通过 JTAG 连接 CCS 时系统复位、则复位失败、代码执行被占用在引导 ROM 代码中的第0x3FE2ED 行。

    如果我调用 BIOS_exit(),也会出现同样的问题:BIOS_start()调用之后的指令永远不会被执行,代码被吸入到第0x3FE2ED 行。

    我不知道如何解决这个问题、您有什么提示吗?

    谢谢你。

    此致、

    演示

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Todd、
    我已经做了一些其他测试。
    具体而言、当 CCS 通过 JTAG 连接到我的目标并且在启动 SYSBIOS 之前、我已通过看门狗寄存器强制进行复位。 但是、我发现了同样不需要的行为:代码执行被吸入到第0x3FE2ED 行。

    因此、我认为这种行为不涉及 SYSBIOS、但它仅取决于 CCS。 对吧?

    谢谢。

    此致、

    演示
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果 JTAG 被连接、那么器件在仿真引导模式中引导、此模式由地址位置0xD00处的值解码。 请参阅"3.6配置仿真启动选项"一节以了解相同的内容。 如果在看门狗复位之前未正确设置引导模式、则器件可能无法按预期引导。 请检查相同项。

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

    您好、Vivek、
    感谢您的支持。
    请告诉我、在哪个文档中我可以找到"3.6配置仿真启动选项"部分?

    谢谢。

    此致、

    演示

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

    它位于器件 TRM 中

    Vivek Singh

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

    此致、

    演示