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.

[参考译文] LAUNCHXL-F28379D:自定义引导加载程序适用于 Blinky 等简单代码、一旦一些复杂的 RTOS 等、该应用程序就会崩溃。 已刷写代码。

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1636865/launchxl-f28379d-custom-bootloader-works-for-simple-code-like-blinky-while-the-app-crashes-as-soon-as-some-complex-rtos-etc-code-is-flashed

器件型号: LAUNCHXL-F28379D

我构建了自定义引导加载程序、适用于 blanky 等简单代码、它不会崩溃、而当我尝试使用包含 RTOS 的逻辑刷写更大的数据时、下面提供了我如何转移到应用程序的逻辑以供参考、CRC 校验与数据匹配、因此跳转到应用程序逻辑时会出现问题吗? JumptoApp function.c 、或者 C2000 十六进制实用程序本身生成的二进制文件是否构成问题?

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

    您好:

    此主题刚刚分配给了我、请等待 一天的帮助。

    此致、
    马特  

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

    您好:

    请注意、将等待答复。

    最好的餐厅
    Smeet

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

    您好:

     APP_START_ADDRESS 指向什么地址? 引导加载程序是否在 200MHz 执行? 您是否还可以为其他上下文提供应用的链接器命令文件?  

    我们还看到了客户使用函数指针实现 进行分支时的问题。  您是否可以尝试使用包含 LB 指令的内联汇编直接连接到应用程序的 codestart?

    资料来源: SPRU430

    此致、
    马特

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

    感谢您的回复、我尝试了 ASM 代码 e2e.ti.com/.../JumpToApp_28002900_-Function.txt 跳转到应用程序而不是函数指针、我给了您下面的代码、该代码仍在崩溃、现在不起作用。 此外、我还提供了引导加载程序和应用程序的链接器脚本

    为了更好的 understanding.e2e.ti.com/.../Linker-Files.txt 、我已将宏定义如下、#define APP_START_ADDRESS 0x084000UL。 是的、我确认引导加载程序在 200MHz 下运行。

    我希望提供的数据能帮助您更好地理解问题、我期待倾听您的意见。

    谢谢您、
    此致、
    Smeet Brijesh Bathani

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

    尊敬的 Matt、

    只是一个跟进、距离我们联系已有 2 天时间、本次聊天是否仍在进行?

    谢谢您、
    Smeet Brijesh Bathani

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

    您好:

    请注意、TI 仅在工作日(星期一-星期五)提供 E2E 支持。

    感谢您尝试、链接器命令文件/跳转机制对我来说通常是可以接受的。 我将注意到、如果引导加载程序使用了任何计时器/外设(例如 SCI 或 CAN)、最好在跳转之前对其进行复位或取消初始化、以避免应用程序中出现意外的状态行为。  您是否还能确认为堆栈分配了足够的空间?

    此致、
    马特

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

    您好 Matt、

    我已经完成了以下迭代:-
    1.重置/取消初始化所有使用的外设。
    2、函数指针、汇编代码、软件重置、看门狗重置等功能,可转到新应用,但不起作用。
    3.我已经给了应用程序项目的几乎所有可用内存,可以在我发送给您的链接器中看到。
    4.我还尝试了硬件电源复位,而不是软件或函数指针来执行应用程序。 但它崩溃了。  

    C2000 Hex 实用程序是否会正确生成.bin 文件、对吗?

    我强烈建议我们通过团队电话或 Gmeet 或有助于更快解决问题的方式会面。

    此致、
    谢谢您、
    Smeet

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

    您好、Smeet、

     链接器分配的所有资源  

    栈段必须位于低位 64KB 中、因为栈指针被限制在此范围内。 如果有任何动态任务、堆也将具有相同的限制。 可以定义 configAPPLICATION_ALLOCATED_HEAP 并手动将堆对象放置在此范围内。

    除此之外、我看不到 RTOS 应用在加载后的行为应该与裸机应用不同的任何原因、前提是它独立运行良好。 如果您看到任何变化、请告诉我。

    此致、

    Arnav  

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

    您好:

    感谢您提供更多详细信息。

    memcpy(&RamfuncsRunStart、&RamfuncsLoadStart、(size_t)&RamfuncsLoadSize);

    InitSysCtrl() 已经 为 ramfuncs 执行 memcpy()、因此不需要额外的复制。 我认为这不会导致任何致命错误。

    还需要检查以下几点:

    • 您是否对两个应用版本使用相同的链接器命令文件(简单 LED 闪烁与最简单的 LED 闪烁)?  
    • 您是否在下一个应用中将 PIE 控制寄存器和 PIE 矢量表重新初始化为默认值? 请参阅下面的 main() 的一般流程。
    • 您能否仔细检查闪存编程数据缓冲区是否为 128 位对齐?  

    void main(void)
    {
    
    //
    // Step 1. Initialize System Control:
    // PLL, WatchDog, enable Peripheral Clocks
    // This example function is found in the F2837xD_SysCtrl.c file.
    //
        InitSysCtrl();
    
    //
    // Step 2. Initialize GPIO:
    // This example function is found in the F2837xD_Gpio.c file and
    // illustrates how to set the GPIO to it's default state.
    //
        InitGpio();
    
    //
    // Step 3. Clear all interrupts and initialize PIE vector table:
    // Disable CPU interrupts
    //
        DINT;
    
    //
    // Initialize the PIE control registers to their default state.
    // The default state is all PIE interrupts disabled and flags
    // are cleared.
    // This function is found in the F2837xD_PieCtrl.c file.
    //
        InitPieCtrl();
    
    //
    // Disable CPU interrupts and clear all CPU interrupt flags:
    //
        IER = 0x0000;
        IFR = 0x0000;
    
    //
    // Initialize the PIE vector table with pointers to the shell Interrupt
    // Service Routines (ISR).
    // This will populate the entire table, even if the interrupt
    // is not used in this example.  This is useful for debug purposes.
    // The shell ISR routines are found in F2837xD_DefaultIsr.c.
    // This function is found in F2837xD_PieVect.c.
    //
        InitPieVectTable();
    
    
    //
    // Step 4. User specific code, enable interrupts:
    //
    
    
    //
    // Step 5. Enable global Interrupts and higher priority real-time debug events:
    //
        EINT;  // Enable Global interrupt INTM
        ERTM;  // Enable Global realtime interrupt DBGM
        
    }

    是 C2000 Hex 实用程序本身生成的二进制文件问题

    将哪些参数传递到十六进制实用程序?

    此致、
    马特

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

    您好 Matt、

    对延迟表示歉意、我们正忙于其他方法来解决问题。

    要回答您的问题、  

    1.是的、两个项目使用相同的链接器脚本。
    2.对于这个盲目项目,我刚刚禁用了中断。
    3.是的、我的闪存缓冲区是 128 位对齐的。

    谢谢您、
    此致、
    Smeet

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

    您好:

    不用担心、感谢您对此进行检查。

    我与 PIE 专家讨论了这个问题、他们提到 配置 PIE CPU/CPU 中断的顺序可能会很麻烦。  您可以尝试以下跳转代码吗? 我将 IER/IFR 清零、直到 PIEACK 位清零以匹配 TI 示例代码。

    void JumpToApp(void)
    {
        /* 1. Disable watchdog */
        EALLOW;
        WdRegs.WDCR.all = 0x0068;
        EDIS;
       
        /* 2. Disable global interrupts */
        DINT;
       
        /* 4. Disable PIE */
        EALLOW;
        PieCtrlRegs.PIECTRL.bit.ENPIE = 0;
        EDIS;
       
        /* 5. Clear all PIE interrupt enables */
        PieCtrlRegs.PIEIER1.all = 0;
        PieCtrlRegs.PIEIER2.all = 0;
        PieCtrlRegs.PIEIER3.all = 0;
        PieCtrlRegs.PIEIER4.all = 0;
        PieCtrlRegs.PIEIER5.all = 0;
        PieCtrlRegs.PIEIER6.all = 0;
        PieCtrlRegs.PIEIER7.all = 0;
        PieCtrlRegs.PIEIER8.all = 0;
        PieCtrlRegs.PIEIER9.all = 0;
        PieCtrlRegs.PIEIER10.all = 0;
        PieCtrlRegs.PIEIER11.all = 0;
        PieCtrlRegs.PIEIER12.all = 0;
       
        /* 6. Clear all PIE interrupt flags */
        PieCtrlRegs.PIEIFR1.all = 0;
        PieCtrlRegs.PIEIFR2.all = 0;
        PieCtrlRegs.PIEIFR3.all = 0;
        PieCtrlRegs.PIEIFR4.all = 0;
        PieCtrlRegs.PIEIFR5.all = 0;
        PieCtrlRegs.PIEIFR6.all = 0;
        PieCtrlRegs.PIEIFR7.all = 0;
        PieCtrlRegs.PIEIFR8.all = 0;
        PieCtrlRegs.PIEIFR9.all = 0;
        PieCtrlRegs.PIEIFR10.all = 0;
        PieCtrlRegs.PIEIFR11.all = 0;
        PieCtrlRegs.PIEIFR12.all = 0;
        
        /* 7. Acknowledge all PIE groups */
        PieCtrlRegs.PIEACK.all = 0xFFFF;
       
        /* 3. Clear interrupt flags and enables */
        IER = 0x0000;
        IFR = 0x0000;
        
        /* 8. TI Recommended: Indirect branch through XAR7 */
        // __asm(" MOVL XAR7, #0x084000");  /* Load app address */
        __asm(" NOP");
        __asm(" NOP");
        __asm(" NOP");
        __asm(" NOP");
        __asm(" LB 0x084000");               /* Indirect branch */
       
        /* Should never reach here */
        while(1);
    }

    此致、
    马特

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

    您好 Matt、

    您提供的上述代码不起作用。
    但我有另一个意见、可能有助于我们更好地理解问题。

    最简单的闪烁的工作原理,但当写来切换 led 逻辑在函数中,然后调用它在 while (1) 时,它崩溃。 它与栈初始化有什么关系吗? 或者、如果有人使用_cinit?

    #include "F28x_Project.h"
    
    void led(void)
    {
        // Toggle GPIO 34 (Port B uses GPBTOGGLE)
            GpioDataRegs.GPBTOGGLE.bit.GPIO34 = 1;
            
            // Slow Delay (approx 500ms)
            DELAY_US(500000); 
    }
    
    // Red LED is on GPIO 34 (Port B)
    void main(void)
    {
        InitSysCtrl();
        InitGpio();
        EALLOW;
        WdRegs.WDCR.all = 0x0068;  /* Disable watchdog */
        EDIS;
    
        // Setup Red LED (GPIO 34)
        GPIO_SetupPinMux(34, GPIO_MUX_CPU1, 0);
        GPIO_SetupPinOptions(34, GPIO_OUTPUT, GPIO_PUSHPULL);
    
        volatile uint16_t x = 0;
    
        while(1)
        {
            led();
        }
    }


    谢谢您、
    此致、
    Smeet

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

    您好:

    这是不寻常的。 我们能否检查以下各项:

    1. 是否为您的项目定义了符号“_LAUNCHXL_F28379D“? 这对于 InitSysCtrl() 使用的时钟设置很重要
    2. 当您调用 delay_us() 时、参数'500000' 可能会溢出、具体取决于宏的计算方式。 使用“UL“ 后缀强制执行无符号长算术
    3. 还请尝试在工程属性中增加栈大小:

    此致、
    马特

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

    您好 Matt、

    抱歉耽误了回复、我们试图解决问题、发现 TI Hex 实用程序工具无法生成正确的二进制文件。 我们从十六进制实用程序生成十六进制文件、然后一个 python 脚本将其转换为二进制文件、它可以正常工作而不会崩溃。

    我认为这些信息也会对您有所帮助。 您可以在问题解决后关闭线程。  

    感谢您的帮助和努力。
    此致
    Smeet Brijesh Bathani

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

    您好:

    感谢您提供解决方案来帮助他人、我非常感谢!

    此致、
    马特