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.

[参考译文] TMS570LS3137:引导加载程序 FreeRTOS 程序

Guru**** 2553260 points
Other Parts Discussed in Thread: TMS570LS3137

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1277305/tms570ls3137-bootloader-freertos-program

器件型号:TMS570LS3137

您好 Jagadish、很抱歉耽误我的时间。 我在链接 器 TMS570LS3137上尝试了您的解决方案:引导加载程序 FreeRTOS 程序、但它对我不起作用。  

我附上了我的完整代码:

e2e.ti.com/.../V2.2_5F00_Firmware_5F00_Boot.zip

当引导加载程序完成时、我注意到 FreeRTOS 没有运行(它必须给 LED 上电)。 所以我点击了"暂停",我观察到程序 显示了以下:

我附上了我的代码。 如果您想看到一段特定的代码、请告诉我。

SYS_main.c

/* Include Files */
#include "sys_common.h"
#include "system.h"
#include "stdio.h"
#include "esm.h"
#include "sys_mpu.h"


#include "FreeRTOS.h"
#include "os_task.h"
#include "os_semphr.h"

#include "het.h"
#include "gio.h"
#include "can.h"
#include "sci.h"
#include "adc.h"
#include "sys_vim.h"
#include "sys_core.h"

#include "bootloader.h"
#include "bl_can.h"

#include "includes.h"

#include "bl_check.h"
#include "bl_led_demo.h"

#include "bl_config.h"
#include "sci_common.h"


void initFunction()
{
    _enable_interrupt_();
    gioSetDirection(hetPORT1, 0xFFFFFFFF);
    canInit();
  //  sciInit();
    adcInit();
    vimInit();
}



/*
*********************************************************************************************************
*                                                 MAIN
*********************************************************************************************************
*/
void main(void){

    /* USER CODE BEGIN (22) */
        systemInit();
        _coreEnableIrqVicOffset_();
        initFunction();
        esmInit();

    /* USER CODE END */

        _mpuInit_();



    RTOSFunction();
}

包括.c

/* Define Task Handles */
xTaskHandle xTask1Handle;
xTaskHandle xTask2Handle;
xTaskHandle xTask3Handle;
xTaskHandle xTask4Handle;
xTaskHandle xTask5Handle;

xQueueHandle xMainQ = NULL;
xQueueHandle xErrQ  = NULL;
xQueueHandle xComQ  = NULL;
xQueueHandle xComRx  = NULL;
xQueueHandle xComIn = NULL;
xQueueHandle xSense = NULL;
xQueueHandle xTimer = NULL;

xSemaphoreHandle xSemaphoreTime = NULL;

void vApp(void *pvParameters);
void vTimer(void *pvParameters);
void vTaskIDLE(void *pvParameters);
void vSense(void *pvParameters);

void RTOSFunction()
{
      vSemaphoreCreateBinary(xSemaphoreTime);

      /*Create Queues*/
      xMainQ  = xQueueCreate(10, sizeof (struct xMessage));
      xSense  = xQueueCreate(10, sizeof (struct xMessage));
      xErrQ   = xQueueCreate(10, sizeof (struct xMessage));
      xComIn  = xQueueCreate(10, sizeof(int));
      xComRx  = xQueueCreate(10, sizeof(int));

      /* Create Tasks */
      xTaskCreate(vTimer,            "TIMER", configMINIMAL_STACK_SIZE, NULL, 5, &xTask1Handle);
      xTaskCreate(vApp,              "APP",   configMINIMAL_STACK_SIZE, NULL, 5, &xTask1Handle);
      xTaskCreate(vTaskIDLE,         "IDLE",  configMINIMAL_STACK_SIZE, NULL, 4, &xTask1Handle);
      /*Create Aperiodic Tasks*/
      xTaskCreate(vSense,            "HK",    configMINIMAL_STACK_SIZE, NULL, 4 , &xTask5Handle);
      xTaskCreate(vTCP,              "TCP",   configMINIMAL_STACK_SIZE, NULL, 4, &xTask4Handle);

      //_mpuInit_();


      /* Start Scheduler */
      vTaskStartScheduler();
      /* Run forever */
      while(1);
}

