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.

[参考译文] MSP430F6659:MSP430F6659 SRAM 的所有扇区的利用率

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1033979/msp430f6659-utilization-of-all-sectors-of-msp430f6659-sram

器件型号:MSP430F6659

您好!

在 MSP430F6659中、SRAM 分为4个扇区、每个扇区为16KB。 我们发现、64KB 中只有48KB 可用于应用。 扇区0对应用程序不可用。  

我在 IAR 中为 MSP430F6659创建了一个空白项目、并声明了一个48KB 的静态变量数组(uint8的数组长度为49152)。 我在 while (1)中使用了该数组。

编译后出现以下错误。

ERROR[E16]:段 DATA20_Z (大小:0xdc00对齐:0x1)对于段定义而言太长。 至少需要更多0x1c00字节。 处理句段放置命令时出现问题
"-Z (data) DATA20_I、DATA20_Z、DATA20_N、DATA20_heap+_DATA20_heap_size=2400-63FF、F0000-FBFFF"、 
在放置时、可用存储器范围为"代码:2400-5bff、代码:f0000-Fbfff"
与此放置相关的保留范围:
2400-5bff DATA20_I
5c00-63ff CSTACK
F0000-Fbfff DATA20_I

构建结果是、

56字节代码存储器
49 152字节数据存储器(+ 10字节共享)

在 IAR 设置中、我将堆栈大小保持在2048、并且存储器模型很大。  

