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.

[参考译文] MSP430FR5994:使用8kB RAM

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1033896/msp430fr5994-use-8-kbyte-ram

器件型号:MSP430FR5994

您好!
我的软件需要超过4K 字节的 RAM。 不需要 LEA。 我想通过该程序使用 LEA 的 RAM。 遗憾的是、该 RAM 区域中发生了无法解释的内容更改。 我找到了这篇文章:">e2e.ti.com/.../msp430fr5994-can-i-combine-4kb-lea-ram-with-sram-into-a-single-8kb-block-of-ram"。 我能够扩展 RAM 区域。 在 CodeComposerStudio 中项目的属性中、我在 Build/MSP430-compiler/Predefined Simulss 中输入了以下内容:MSP_disable_LEA。 不幸的是,这没有帮助。 我是否必须直接关闭 LEA? 它到底是如何工作的?

最好的 Reagards
哈迪

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

    您好、Hardy、

    当 LEA 模块运行时、LEA 数据操作在8KB 总 RAM 中的共享4KB RAM 上执行

    LEA 的一些材料如下所示

    《低功耗加速器(LEA)命令参考指南》

    《低功耗加速器(LEA)寄存器参考指南》

    《低功耗加速器(LEA)通用参数块参考指南》

    如果您不使用 LEA RAM、 您可以 定义 RAM 长度并删除.CMD 文件中 LEA_RAM 的定义。  

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

    您好、Allen、

    感谢您的快速回复。 不幸的是、这并不能真正起到帮助作用。 我将尝试使用一个示例更详细地描述该问题。 这些步骤也显示在随附的视频中。 照片中显示了在项目设置中停用 LEA。 停用是否正确完成?

    在该示例中、项目堆栈位于 RAM 的上部4KB 段中。 显示了四个连续的写入操作、这些操作在堆栈中具有相同的机器指令、这些操作是为函数调用中的参数传输而执行的。 也可以看到 LEA 的第一个寄存器。 可以看出、第一个和第三个写入操作是有效的。 在执行第2次和第4次写入操作后、只能在堆栈上看到32位值的高位部分。 LO 部分所属的存储器单元不变。 因此、子程序会收到错误的值。 可以帮帮我吗? 我该怎么做才能使其正常工作?

    太棒了
    哈迪

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

    您好、Hardy、

    您可以尝试更改 .CMD 文件中的 RAM 长度并删除相关的 LEA RAM 信息。

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

    您好、Allen、

    是的、我这么做了。 我在上面的帖子中写道、它仍然不起作用。 指针的 Lo 部分有时不会写入栈中。 视频上的注释:您可以看到、在某一时刻、0x11被写入到堆栈中的次数为16次。 我手动执行此操作是为了显示通过 MOVA 命令有时只写入 Hi 部分(0x0000)并且 Lo 部分保持不变。 但 LO 部分在这里很重要。

    正在加润滑油
    哈迪

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

    您好、Hardy、

    您能否发布您的代码?

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

    您好、Allen、
    感谢你的帮助。
    该程序很长。 我无法发布完整的代码。 我将把帖子减少到显示错误的部分。 它是对子例程的调用。 子例程被传递4个指针。 指针存储在堆栈上。 将它们放在堆栈上不起作用。 在汇编器代码中最容易看到。 我描述了存储器和寄存器内容。

    1: 966   void savePosAndVelInSensors (float * lon、float * lat、unsigned int * alt、unsigned char * vel){
           savePosAndVelInSensors():  //这是函数的头
    2:042864:  00B1 0010          Suba   #0x00010、SP  // SP:0x003BD0
    3:042868:  0F71 000c          MOVA   R15、0x000c (SP)  // SP:0x003BC0、R15:0x002A60
    4:04286c:  0E71 0008          MOVA   R14、0x0008 (SP)  // R14:0x003BDE
    5:042870:  0D71 0004          MOVA   R13 0x0004 (SP)  // R13:0x003BDA
    6:042874:  0C71 0000          MOVA   R12、0x0000 (SP)  // R12:0x003BD6
    7: 968       itoha ((uint8_t*) lon、(uint8_t*)&sensors.lon[1]、4);  //这是函数内的第一行...
    8:042878:  008D 5383          MOVA   #0x05383、R13

    执行第2行后、我用手写入存储器:

    0x003BC0:11   11      11 11       11   11   11   11       11   11   11   11       11.
    存储器(堆栈)的变化如下:
    第3行之后:
    0x003BC0:11   11      11 11       11   11   11   11       11   11   11   11   00  00

    第4行之后:
    0x003BC0:11   11      11 11       11   11   11   11   11   00    11      11 00  00 00

    第5行之后:
    0x003BC0:11      11      11 DA  3B  00    11      00      11 00 11      00  00

    第6行之后:
    0x003BC0:11      00    00 DA  3B  00    11      00      11 00 11   00 11   00  00 00

    可以看出、在这种尝试中、寄存器15、14和12的内容没有完全到达堆栈。 只有寄存器13的内容被完全写入堆栈。 在其他尝试中、会写入其他寄存器、而其他寄存器不会写入。

    LEACNF0的内容为0x00000001。 程序段不会被中断中断。 我可以在视频会议中展示这种现象。

    是否可以检查 DMA 目标地址的内容在那个特定的时间是什么? DMA 写入另一个 RAM 区域是否可能会阻止 CPU 写入?

    我可以通过不通过栈传递参数来解决该问题。 但是、我不知道程序是否在其他地方不稳定。 这就是为什么我认为找到原因很重要的原因。

    格雷蒂格斯
    哈迪

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

    您好、Allen、
    感谢你的帮助。
    该程序很长。 我无法发布完整的代码。 我将把帖子减少到显示错误的部分。 它是对子例程的调用。 子例程被传递4个指针。 指针存储在堆栈上。 将它们放在堆栈上不起作用。 在汇编器代码中最容易看到。 我描述了存储器和寄存器内容。

    1: 966   void savePosAndVelInSensors (float * lon、float * lat、unsigned int * alt、unsigned char * vel){
           savePosAndVelInSensors():  //这是函数的头
    2:042864:  00B1 0010          Suba   #0x00010、SP  // SP:0x003BD0
    3:042868:  0F71 000c          MOVA   R15、0x000c (SP)  // SP:0x003BC0、R15:0x002A60
    4:04286c:  0E71 0008          MOVA   R14、0x0008 (SP)  // R14:0x003BDE
    5:042870:  0D71 0004          MOVA   R13 0x0004 (SP)  // R13:0x003BDA
    6:042874:  0C71 0000          MOVA   R12、0x0000 (SP)  // R12:0x003BD6
    7: 968       itoha ((uint8_t*) lon、(uint8_t*)&sensors.lon[1]、4);  //这是函数内的第一行...
    8:042878:  008D 5383          MOVA   #0x05383、R13

    执行第2行后、我用手写入存储器:

    0x003BC0:11   11      11 11       11   11   11   11       11   11   11   11       11.
    存储器(堆栈)的变化如下:
    第3行之后:
    0x003BC0:11   11      11 11       11   11   11   11       11   11   11   11   00  00

    第4行之后:
    0x003BC0:11   11      11 11       11   11   11   11   11   00    11      11 00  00 00

    第5行之后:
    0x003BC0:11      11      11 DA  3B  00    11      00      11 00 11      00  00

    第6行之后:
    0x003BC0:11      00    00 DA  3B  00    11      00      11 00 11   00 11   00  00 00

    可以看出、在这种尝试中、寄存器15、14和12的内容没有完全到达堆栈。 只有寄存器13的内容被完全写入堆栈。 在其他尝试中、会写入其他寄存器、而其他寄存器不会写入。

    LEACNF0的内容为0x00000001。 程序段不会被中断中断。 我可以在视频会议中展示这种现象。

    是否可以检查 DMA 目标地址的内容在那个特定的时间是什么? DMA 写入另一个 RAM 区域是否可能会阻止 CPU 写入?

    我可以通过不通过栈传递参数来解决该问题。 但是、我不知道程序是否在其他地方不稳定。 这就是为什么我认为找到原因很重要的原因。

    编辑:

    我注意到与 DMA 通道的连接。 这由一个 UART 触发并将接收到的字节写入另一个 RAM 区域。 这种写操作有效。 如果我在执行上面的第3、4、5和6行期间禁用此控制器、则执行第3、4、5和6行的 MOVA 命令将起作用。
    但是、需要 DMA 操作。
    如何确保堆栈操作正常工作?

    格雷蒂格斯
    哈迪

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

    你(们)好、哈迪

    修改.cmd 文件、这样可将 RAM 扩展到8K 并 删除所有 LEA 信息

    /******************************************************************************
    *
    * Copyright (C) 2012 - 2020 Texas Instruments Incorporated - http://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.
    *
    * Default linker command file for Texas Instruments MSP430FR5994
    *
    *****************************************************************************/
    
    /******************************************************************************/
    /*                                                                            */
    /*   Usage:  lnk430 <obj files...>    -o <out file> -m <map file> lnk.cmd     */
    /*           cl430  <src files...> -z -o <out file> -m <map file> lnk.cmd     */
    /*                                                                            */
    /*----------------------------------------------------------------------------*/
    /* These linker options are for command line linking only.  For IDE linking,  */
    /* you should set your linker options in Project Properties                   */
    /* -c                                               LINK USING C CONVENTIONS  */
    /* -stack  0x0100                                   SOFTWARE STACK SIZE       */
    /* -heap   0x0100                                   HEAP AREA SIZE            */
    /*                                                                            */
    /*----------------------------------------------------------------------------*/
    /* 1.209 */
    /*----------------------------------------------------------------------------*/
    
    /****************************************************************************/
    /* SPECIFY THE SYSTEM MEMORY MAP                                            */
    /****************************************************************************/
    
    MEMORY
    {
        TINYRAM                 : origin = 0xA, length = 0x16
        BSL                     : origin = 0x1000, length = 0x800
        INFOD                   : origin = 0x1800, length = 0x80
        INFOC                   : origin = 0x1880, length = 0x80
        INFOB                   : origin = 0x1900, length = 0x80
        INFOA                   : origin = 0x1980, length = 0x80
        RAM                     : origin = 0x1C00, length = 0x2000
        FRAM                    : origin = 0x4000, length = 0xBF80
        FRAM2                   : origin = 0x10000,length = 0x34000
        JTAGSIGNATURE           : origin = 0xFF80, length = 0x0004, fill = 0xFFFF
        BSLSIGNATURE            : origin = 0xFF84, length = 0x0004, fill = 0xFFFF
        IPESIGNATURE            : origin = 0xFF88, length = 0x0008, fill = 0xFFFF
        INT00                   : origin = 0xFF90, length = 0x0002
        INT01                   : origin = 0xFF92, length = 0x0002
        INT02                   : origin = 0xFF94, length = 0x0002
        INT03                   : origin = 0xFF96, length = 0x0002
        INT04                   : origin = 0xFF98, length = 0x0002
        INT05                   : origin = 0xFF9A, length = 0x0002
        INT06                   : origin = 0xFF9C, length = 0x0002
        INT07                   : origin = 0xFF9E, length = 0x0002
        INT08                   : origin = 0xFFA0, length = 0x0002
        INT09                   : origin = 0xFFA2, length = 0x0002
        INT10                   : origin = 0xFFA4, length = 0x0002
        INT11                   : origin = 0xFFA6, length = 0x0002
        INT12                   : origin = 0xFFA8, length = 0x0002
        INT13                   : origin = 0xFFAA, length = 0x0002
        INT14                   : origin = 0xFFAC, length = 0x0002
        INT15                   : origin = 0xFFAE, length = 0x0002
        INT16                   : origin = 0xFFB0, length = 0x0002
        INT17                   : origin = 0xFFB2, length = 0x0002
        INT18                   : origin = 0xFFB4, length = 0x0002
        INT19                   : origin = 0xFFB6, length = 0x0002
        INT20                   : origin = 0xFFB8, length = 0x0002
        INT21                   : origin = 0xFFBA, length = 0x0002
        INT22                   : origin = 0xFFBC, length = 0x0002
        INT23                   : origin = 0xFFBE, length = 0x0002
        INT24                   : origin = 0xFFC0, length = 0x0002
        INT25                   : origin = 0xFFC2, length = 0x0002
        INT26                   : origin = 0xFFC4, length = 0x0002
        INT27                   : origin = 0xFFC6, length = 0x0002
        INT28                   : origin = 0xFFC8, length = 0x0002
        INT29                   : origin = 0xFFCA, length = 0x0002
        INT30                   : origin = 0xFFCC, length = 0x0002
        INT31                   : origin = 0xFFCE, length = 0x0002
        INT32                   : origin = 0xFFD0, length = 0x0002
        INT33                   : origin = 0xFFD2, length = 0x0002
        INT34                   : origin = 0xFFD4, length = 0x0002
        INT35                   : origin = 0xFFD6, length = 0x0002
        INT36                   : origin = 0xFFD8, length = 0x0002
        INT37                   : origin = 0xFFDA, length = 0x0002
        INT38                   : origin = 0xFFDC, length = 0x0002
        INT39                   : origin = 0xFFDE, length = 0x0002
        INT40                   : origin = 0xFFE0, length = 0x0002
        INT41                   : origin = 0xFFE2, length = 0x0002
        INT42                   : origin = 0xFFE4, length = 0x0002
        INT43                   : origin = 0xFFE6, length = 0x0002
        INT44                   : origin = 0xFFE8, length = 0x0002
        INT45                   : origin = 0xFFEA, length = 0x0002
        INT46                   : origin = 0xFFEC, length = 0x0002
        INT47                   : origin = 0xFFEE, length = 0x0002
        INT48                   : origin = 0xFFF0, length = 0x0002
        INT49                   : origin = 0xFFF2, length = 0x0002
        INT50                   : origin = 0xFFF4, length = 0x0002
        INT51                   : origin = 0xFFF6, length = 0x0002
        INT52                   : origin = 0xFFF8, length = 0x0002
        INT53                   : origin = 0xFFFA, length = 0x0002
        INT54                   : origin = 0xFFFC, length = 0x0002
        RESET                   : origin = 0xFFFE, length = 0x0002
    }
    
    /****************************************************************************/
    /* Specify the LEA memory map                                               */
    /****************************************************************************/
    
    //#define LEASTACK_SIZE   0x138
    
    //MEMORY
    //{
    //    LEARAM                  : origin = 0x2C00, length = 0x1000 - LEASTACK_SIZE
    //    LEASTACK                : origin = 0x3C00 - LEASTACK_SIZE, length = LEASTACK_SIZE
    //}
    
    /****************************************************************************/
    /* SPECIFY THE SECTIONS ALLOCATION INTO MEMORY                              */
    /****************************************************************************/
    
    SECTIONS
    {
        GROUP(RW_IPE)
        {
    
            GROUP(READ_WRITE_MEMORY)
            {
    
                .TI.persistent : {}              /* For #pragma persistent            */
                .cio           : {}              /* C I/O Buffer                      */
                .sysmem        : {}              /* Dynamic memory allocation area    */
            } PALIGN(0x0400), RUN_START(fram_rw_start)
    
            GROUP(IPENCAPSULATED_MEMORY)
            {
    
                .ipestruct     : {}              /* IPE Data structure             */
                .ipe           : {}              /* IPE                            */
                .ipe_const     : {}              /* IPE Protected constants        */
                .ipe:_isr      : {}              /* IPE ISRs                       */
            } PALIGN(0x0400), RUN_START(fram_ipe_start) RUN_END(fram_ipe_end) RUN_END(fram_rx_start)
    
        } > 0x4000
    
        .cinit            : {}  > FRAM          /* Initialization tables             */
        .binit            : {}  > FRAM          /* Boot-time Initialization tables   */
        .pinit            : {}  > FRAM          /* C++ Constructor tables            */
        .init_array       : {}  > FRAM          /* C++ Constructor tables            */
        .mspabi.exidx     : {}  > FRAM          /* C++ Constructor tables            */
        .mspabi.extab     : {}  > FRAM          /* C++ Constructor tables            */
        .text:_isr        : {}  > FRAM          /* Code ISRs                         */
    
    #ifndef __LARGE_DATA_MODEL__
        .const            : {} > FRAM           /* Constant data                     */
    #else
        .const            : {} >> FRAM | FRAM2  /* Constant data                     */
    #endif
    
    #ifndef __LARGE_CODE_MODEL__
        .text             : {} > FRAM           /* Code                              */
    #else
        .text             : {} >> FRAM2 | FRAM  /* Code                              */
    #endif
    
        #ifdef __TI_COMPILER_VERSION__
            #if __TI_COMPILER_VERSION__ >= 15009000
                #ifndef __LARGE_CODE_MODEL__
                    .TI.ramfunc : {} load=FRAM, run=RAM, table(BINIT)
                #else
                    .TI.ramfunc : {} load=FRAM | FRAM2, run=RAM, table(BINIT)
                #endif
            #endif
        #endif
    
        .jtagsignature      : {} > JTAGSIGNATURE
        .bslsignature       : {} > BSLSIGNATURE
    
        GROUP(SIGNATURE_SHAREDMEMORY)
        {
            .ipesignature       : {}            /* IPE Signature                     */
            .jtagpassword       : {}            /* JTAG Password                     */
        } > IPESIGNATURE
    
        .bss        : {} > RAM                  /* Global & static vars              */
        .data       : {} > RAM                  /* Global & static vars              */
        .TI.noinit  : {} > RAM                  /* For #pragma noinit                */
        .stack      : {} > RAM (HIGH)           /* Software system stack             */
    
        .tinyram    : {} > TINYRAM              /* Tiny RAM                          */
    
        /* MSP430 INFO memory segments */
        .infoA : type = NOINIT{} > INFOA
        .infoB : type = NOINIT{} > INFOB
        .infoC : type = NOINIT{} > INFOC
        .infoD : type = NOINIT{} > INFOD
    
    
    //    .leaRAM      : {} > LEARAM               /* LEA RAM                           */
    //    .leaStack    : {} > LEASTACK (HIGH)      /* LEA STACK                         */
    
        /* MSP430 interrupt vectors */
    
        .int00       : {}               > INT00
        .int01       : {}               > INT01
        .int02       : {}               > INT02
        .int03       : {}               > INT03
        .int04       : {}               > INT04
        .int05       : {}               > INT05
        .int06       : {}               > INT06
        .int07       : {}               > INT07
        .int08       : {}               > INT08
        .int09       : {}               > INT09
        .int10       : {}               > INT10
        .int11       : {}               > INT11
        .int12       : {}               > INT12
        .int13       : {}               > INT13
        .int14       : {}               > INT14
        .int15       : {}               > INT15
        .int16       : {}               > INT16
        .int17       : {}               > INT17
        LEA          : { * ( .int18 ) } > INT18 type = VECT_INIT
        PORT8        : { * ( .int19 ) } > INT19 type = VECT_INIT
        PORT7        : { * ( .int20 ) } > INT20 type = VECT_INIT
        EUSCI_B3     : { * ( .int21 ) } > INT21 type = VECT_INIT
        EUSCI_B2     : { * ( .int22 ) } > INT22 type = VECT_INIT
        EUSCI_B1     : { * ( .int23 ) } > INT23 type = VECT_INIT
        EUSCI_A3     : { * ( .int24 ) } > INT24 type = VECT_INIT
        EUSCI_A2     : { * ( .int25 ) } > INT25 type = VECT_INIT
        PORT6        : { * ( .int26 ) } > INT26 type = VECT_INIT
        PORT5        : { * ( .int27 ) } > INT27 type = VECT_INIT
        TIMER4_A1    : { * ( .int28 ) } > INT28 type = VECT_INIT
        TIMER4_A0    : { * ( .int29 ) } > INT29 type = VECT_INIT
        AES256       : { * ( .int30 ) } > INT30 type = VECT_INIT
        RTC_C        : { * ( .int31 ) } > INT31 type = VECT_INIT
        PORT4        : { * ( .int32 ) } > INT32 type = VECT_INIT
        PORT3        : { * ( .int33 ) } > INT33 type = VECT_INIT
        TIMER3_A1    : { * ( .int34 ) } > INT34 type = VECT_INIT
        TIMER3_A0    : { * ( .int35 ) } > INT35 type = VECT_INIT
        PORT2        : { * ( .int36 ) } > INT36 type = VECT_INIT
        TIMER2_A1    : { * ( .int37 ) } > INT37 type = VECT_INIT
        TIMER2_A0    : { * ( .int38 ) } > INT38 type = VECT_INIT
        PORT1        : { * ( .int39 ) } > INT39 type = VECT_INIT
        TIMER1_A1    : { * ( .int40 ) } > INT40 type = VECT_INIT
        TIMER1_A0    : { * ( .int41 ) } > INT41 type = VECT_INIT
        DMA          : { * ( .int42 ) } > INT42 type = VECT_INIT
        EUSCI_A1     : { * ( .int43 ) } > INT43 type = VECT_INIT
        TIMER0_A1    : { * ( .int44 ) } > INT44 type = VECT_INIT
        TIMER0_A0    : { * ( .int45 ) } > INT45 type = VECT_INIT
        ADC12_B      : { * ( .int46 ) } > INT46 type = VECT_INIT
        EUSCI_B0     : { * ( .int47 ) } > INT47 type = VECT_INIT
        EUSCI_A0     : { * ( .int48 ) } > INT48 type = VECT_INIT
        WDT          : { * ( .int49 ) } > INT49 type = VECT_INIT
        TIMER0_B1    : { * ( .int50 ) } > INT50 type = VECT_INIT
        TIMER0_B0    : { * ( .int51 ) } > INT51 type = VECT_INIT
        COMP_E       : { * ( .int52 ) } > INT52 type = VECT_INIT
        UNMI         : { * ( .int53 ) } > INT53 type = VECT_INIT
        SYSNMI       : { * ( .int54 ) } > INT54 type = VECT_INIT
        .reset       : {}               > RESET  /* MSP430 reset vector         */
    
    }
    /****************************************************************************/
    /* MPU/IPE SPECIFIC MEMORY SEGMENT DEFINITONS                               */
    /****************************************************************************/
    
    #ifdef _IPE_ENABLE
        #define IPE_MPUIPLOCK 0x0080
        #define IPE_MPUIPENA 0x0040
        #define IPE_MPUIPPUC 0x0020
    
        // Evaluate settings for the control setting of IP Encapsulation
        #if defined(_IPE_ASSERTPUC1)
            #if defined(_IPE_LOCK ) && (_IPE_ASSERTPUC1 == 0x08))
                fram_ipe_enable_value = (IPE_MPUIPENA | IPE_MPUIPPUC |IPE_MPUIPLOCK);
            #elif defined(_IPE_LOCK )
                fram_ipe_enable_value = (IPE_MPUIPENA | IPE_MPUIPLOCK);
            #elif (_IPE_ASSERTPUC1 == 0x08)
                fram_ipe_enable_value = (IPE_MPUIPENA | IPE_MPUIPPUC);
            #else
                fram_ipe_enable_value = (IPE_MPUIPENA);
            #endif
        #else
            #if defined(_IPE_LOCK )
                fram_ipe_enable_value = (IPE_MPUIPENA | IPE_MPUIPLOCK);
            #else
                fram_ipe_enable_value = (IPE_MPUIPENA);
            #endif
        #endif
    
        // Segment definitions
        #ifdef _IPE_MANUAL                  // For custom sizes selected in the GUI
            fram_ipe_border1 = (_IPE_SEGB1>>4);
            fram_ipe_border2 = (_IPE_SEGB2>>4);
        #else                           // Automated sizes generated by the Linker
            fram_ipe_border2 = fram_ipe_end >> 4;
            fram_ipe_border1 = fram_ipe_start >> 4;
        #endif
    
        fram_ipe_settings_struct_address = Ipe_settingsStruct >> 4;
        fram_ipe_checksum = ~((fram_ipe_enable_value & fram_ipe_border2 & fram_ipe_border1) | (fram_ipe_enable_value & ~fram_ipe_border2 & ~fram_ipe_border1) | (~fram_ipe_enable_value & fram_ipe_border2 & ~fram_ipe_border1) | (~fram_ipe_enable_value & ~fram_ipe_border2 & fram_ipe_border1));
    #endif
    
    #ifdef _MPU_ENABLE
        #define MPUPW (0xA500)    /* MPU Access Password */
        #define MPUENA (0x0001)   /* MPU Enable */
        #define MPULOCK (0x0002)  /* MPU Lock */
        #define MPUSEGIE (0x0010) /* MPU Enable NMI on Segment violation */
    
        __mpu_enable = 1;
        // Segment definitions
        #ifdef _MPU_MANUAL // For custom sizes selected in the GUI
            mpu_segment_border1 = _MPU_SEGB1 >> 4;
            mpu_segment_border2 = _MPU_SEGB2 >> 4;
            mpu_sam_value = (_MPU_SAM0 << 12) | (_MPU_SAM3 << 8) | (_MPU_SAM2 << 4) | _MPU_SAM1;
        #else // Automated sizes generated by Linker
            #ifdef _IPE_ENABLE //if IPE is used in project too
            //seg1 = any read + write persistent variables
            //seg2 = ipe = read + write + execute access
            //seg3 = code, read + execute only
        	       mpu_segment_border1 = fram_ipe_start >> 4;
        	       mpu_segment_border2 = fram_rx_start >> 4;
        	       mpu_sam_value = 0x1573; // Info R, Seg3 RX, Seg2 RWX, Seg1 RW
            #else
        	       mpu_segment_border1 = fram_rx_start >> 4;
        	       mpu_segment_border2 = fram_rx_start >> 4;
        	       mpu_sam_value = 0x1513; // Info R, Seg3 RX, Seg2 R, Seg1 RW
            #endif
        #endif
        #ifdef _MPU_LOCK
            #ifdef _MPU_ENABLE_NMI
                mpu_ctl0_value = MPUPW | MPUENA | MPULOCK | MPUSEGIE;
            #else
                mpu_ctl0_value = MPUPW | MPUENA | MPULOCK;
            #endif
        #else
            #ifdef _MPU_ENABLE_NMI
                mpu_ctl0_value = MPUPW | MPUENA | MPUSEGIE;
            #else
                mpu_ctl0_value = MPUPW | MPUENA;
            #endif
        #endif
    #endif
    
    /****************************************************************************/
    /* INCLUDE PERIPHERALS MEMORY MAP                                           */
    /****************************************************************************/
    
    -l msp430fr5994.cmd
    
    
    

    测试通过定义大型数组、您可以在编译后看到.map 文件。 RAM 为8K、使用频率为1fe2  

    ******************************************************************************
                      MSP430 Linker PC v20.2.0                     
    ******************************************************************************
    >> Linked Wed Sep 15 19:30:39 2021
    
    OUTPUT FILE NAME:   <MSP430FR5994.out>
    ENTRY POINT SYMBOL: "_c_int00_noargs_mpu"  address: 00004000
    
    
    MEMORY CONFIGURATION
    
             name            origin    length      used     unused   attr    fill
    ----------------------  --------  ---------  --------  --------  ----  --------
      TINYRAM               0000000a   00000016  00000000  00000016  RWIX
      BSL                   00001000   00000800  00000000  00000800  RWIX
      INFOD                 00001800   00000080  00000000  00000080  RWIX
      INFOC                 00001880   00000080  00000000  00000080  RWIX
      INFOB                 00001900   00000080  00000000  00000080  RWIX
      INFOA                 00001980   00000080  00000000  00000080  RWIX
      RAM                   00001c00   00002000  00001fe2  0000001e  RWIX
      FRAM                  00004000   0000bf80  00000042  0000bf3e  RWIX
      JTAGSIGNATURE         0000ff80   00000004  00000004  00000000  RWIX  ffff 
      BSLSIGNATURE          0000ff84   00000004  00000004  00000000  RWIX  ffff 
      IPESIGNATURE          0000ff88   00000008  00000008  00000000  RWIX  ffff 
      INT00                 0000ff90   00000002  00000000  00000002  RWIX
      INT01                 0000ff92   00000002  00000000  00000002  RWIX
      INT02                 0000ff94   00000002  00000000  00000002  RWIX
      INT03                 0000ff96   00000002  00000000  00000002  RWIX

    您可以尝试一下。 如果您有其他问题、您可以提交新的 TT。

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

    您好、Allen、

    我在测试之前进行了建议的设置。 结果是链接器在 RAM 中使用了高位地址范围。 这可以在我上一个帖子中堆栈指针和寄存器12、13和14的显示值中看到。 问题是:为什么只有寄存器的 HI 部分被写入 RAM? 为什么这种情况只会发生、而不是在同一个 C 代码行中执行每个写入操作?

    根据要求、我将开一个有关此问题的新 TT。

    太棒了
    哈迪

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

    您好、Hardy、

    我将关闭此 TT。

    谢谢。

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

    我上次的测试显示问题是由于在某些情况下不正确执行机器命令所致。 它也出现在较低的 RAM 范围内。 因此它不能是 LEA。 如果你关闭这个票,这是可以的。

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

    您好 Hardy,

    感谢您使用 MSP430和 E2E。