SYS_link.cmd

MEMORY
{

    /* PARA GRABAR*/

    VECTORS (X)  : origin=0x00020020 length=0x00000020
    FLASH_CODE  (RX) : origin=0x00020040 length=0x008000-0x40 fill=0xFFFFFFFF
    FLASH0  (RX) : origin=0x00028000 length=0x0014FFC0
    FLASH1  (RX) : origin=0x00180000 length=0x00180000
    STACKS  (RW) : origin=0x08000000 length=0x00000800
    KRAM    (RW) : origin=0x08000800 length=0x00000800
    RAM     (RW) : origin=(0x08000800+0x00000800) length=(0x0003F800 - 0x00000800)


/* USER CODE BEGIN (2) */
/* USER CODE END */
}

/* USER CODE BEGIN (3) */
/* USER CODE END */

/*----------------------------------------------------------------------------*/
/* Section Configuration                                                      */

SECTIONS
{

    .intvecs : {} > VECTORS
    /* FreeRTOS Kernel in protected region of Flash */
    .kernelTEXT   : {} > FLASH0 | FLASH1
    .cinit        : {} > FLASH0 | FLASH1
    .pinit        : {} > FLASH0 | FLASH1
    /* Rest of code to user mode flash region */
    .text         : {} > FLASH0 | FLASH1
    .const        : {} > FLASH0 | FLASH1
    /* FreeRTOS Kernel data in protected region of RAM */
    .kernelBSS    : {} > KRAM
    .kernelHEAP   : {} > RAM
    .bss          : {} > RAM
    .data         : {} > RAM


/* USER CODE BEGIN (4) */
/* USER CODE END */
}

