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.

[参考译文] RM44L920:系统启动中的闪存 CRC 计算

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1435993/rm44l920-flash-crc-calculation-in-sys-startup

器件型号:RM44L920

工具与软件:

您好!

我正在关注 SDL 演示应用程序、但我的项目也使用 FreeRTOS。 我不明白如何使用 sl_crc_Calculate ()函数,如何计算 ulFlashEndAddr ?

.cinit 和 ulFlashEndAddr 之间是否有某些连接?

    crcAtInit_FLASH = SL_CRC_Calculate((uint64 *)((uint32)&ulFlashStartAddr), ((((uint32)&ulFlashEndAddr)-((uint32)&ulFlashStartAddr)) >> 3));

这是我的链接器脚本。 是否需要更改链接器脚本中的某些内容?

/*----------------------------------------------------------------------------*/
/* sys_link_freeRTOS.cmd                                                      */
/*                                                                            */
/* 
* Copyright (C) 2009-2018 Texas Instruments Incorporated - www.ti.com  
* 
* 
*  Redistribution and use in source and binary forms, with or without 
*  modification, are permitted provided that the following conditions 
*  are met:
*
*    Redistributions of source code must retain the above copyright 
*    notice, this list of conditions and the following disclaimer.
*
*    Redistributions in binary form must reproduce the above copyright
*    notice, this list of conditions and the following disclaimer in the 
*    documentation and/or other materials provided with the   
*    distribution.
*
*    Neither the name of Texas Instruments Incorporated nor the names of
*    its contributors may be used to endorse or promote products derived
*    from this software without specific prior written permission.
*
*  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
*  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
*  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
*  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
*  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
*  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
*  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
*  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
*  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
*  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
*  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/

/*                                                                            */
/*----------------------------------------------------------------------------*/
/* USER CODE BEGIN (0) */
/* USER CODE END */
/*----------------------------------------------------------------------------*/
/* Linker Settings                                                            */

--retain="*(.intvecs)"

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

/*----------------------------------------------------------------------------*/
/* Memory Map                                                                 */

MEMORY
{
    VECTORS (X)  : origin=0x00000000 length=0x00000020
    KERNEL  (RX) : origin=0x00000020 length=0x00008000 
    FLASH0  (RX) : origin=0x00008020 length=0x000F7FE0
    STACKS  (RW) : origin=0x08000000 length=0x00001800
    KRAM    (RW) : origin=(0x08000000+0x00001800) length=0x00000800
    RAM     (RW) : origin=(0x08001800+0x00000800) length=(0x0001EB00 - 0x00001800)
    
/* 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   : {} > KERNEL
    .cinit        : {} > KERNEL
    .pinit        : {} > KERNEL
    .STACK_DATA_svc     : {. += 1024;} > STACKS, RUN_START(StackModeSVC)
    .STACK_DATA_fiq     : {. += 1024;} > STACKS, RUN_START(StackModeFIQ)
    .STACK_DATA_irq     : {. += 1024;} > STACKS, RUN_START(StackModeIRQ)
    .STACK_DATA_abt     : {. += 1024;} > STACKS, RUN_START(StackModeABT)
    .STACK_DATA_und     : {. += 1024;} > STACKS, RUN_START(StackModeUND)
    .STACK_DATA_sys     : {. += 1024;} > STACKS, RUN_START(StackModeSYS)
    /* Rest of code to user mode flash region */
    .text         : {} > FLASH0 
    .const        : {} > FLASH0 
    /* FreeRTOS Kernel data in protected region of RAM */
    .kernelBSS    : {} > KRAM
    .kernelHEAP   : {} > RAM
    .bss          : {} > RAM
    .data         : {} > RAM    
    .sysmem       : {} > RAM
    FEE_TEXT_SECTION : {} > FLASH0
    FEE_CONST_SECTION : {} > FLASH0
    FEE_DATA_SECTION : {} > RAM

/* USER CODE BEGIN (4) */

/* USER CODE END */
}

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

/*----------------------------------------------------------------------------*/
/* Misc                                                                       */

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