如何为应用使用扇区0 RAM?

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

    Amit、您好!

    RAM 的每个扇区都可以独立控制。 您可以通过控制 RCCTL 寄存器来启用每个扇区。

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

    您好、Allen、

     复位后所有扇区打开。 我尚未配置  RCCTL0的任何位。

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

    Amit、您好!

    您能否显示代码?

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

    //#include <libfixmath.h>
    #include <math.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <msp430f6659.h>
    #include <stdint.h>
    #include "main.h"
    
    // Disable Watchdog
    #define DisableWatchdog()        (WDTCTL = WDTPW | WDTHOLD)
    
    //Temporary static buffer of size 48KB = 48 * 1024 = 49152
    static uint8_t u8Temp[49152];
    uint32_t u32Count;
    
    int main( void )
    {
      /*Clock initialization*/
      DisableWatchdog();
      while(BAKCTL & LOCKBAK)                   // Unlock XT1 pins for operation
        BAKCTL &= ~(LOCKBAK);
      UCSCTL6 &= ~(XT1OFF);                     // XT1 On
      UCSCTL6 |= XCAP_3;                        // Internal load cap
      do
      {
        UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG);
        SFRIFG1 &= ~OFIFG;                     // Clear fault flags
      }while (SFRIFG1&OFIFG);                 // Test oscillator fault flag
      
      
      while(1)
      {
        /*This loop fills the u8Temp[]*/
        for(u32Count = 0; u32Count < 49153; u32Count++)
        {
          u8Temp[0] = u32Count;
        }
      }
    }
    

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

    您好 Amit,

    u8Temp 为48k、u32count 为4字节。 总和大于最大扇区 RAM2 (48K)

    您可以更改.cmd 文件来定义 RAM 大小。 在原始文件中、RAM 为16K、RAM2为48K。 您可以为64K 连续地址 RAM 重新定义0xf0000大小0x10000的 RAM。删除.cmd 文件中的 RMA2定义。

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

    // ************************************************
    //
    // XLINK configuration file for MSP430F6659
    //
    // Copyright 1996-2018 IAR Systems AB.
    //
    // See the file 430/doc/licenses/IARSourceLicense.txt for detailed
    // license information.
    //
    // $Revision: $
    //
    // ************************************************
    
    // ---------------------------------------------------------
    // Description
    //
    
    //
    // Usage:
    //
    //   xlink [file file ...] -f lnk430f6659.xcl
    //
    // -----------------------------------------------
    // Device summary
    //
    
    //
    // Core:                               MSP430Xv2
    //
    // Special vectors:                    64
    //
    // Peripheral units:                   00100-00FFF
    //
    // Information memory (FLASH):         01800-019FF
    //
    // Read/write memory (RAM):            02400-063FF
    //                                 F0000-FBFFF
    //
    // Read/write memory (USBRAM):         01C00-023FF
    //
    // Read-only memory (FLASH):           08000-0FFFF
    //                                 10000-87FFF
    //
    // Mirrored RAM: 02400-063FF mirrored at FC000-FFFFF
    
    
    // -----------------------------------------------
    // Segments
    //
    
    // -------------------------------------
    // Data read/write segments (RAM)
    //
    
    //
    // The following segments are available for both
    // the DATA16 and DATA20 segment groups.
    //
    // segment         Usage
    // -------         --------------------------
    // DATA<nn>_Z      Data initialized to zero
    // DATA<nn>_I      Data initialized by copying from DATA<nn>_ID
    // DATA<nn>_N      Data defined using __no_init
    // DATA<nn>_HEAP   The heap used by 'malloc' and 'free'
    //
    // segment         Usage
    // -------         --------------------------
    // CSTACK          Runtime stack
    // TLS16_I         Thread-local storage for main thread
    //
    
    
    // -------------------------------------
    // Program and data read-only segments (FLASH)
    //
    
    //
    // The following segments are available for both
    // the DATA16 and DATA20 segment groups.
    //
    // segment         Usage
    // -------         --------------------------
    // DATA<nn>_C      Constant data, including string literals
    // DATA<nn>_ID     Initializers for DATA<nn>_I
    //
    // segment         Usage
    // -------         --------------------------
    // INFO            Information memory
    // INFOA           Information memory, bank A
    // INFOB           Information memory, bank B
    // INFOC           Information memory, bank C
    // INFOD           Information memory, bank D
    // CSTART          Program startup code
    // CODE            Program code
    // ISR_CODE        Program code for interrupt service routines
    // DIFUNCT         Dynamic initialization vector used by C++
    // CHECKSUM        Checksum byte(s) generated by the -J option
    // INTVEC          Interrupt vectors
    // RESET           The reset vector
    // TLS16_ID        Thread-local initializers for main thread
    //
    // Notes:
    //
    // * The segments CSTART, ISR_CODE, and DIFUNCT, as well as the segments in
    //   the DATA16 and TLS16 segment groups must be placed in in the range
    //   0000-FFFD.
    //
    // * The INFOx and INFO segments overlap, this allows data either to be
    //   placed in a specific bank or anywhere in the info memory.
    //
    // * The INTVEC and RESET segments overlap. This allows an application to
    //   either use the reset vector provided by the runtime library, or
    //   provide a reset function by defining an interrupt function associated
    //   with the reset vector.
    //
    
    
    // ---------------------------------------------------------
    // Configuation
    //
    
    // -----------------------------------------------
    // Stack and heap sizes
    //
    
    // Uncomment for command line use
    //-D_STACK_SIZE=160
    //-D_DATA16_HEAP_SIZE=160
    //-D_DATA20_HEAP_SIZE=160
    
    
    // -----------------------------------------------
    // Define cpu
    //
    
    -cmsp430
    
    
    // -----------------------------------------------
    // Address sharing for mirrored memory ranges
    //
    
    -U2400-63FF=FC000-FFFFF
    
    
    // -----------------------------------------------
    // Support for placing functions in read/write memory
    //
    
    -QCODE_I=CODE_ID
    
    
    // -----------------------------------------------
    // Support for thread local storage
    //
    
    -QTLS16_I=TLS16_ID
    
    
    // -----------------------------------------------
    // Hardware multiplier location
    //
    
    -D__iar_HWMUL=4C0
    
    
    // ---------------------------------------------------------
    // Placement directives
    //
    
    // -----------------------------------------------
    // Information memory
    //
    
    -Z(CONST)INFO=1800-19FF
    -Z(CONST)INFOA=1980-19FF
    -Z(CONST)INFOB=1900-197F
    -Z(CONST)INFOC=1880-18FF
    -Z(CONST)INFOD=1800-187F
    
    
    // -----------------------------------------------
    // RAM memory
    //
    
    -Z(DATA)USBRAM=1C00-23FF
    -Z(DATA)DATA16_I,DATA16_Z,DATA16_N,TLS16_I=2400-63FF
    -Z(DATA)DATA16_HEAP+_DATA16_HEAP_SIZE
    -Z(DATA)CODE_I
    -Z(DATA)CSTACK+_STACK_SIZE#
    -Z(DATA)DATA20_I,DATA20_Z,DATA20_N,DATA20_HEAP+_DATA20_HEAP_SIZE=2400-63FF,F0000-FBFFF
    
    
    // -----------------------------------------------
    // Read-only memory
    //
    
    // -------------------------------------
    // Low memory 0-0FFFF
    //
    
    // ---------------------------
    // Constant data
    //
    
    -Z(CONST)DATA16_C,DATA16_ID,TLS16_ID,DIFUNCT,CHECKSUM=8000-FF7F
    
    // ---------------------------
    // Code
    //
    
    -Z(CODE)CSTART,ISR_CODE,CODE16=8000-FF7F
    
    
    // -------------------------------------
    // All memory 0-FFFFF
    //
    
    // ---------------------------
    // Code
    //
    
    -P(CODE)CODE=8000-FF7F,10000-87FFF
    
    // ---------------------------
    // Constant data
    //
    
    -Z(CONST)DATA20_C,DATA20_ID,CODE_ID=8000-FF7F,10040-87FFF
    
    
    // -------------------------------------
    // Special vectors
    //
    
    -Z(CODE)INTVEC=FF80-FFFF
    -Z(CODE)RESET=FFFE-FFFF
    

    我们无法在 IAR 或项目文件夹中找到.cmd 文件。 我们假设您正在讨论上面附加的链接器文件。 上述链接器文件未修改。  

    我们尝试按照建议进行更改、但未能正常工作。 我们更改了行

    Z (data) DATA20_I、DATA20_Z、DATA20_N、DATA20_heap+_DATA20_heap_size=2400-63FF、F0000-FBFFF

    至-

    Z (data) DATA20_I、DATA20_Z、DATA20_N、DATA20_heap+_DATA20_heap_size=2400-63FF、F0000-FFFFF (已修改)

    出现以下错误。

    ERROR[E24]:段 DATA20_Z (段 DATA20_Z、段模块"main"中的符号"u32Count"、地址[2400-2403])与段 DATA20_Z 重叠

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

    您好 Amit,

    我不熟悉 IAR。 我尝试使用 CCS、它可以正常工作。