提前感谢您。 我会等待您提供任何建议。  

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

    尊敬的 

    您正在使用哪个引导加载程序代码?

    UART 或 CAN、以太网或任何其他?

    是否也可以共享引导加载程序代码?

    --

    谢谢。此致、
    Jagadish。

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

    你好 Jagadish ,谢谢你的答复。

    是的、当然可以。 我将通过 CAN 使用引导加载程序。 我使用另一个项目(没有 RTOS)对其进行了检查、引导加载程序可以正常工作(正确记录和舍入)

    我从 TI 网页下载了引导加载程序项目。

    e2e.ti.com/.../UPGRADE2.zip

     我进行了一些小更改、但代码正常工作、我检查了该项目、引导加载程序正常工作。

    e2e.ti.com/.../6064.TMS570LSx_5F00_rtiBlinky_5F00_BL_5F00_APP20020.zip

    非常感谢您的帮助!

    此致、

    Federico.

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

    尊敬的  Federico:

    我现在没有 TMS570LS3137板。 我会在两天内得到它。 请给我一些时间进行测试。

    --

    谢谢。此致、
    Jagadish。

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

    您好 Jagadish:

    非常感谢您的帮助。  

    请告诉我您是否可以测试引导加载程序。

    此致。

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

    尊敬的  Federico:

    我的 LS3137 HDK 板无法正常工作、因此我将此主题重新分配给我的同事以寻求帮助。

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

    尊敬的  Federico:

    bootloader 的用途是更新位于闪存中的固件。 固件更新后、应发出软件复位命令、以使代码执行能够正确跳转到新固件。 我建议不要将 FreeRTOS 用于引导加载程序。

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

    F021闪存 API 必须 以特权模式(用户模式以外的模式)运行才能访问闪存控制器寄存器。 FreeRTOS 中的任务默认配置为用户模式。 您需要在启动引导加载程序之前切换到特权模式、然后在固件编程到闪存后将其切换回用户模式。

    void vTask_bootloader (void * pvParameters)
    {
       portenter_PRIVILEG_MODE ();

       引导加载程序代码...

       PORTswitch_to_user_mode ();

       for (;;)  {
         vTaskDelay (1000);
       }

    软件中断处理程序在 os_portasm.asm 中定义

    您可以将以下代码添加到 Includes.c 文件中:

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

    QJ Wang 您好! 非常感谢您的帮助。

    我尝试了你的建议,但它还不起作用。

    另一方面、我尝试了另一种解决方案、因为我认为这个问题可能更笼统。 按照 Jagadish 提供的步骤在以下链接中进行操作:r TI E2E 支持论坛 我尝试使用 CCS 将应用程序录制到0x20020位置。

    我执行了以下步骤:

    1 -擦除整个闪存(含 UnityFlash)

    加载引导加载程序(称为 UPGRADE2)

    3-连接目标后、我加载应用程序(位于0x20020位置)(不擦除闪存、因此在存储器的开头有引导加载程序)。

    这是应用程序的 sys_link.cmd:  

    VECTORS (X):origin=0x00020020 length=0x00000020
    FLASH_CODE (RX):origin=0x00020040 length=0x008000-0x40 fill=0xFFFFFFFF
    FLASH0 (RX):origin=0x00028000 length=0x0014FFC0
    FLASH1 (RX):origin=0x00180000 length=0x00180000
    堆栈(RW):origin=0x08000000 length=0x00000800
    KRAM (RW):origin=0x08000800 length=0x00000800
    RAM (RW):origin=(0x08000800+0x00000800) length=(0x0003F800 - 0x00000800)

    在存储器的开头是引导加载程序、0x20020是应用程序、

    4 - Did 点击了'run'、CCS 开始运行应用程序、但它被阻止(或任何类似的)。 因为我没有看到任务在运行。

    5- DID 点击"暂停"、我看到了以下消息:

    0x00004E44 (未定义符号)

    但是、在该位置、有一个称为

    6-我 在应用程序的 sys_main.c 中设置了 while (1)(在 RTOS 调度程序之前)、并且我再次执行了相同的步骤。 并正常工作(我看到 LED 已通电)。

    但是问题是、我想运行 RTOSFuncations (FreeRTOS 应该在这里开始运行)。

    7-为了确保应用程序正常工作、我只加载应用程序(在0x0位置)、并且正常工作。 为此、我使用以下行更改了 sys_link.cmd 并执行:

    VECTORS (X):origin=0x00000000 length=0x00000020
    内核(RX):origin=0x00000020 length=0x00008000
    FLASH0 (RX):origin=0x00008020 length=0x00177FE0
    FLASH1 (RX):origin=0x00180000 length=0x00180000
    堆栈(RW):origin=0x08000000 length=0x00000800
    KRAM (RW):origin=0x08000800 length=0x00000800
    RAM (RW):origin=(0x08000800+0x00000800) length=(0x0003F800 - 0x00000800)

    我不确定如何解决这个问题。 这有些奇怪。 非常感谢您能提出任何建议。

    非常感谢。

    此致、

    Federico.

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

    5- DID 点击"暂停"、我看到了以下消息:

    0x00004E44 (未定义符号)

    [/报价]

    您的引导加载程序位于0x00000000、您的应用程序从0x20020开始编程到闪存中。 地址0x4E44不是您的应用的一部分。 这可能是引导加载程序的中止处理程序。

    引导加载程序尺寸小、很难确保它没有错误。 如果出现数据中止、请修改引导加载程序的 sys_intvecs.asm 以跳转到您的应用中的中止处理程序。


    复位入口
    b _c_int00
    解除引用
    B # 0个 20020 ;undefEntry
    svcEntry
    B # 0个 20020 ; svcEntry
    预取入口
    B # 0个 20020 ; prefetchEntry
    B #0x20020 ;;;_dabort
    B #0x20020  ;; phantomInterrupt
    LDR PC、[PC,#-0x1b0]
    LDR PC、[PC,#-0x1b0]

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

    您好 QJ Wang。 感谢您的快速回复。

    我执行了您的建议、但当我加载引导加载程序时、评估板仍然保持 RES 指示状态。

    如果我不更改_dabort、可以加载引导加载程序、但结果与之前相同  

    可能奇怪的是、一旦您在位置20020开始运行应用程序、它必须返回到之前的位置? 错误继续标记在位置0x00004E44。

    非常感谢您的帮助

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

    在引导加载程序中、您是否执行任何自检来有意生成数据中止? 例如2位 ECC 错误强制测试。 您可以在引导加载程序中使用轮询模式来检查错误标志并在引导加载程序中手动清除错误标志。

    可能会奇怪,一旦您开始在位置20020
    运行该应用程序

    sys_intvecs.asm 中的20020应采用十六进制格式 0x20020

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

    您好 QJ Wang:

    是的、位置是十六进制格式。

    不可以、我没有执行自检来从内部生成数据中止。 我怎样才能做到这一点?  

    我使用另一个应用程序进行了分步检查、该程序只有2个任务、可以打开和关闭2个 LED、结果与以前相同。

    问题在于应用程序正在创建任务时。 在这一点,我不知道为什么,但跳到另一个位置(在开始)时,输入这一行:

    xTaskCreate (vTaskIDLE、"idle"、configMINIMAL_STACK_SIZE、0、1、 &xTask1Handle);

    (我对其余任务进行了注释、但 FreeRTOS 程序的各个部分都存在此问题)。

    并且程序将跳转至以下行:

    在地址"0x10"处中断、没有可用调试信息、或在程序代码之外。

    在地址"0x85e8"中断、没有可用的调试信息、或在程序代码之外。

    在地址"0x85dc"处中断、没有可用的调试信息、或者在程序代码之外。

    这些位置有信息。

    我尝试过在没有 RTOS 的情况下使用其他应用程序、它工作正常。 抱歉、但我确实需要 RTOS 与引导加载程序一起工作。 或者、也许有其他解决方案将 RTOS 应用程序保存在一个存储器位置、然后从引导加载程序跳转到该位置?  我的意思是、只要我可以在不同的存储器位置创建不同的程序、然后从一个程序跳转到另一个程序、就对我有效。  如果无法将引导加载程序与 RTOS 搭配使用、我会使用引导加载程序在没有 RTOS 的情况下记录程序。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很抱歉,但我真的需要 RTOS 才能与引导加载程序一起使用

    据我了解、您需要适用于您的应用的 FreeRTOS、但不能用于引导加载程序。 而不对引导加载程序使用 RTOS。

    我使用另一个应用程序逐步检查,它只有2个任务,并打开和关闭2个 LED,结果与以前相同。

    看起来2个红色 LED 由应用程序而不是引导加载程序中的代码点亮。

    您能检查 ESM 状态寄存器的值吗? 和 CP15数据中止状态寄存器中?

    是的,位置为十六进制格式。

    但您的代码显示使用十进制数(20020)  

    您是否使用了更新的引导加载程序 sys_intvecs.asm?  

    复位入口
    b _c_int00
    解除引用
    B # 0个 20020 ;undefEntry
    svcEntry
    B # 0个 20020 ; svcEntry
    预取入口
    B # 0个 20020 ; prefetchEntry
    B  #0x20020  ;;;_dabort
    B  #0x20020  ;; phantomInterrupt
    LDR PC、[PC,#-0x1b0]
    LDR PC、[PC,#-0x1b0]

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

    感谢您的帮助 QJ Wang。

    是的、抱歉、我 更新了  sys_intvecs.asm 作为您的建议。

    但我无法更新_dabort、因为当我将指令更改为 b #0x20020;;_dabort 时、引导加载程序不会加载到电路板(保持红色 LED 亮起)。

    我将  sys_intvecs.asm 更新为:

    有没有可以更改_dabort 的解决方案? 我是否 还需要更新我的 RTOS 应用程序上的 sys_intvecs.asm?

    在我的应用程序中、我有:

    ESM 状态

    CP15:

    我在运行应用程序时录制了一段视频。

    e2e.ti.com/.../2023_2D00_10_2D00_25_5F00_20h41_5F00_07.mp4

    如果您有任何其他需要、请告诉我。 非常感谢。

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

    您好!

    但我无法更新_dabort、因为当我将指令更改为 b #0x20020;;_dabort 时、引导加载程序无法加载到电路板

    您是说您不能使用引导加载程序加载应用程序? 或者无法通过 CCS 将引导加载程序加载到 MCU 闪存?

    以及是否 也需要更新我的 RTOS 应用程序上的 sys_intvecs.asm?

    否、您无需在应用程序(RTOS App)中更改 sys_intvecs.asm。

    ESM 状态寄存器的值为零、这意味着没有 ESM 标志被设定。  

    数据中止故障状态为:0x80D --> MPU 权限故障。  

    如果您仅运行引导加载程序(引导+使用 CAN 或 UART +编程应用程序将应用程序加载到闪存(来自0x20020)、但不跳转到应用程序)、您能否获得数据中止?

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

    您好 QJ Wang:

    抱歉没有正确表达自己。 当我在 sys_intvecs.asm 中的引导加载程序中进行更改、然后将引导加载程序加载到具有 CCS 的板上时、该板将保持红色 LED (17)亮起。  我执行了上面提到的更改、但_dabort 除外。 它就像:

    优点:
    ;导入中断例程的引用

    .ref _c_int00
    .ref _dabort
    .REF 远程中断
    .def resetEntry

    优点:
    ;中断向量

    复位入口
    b _c_int00
    解除引用
    b #0x20020 ; undefEntry
    svcEntry
    b #0x20020 ; svcEntry
    预取入口
    b #0x20020;prefetchEntry
    b _dabort (中止)
    b #0x20020 ; phantomInterrupt
    LDR PC、[PC,#-0x1b0]
    LDR PC、[PC,#-0x1b0]

    • 如果您仅运行引导加载程序(引导+使用 CAN 或 UART +编程应用程序将应用程序加载到闪存(来自0x20020)、但不跳转到应用程序)、您能否获得数据中止?

    我运行引导加载程序、然后使用 CAN 加载应用程序(位置0x20020)。 如果我不跳转到应用程序、它不会生成数据中止。  它仅在我跳转到应用程序并位于要创建任务的部分时才起作用。

     我的应用的 sys_intvecs.asm 是:


    .ref _c_int00
    .REF vPortSWI
    .ref _dabort
    .REF 远程中断
    .def resetEntry

    优点:
    ;中断向量

    复位入口
    b _c_int00
    解除引用
    B 未定义入口
    B vPortSwi
    预取入口
    B 预取入口
    b _dabort (中止)
    反向中断
    LDR PC、[PC,#-0x1b0]
    LDR PC、[PC,#-0x1b0]

    我是否需要进行任何进一步更改? 当我跳转到应用程序并尝试创建任务时、就好像它找不到函数并跳转到第一个存储器位置。

    提前感谢

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

    您无需更改应用程序的 sys_intvec.asm。 如前所述、引导加载程序 sys_intvecs.asm 中的_dabort 应更改为#0x20020。  

    1.未更改 sys_intvecs.asm 中的_dabort:应用程序中的数据中止将导致软件跳转到错误的位置以执行中止处理程序

    2.如果将_dabort 更改为#0x20020,将无法正确处理引导加载程序中的数据中止。 因此、您需要确保您的引导加载程序中没有发生数据中止。 在 dabort 处理程序中的指令处添加断点、然后运行引导加载程序以确保没有发生数据中止。

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

    您好 QJ Wang。 很抱歉我的延迟。

    我有一个好消息。 我找到了解决方案!

    我尝试过以下向量:

    ;-------------------------------------------------------------------------------
    ; interrupt vectors
    
    resetEntry:
        b    _c_int00        ; Reset
        b    #0x20018        ; Undefined instruction
        b    #0x20018        ; Software interrupt (SWI / SVC)
        b    #0x20018        ; Abort (prefetch)
        b    _dabort         ; Abort (data)
        b    #0x20018        ; phantomInterrupt
        ldr  pc,[pc,#-0x1b0] ; IRQ
        ldr  pc,[pc,#-0x1b0] ; FIRQ
    

    理论上、偏移量始终是0x20020到应用矢量表中的相同位置。 而 PC 总是有 instr+8作为开始。

    现在它正在工作!! 我执行了以下步骤:

    1 -擦除整个闪存(含 UnityFlash)

    加载引导加载程序(称为 UPGRADE2)

    3-连接目标后、我加载应用程序(在0x20020位置)(无擦除闪存)

    4-点击了"run"、然后 CCS 开始运行应用程序、创建任务并运行调度程序。

    5 - Did 单击"Reset"按钮、电路板开始运行 Bootaloader。

    嗯、我还有一个问题。 引导加载程序中有以下代码。

    如果我发送 can_app 命令、应用程序将不起作用。 (我可以 在终端上看到" JUMP ")

    void main(void)
    
    {
    
        g_pulUpdateSuccess[3] = 0x30002019;  /*version number, 03.00, in 2019*/
        uint32_t ID, Bytes, ulCmd, fnRetValue = 0;
        uint8_t ucUpdateStatus, ucStatus;
        /* Initialize SCI Routines to receive Command and transmit data */
        sciInit();
    
        canInit();
    
        sciSend(scilinREG, 14, " MODE: SYSTEM ");
    
    
        do{
    
            ID = PacketRead(CAN_PORT, CommandBuffer, &Bytes);
    
    
            switch (ID)
            {
    
            case CAN_ALIVE:
                sciSend(scilinREG, 7, " ALIVE ");
            PacketWrite(CAN_PORT, CAN_ACK, &ucStatus, 1);
            break;
    
            case Bootloader:
                sciSend(scilinREG, 7, " BOOT ");
    
                /* Copy the flash APIs to SRAM*/
                //_copyAPI2RAM_(&apiLoadStart, &apiRunStart, &apiLoadSize);
                memcpy(&apiRunStart, &apiLoadStart, (uint32)&apiLoadSize);
    
                /* Copy the .const section */
                //_copyAPI2RAM_(&constLoadStart, &constRunStart, &constLoadSize);
                memcpy(&constRunStart, &constLoadStart, (uint32)&constLoadSize);
    
                UpdaterCAN(CAN_PORT);
    
                break;
    
            case CAN_APP:
            /*SALTO DE SYSTEM A LA APP NUEVA*/
                sciSend(scilinREG, 6, " JUMP ");
    
                 g_ulTransferAddress = (uint32_t)APP_START_ADDRESS;     //here doesnt work
                 ((void (*)(void))g_ulTransferAddress)();
    
                break;
    
            case RESET:
                sciSend(scilinREG, 7, " RESET ");
            PacketWrite(CAN_PORT, CAN_ACK, &ucStatus, 1);
    
            //
            // Perform a software reset request.  This will cause the
            // microcontroller to reset; no further code will be executed.
            //
            // Use the reset in SYSECR register.
            //
            systemREG1->SYSECR = (0x10) << 14;
            break;
    
            default:
                sciSend(scilinREG, 11, " FUNC DEFA ");
    
              //  PacketWrite(canREG1, CAN_PING, &status, 1);
                break;
    
    
            }
        }while((ID!=CAN_APP) || (ID!=Bootloader));
    
    }
    

    但是、如果我在代码的开头编写跳转行、则应用程序可以正常运行!!

    void main(void)
    
    {
    
        g_pulUpdateSuccess[3] = 0x30002019;  /*version number, 03.00, in 2019*/
        uint32_t ID, Bytes, ulCmd, fnRetValue = 0;
        uint8_t ucUpdateStatus, ucStatus;
        /* Initialize SCI Routines to receive Command and transmit data */
        sciInit();
    
        canInit();
    
        sciSend(scilinREG, 14, " MODE: SYSTEM ");
    
     //   sciSend(scilinREG, 5, " APP ");
               g_ulTransferAddress = (uint32_t)APP_START_ADDRESS;
               ((void (*)(void))g_ulTransferAddress)();             //HERE WORKS
    
    
        do{
    
            ID = PacketRead(CAN_PORT, CommandBuffer, &Bytes);
    
    
            switch (ID)
            {
    
            case CAN_ALIVE:
                sciSend(scilinREG, 7, " ALIVE ");
            PacketWrite(CAN_PORT, CAN_ACK, &ucStatus, 1);
            break;
            ...............
            etc...
            
    

    这是一个很好的例子。 谢谢你!!

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

    很高兴知道它。 谢谢