/*----------------------------------------------------------------------------*/

任何见解或示例都将非常有帮助!

谢谢、此致、

Ilija

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

    尊敬的  Ilija:

    ulFlashStartAddr 将从矢量起始地址开始、这是从闪存0x00000000的起始地址开始。

     ulFlashEndAddr 将位于.const 段的末尾:

    这意味着 ulFlashStartAddr 和 ulFlashEndAddr 由 except_vecs、 text 和 const 这三个段组成。

    因此、您可以用类似的方法尝试自己的项目。

    ——
    谢谢、此致、
    Jagadish。

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

    尊敬的 Jagadish:

    我已更新链接器脚本以与 SDL 演示应用程序保持一致、但我遇到了一些问题。

    您能否解释一下该.excpt_vecs部分的用途以及它与.intvecs该部分有何不同? 我注意到在 SDL 演示应用程序的.map文件中.excpt_vecs列为未初始化。 有具体原因吗?

    ******************************************************************************
                      TI ARM Linker PC v16.9.6                     
    ******************************************************************************
    >> Linked Wed Oct 02 16:56:38 2024
    
    OUTPUT FILE NAME:   <SL_RM44L920_NoOS.out>
    ENTRY POINT SYMBOL: "_c_int00"  address: 0000ca90
    
    
    MEMORY CONFIGURATION
    
             name            origin    length      used     unused   attr    fill
    ----------------------  --------  ---------  --------  --------  ----  --------
      VECTORS               00000000   00000020  00000020  00000000     X
      FLASH0                00000020   000fffe0  0000ed68  000f1278  R  X
      STACKS                08000000   00001800  00001800  00000000  RW  
      RAM                   08001800   0000ab00  0000059c  0000a564  RW  
      PROFILE               0800c300   00007d00  00000000  00007d00  RW  
      LOG                   08014000   00002000  00002000  00000000  RW    deadbeef 
      FEE                   f0200000   00000064  00000064  00000000  R     deadbeef 
    
    
    SEGMENT ALLOCATION MAP
    
    run origin  load origin   length   init length attrs members
    ----------  ----------- ---------- ----------- ----- -------
    00000000    00000000    0000ed88   0000ed88    r-x
      00000000    00000000    00000020   00000020    r-x .intvecs
      00000020    00000020    0000e2f8   0000e2f8    r-x .text
      0000e318    0000e318    000009b8   000009b8    r-- .const
      0000ecd0    0000ecd0    000000b8   000000b8    r-- .cinit
    08000000    08000000    00001800   00000000    r--
      08000000    08000000    00000400   00000000    r-- .STACK_DATA_abt
      08000400    08000400    00000400   00000000    r-- .STACK_DATA_fiq
      08000800    08000800    00000400   00000000    r-- .STACK_DATA_irq
      08000c00    08000c00    00000400   00000000    r-- .STACK_DATA_svc
      08001000    08001000    00000400   00000000    r-- .STACK_DATA_sys
      08001400    08001400    00000400   00000000    r-- .STACK_DATA_und
    08001800    08001800    0000059c   00000000    rw-
      08001800    08001800    000004fc   00000000    rw- .data
      08001cfc    08001cfc    000000a0   00000000    rw- .bss
    08014000    08014000    00002000   00002000    r--
      08014000    08014000    00002000   00002000    r-- $fill000
    f0200000    f0200000    00000064   00000064    r--
      f0200000    f0200000    00000064   00000064    r-- $fill001
    
    
    SECTION ALLOCATION MAP
    
     output                                  attributes/
    section   page    origin      length       input sections
    --------  ----  ----------  ----------   ----------------
    .excpt_vecs 
    *          0    00000000    00000000     UNINITIALIZED
    
    .intvecs   0    00000000    00000020     
                      00000000    00000020     sys_intvecs.obj (.intvecs)

    在我的项目中、ulFlashEndAddr以某种方式指向FEE_CONST_SECTION(0x0003d938)、而不是.const像在 SDL 演示应用程序中那样指向部分。

    这是我的.map 文件。

    ******************************************************************************
                      TI ARM Linker PC v20.2.7                     
    ******************************************************************************
    >> Linked Tue Nov 12 11:05:26 2024
    
    OUTPUT FILE NAME:   <aso_base_project_rm44L920pg.out>
    ENTRY POINT SYMBOL: "_c_int00"  address: 0003594c
    
    
    MEMORY CONFIGURATION
    
             name            origin    length      used     unused   attr    fill
    ----------------------  --------  ---------  --------  --------  ----  --------
      VECTORS               00000000   00000020  00000020  00000000     X
      KERNEL                00000020   00008000  00006910  000016f0  R  X
      FLASH0                00008020   000f7fe0  00035bd8  000c2408  R  X
      STACKS                08000000   00001800  00001800  00000000  RW  
      KRAM                  08001800   00000800  00000140  000006c0  RW  
      RAM                   08002000   0001d300  00006c04  000166fc  RW  
    
    
    SEGMENT ALLOCATION MAP
    
    run origin  load origin   length   init length attrs members
    ----------  ----------- ---------- ----------- ----- -------
    00000000    00000000    00006930   00006930    r-x
      00000000    00000000    00000020   00000020    r-x .intvecs
      00000020    00000020    00006490   00006490    r-x .kernelTEXT
      000064b0    000064b0    00000480   00000480    r-- .cinit
    00008020    00008020    00035bd8   00035bd8    r-x
      00008020    00008020    00031dd8   00031dd8    r-x .text
      00039df8    00039df8    00002f28   00002f28    r-x FEE_TEXT_SECTION
      0003cd20    0003cd20    00000cc8   00000cc8    r-- .const
      0003d9e8    0003d9e8    00000210   00000210    r-- FEE_CONST_SECTION
    08000000    08000000    00001800   00000000    r--
      08000000    08000000    00000400   00000000    r-- .STACK_DATA_abt
      08000400    08000400    00000400   00000000    r-- .STACK_DATA_fiq
      08000800    08000800    00000400   00000000    r-- .STACK_DATA_irq
      08000c00    08000c00    00000400   00000000    r-- .STACK_DATA_svc
      08001000    08001000    00000400   00000000    r-- .STACK_DATA_sys
      08001400    08001400    00000400   00000000    r-- .STACK_DATA_und
    08001800    08001800    00000140   00000000    rw-
      08001800    08001800    00000140   00000000    rw- .kernelBSS
    08002000    08002000    00006c09   00000000    rw-
      08002000    08002000    0000323d   00000000    rw- .bss
      0800523d    0800523d    00003000   00000000    rw- .kernelHEAP
      08008240    08008240    0000088a   00000000    rw- .data
      08008acc    08008acc    0000013d   00000000    rw- FEE_DATA_SECTION
    
    
    SECTION ALLOCATION MAP
    
     output                                  attributes/
    section   page    origin      length       input sections
    --------  ----  ----------  ----------   ----------------
    .intvecs   0    00000000    00000020     
                      00000000    00000020     sys_intvecs.obj (.intvecs)
    
    .excpt_vecs 
    *          0    00000000    00000000     UNINITIALIZED
    

    修改链接器脚本后、我现在会在启动期间遇到 ESM 组3错误、"ESM Status Register"0x00000040, and ESM Status Register 3 showing 0x00000080(ESM 状态寄存器1)显示。 有人知道为什么会发生这种情况吗? 与闪存 ECC 错误或有关 MPU 配置还是编译器优化?

    您能提供的任何见解都将非常感谢!

    谢谢、此致、

    Ilija

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

    尊敬的  Ilija:

    我的理解是:

    通常使用.intvecs 为中断向量制作表偏移量、如(resetEntry、undefEntry 等)

    在.intvecs 段创建该 表后、我们会将该表分配给从0x00000000开始的向量存储器。

    因此、通过这种方式 、resetEntry、 undefEntry 等的函数指针将移动到闪存的起始位置。

    即使我不明白为什么在 SDL 库中我们提到 excpt_vecs 而不是 intvecs 。 我也在我们使用 except_vecs 的代码中的其他任何位置看不到它。 我将与我的同事一起检查一下、他是否对此有任何想法。

    ——
    谢谢、此致、
    Jagadish。

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

    尊敬的 Jagadish:

    我将链接器命令文件更改如下所示。 问题是否可能是由内核部分造成的。 当我将 ulFlashStartAddr 从.intvecs 移动到.text 段时、没有 ESM 组3错误。

    这可能是我的问题的原因吗?

    MEMORY
    {
        VECTORS (X)  : origin=0x00000000 length=0x00000020
        KERNEL  (RX) : origin=0x00000020 length=0x00008000 
        FLASH0  (RX) : origin=0x00008020 length=0x000F7FE0
        STACKS  (RW) : origin=0x08000000 length=0x00001800
        KRAM    (RW) : origin=(0x08000000+0x00001800) length=0x00000800
        RAM     (RW) : origin=(0x08001800+0x00000800) length=(0x0001EB00 - 0x00001800)
        
    /* 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   : {} > KERNEL
        .cinit        : {} > KERNEL
        .pinit        : {} > KERNEL
        .STACK_DATA_svc     : {. += 1024;} > STACKS, RUN_START(StackModeSVC)
        .STACK_DATA_fiq     : {. += 1024;} > STACKS, RUN_START(StackModeFIQ)
        .STACK_DATA_irq     : {. += 1024;} > STACKS, RUN_START(StackModeIRQ)
        .STACK_DATA_abt     : {. += 1024;} > STACKS, RUN_START(StackModeABT)
        .STACK_DATA_und     : {. += 1024;} > STACKS, RUN_START(StackModeUND)
        .STACK_DATA_sys     : {. += 1024;} > STACKS, RUN_START(StackModeSYS)
        /* Rest of code to user mode flash region */
        .text         : START ( ulFlashStartAddr ) {} > FLASH0 
        .const        : {} > FLASH0 
        /* FreeRTOS Kernel data in protected region of RAM */
        .kernelBSS    : {} > KRAM
        .kernelHEAP   : {} > RAM
        .bss          : {} > RAM
        .data         : {} > RAM    
        .sysmem       : {} > RAM
        FEE_TEXT_SECTION : {} > FLASH0
        FEE_CONST_SECTION : END ( ulFlashEndAddr ) {} > FLASH0
        FEE_DATA_SECTION : {} > RAM
    
    /* USER CODE BEGIN (4) */
    
    /* USER CODE END */
    }

    我将.except_vecs 更改为.intvecs。

    谢谢、此致、

    Ilija。

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

    尊敬的 Ilija:

    [报价 userid="596210" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1435993/rm44l920-flash-crc-calculation-in-sys-startup/5518256 #5518256"]

    我将链接器命令文件更改如下所示。 问题是否可能是由内核部分造成的。 当我将 ulFlashStartAddr 从.intvecs 移动到.text 段时、没有 ESM 组3错误。

    这可能是我的问题的原因吗?

    [报价]

    可能是内核、因为我在 SDL 演示项目中看不到内核、因为它不是基于 FreeRTOS 构建的、并且 CRC 计算没有问题。

    ——
    谢谢、此致、
    Jagadish。

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

    尊敬的 Jagadish:

    在计算闪存的 CRC 以验证完整性时、该VECTORS部分是否应作为计算的一部分包含在计算中、或者是否可以在不影响 CRC 校验可靠性的情况下将其排除?

    谢谢、此致、

    Ilija。

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

    尊敬的  Ilija:

    我认为这只是一项应用要求。

    但在此 FreeRTOS 应用案例中、内核位于向量和文本部分之间。 在这种情况下、如果没有内核、则很难只包含向量和文本段、而且我们已经看到了包含内核的问题。

    也许最好在此处排除向量、否则我们可分别为向量和文本计算 CRC 的两部分。

    ——
    谢谢、此致、
    Jagadish。