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.

msp430 RAM超区问题

Other Parts Discussed in Thread: MSP430F6723, MSP430F5529

我使用的编译器是CCS,版本是 Version: 5.4.0.00048 ,使用的MCU是MSP430F6723,配置如下图

使用CCS编译时,如下如

使用的MSP430F6723资源如下所示

疑问:msp430F6723的RAM空间是4Kb,为什么编译器显示已经使用了7398byte,将近7K的RAM了,还没有报错。

但是设备运行时,变量总会有莫名其妙的改变,是否与此有关。

  • mcu型号没选的是MSP430F6723吗?

  • 你好,

    请把你的CCS升级到CCS6.0版本,device选择对的芯片.

  • 芯片选择的没有错误,不过CCS为什么还要升级啊,5.4版也可以使用

    上图是我的配置信息,应该是没有配置错误。

  • 紫电2000,

    请问你的程序中有没有大量的const data, 这个程序默认是放在Flash中的。另外,建议直接看看编译后生成的.map文件,其中有具体的memory分配说明。如果你还有疑问的话,你可以把.map贴上来我们看看。

    另外,如果变量莫名其妙的变化的话,建议你还是先把CCS升级到最高版本,后在debug模式下,手动的将堆栈区填充固定的数据,例如0x55,后将程序运行一段时间,看看堆栈有没有溢出。

  • lina Lian:

    的确,我在程序中大量的使用了const data,这些变量是不占用RAM区吗,只是存放在flash中?

    我查看了一下map文件,好像是flash超区了。如果是这个问题,我减少一些const变量可以吗?

    下面是我的map文件的部分截图,麻烦帮忙看下可以吗?

    以下是我的堆栈设置

    运行一段时间后

    从上图可见,我的栈区是否设置的小了?增大栈区空间可以解决吗?

  • 紫电2000,

    紫电2000 说:
    我在程序中大量的使用了const data,这些变量是不占用RAM区吗,只是存放在flash中?

    是的,const data只占用Flash,不占RAM,你可以在debug下看const data对应变量名所在的memory地址,对照datasheet中memory map分布看一下,是放在Flash中的。

    从你提供的截图看,你的RAM只占用了0x765Byte = 1893Bytes , Flash占用了0xbf80bytes = 49024Bytes。

    你查看一下MSP430F6723对应的cmd文件,Flash应该是分为两部分的, Flash , Flash2,共有64KB, 另外你也可以看到Const是放在Flash中的,见下面标红。

    Stack虽然看起来没有超,因为还有0x55,但是也不能完全肯定,因为不知程序哪里占用最多。建议你再增大一下堆栈吧。

    MEMORY
    {
    SFR : origin = 0x0000, length = 0x0010
    PERIPHERALS_8BIT : origin = 0x0010, length = 0x00F0
    PERIPHERALS_16BIT : origin = 0x0100, length = 0x0100
    RAM : origin = 0x1C00, length = 0x1000
    INFOA : origin = 0x1980, length = 0x0080
    INFOB : origin = 0x1900, length = 0x0080
    INFOC : origin = 0x1880, length = 0x0080
    INFOD : origin = 0x1800, length = 0x0080
    FLASH : origin = 0x4000, length = 0xBF80
    FLASH2 : origin = 0x10000,length = 0x4000
    INT00 : origin = 0xFF80, length = 0x0002
    INT01 : origin = 0xFF82, length = 0x0002
    INT02 : origin = 0xFF84, length = 0x0002
    INT03 : origin = 0xFF86, length = 0x0002
    INT04 : origin = 0xFF88, length = 0x0002
    INT05 : origin = 0xFF8A, length = 0x0002
    INT06 : origin = 0xFF8C, length = 0x0002
    INT07 : origin = 0xFF8E, length = 0x0002
    INT08 : origin = 0xFF90, length = 0x0002
    INT09 : origin = 0xFF92, length = 0x0002
    INT10 : origin = 0xFF94, length = 0x0002
    INT11 : origin = 0xFF96, length = 0x0002
    INT12 : origin = 0xFF98, length = 0x0002
    INT13 : origin = 0xFF9A, length = 0x0002
    INT14 : origin = 0xFF9C, length = 0x0002
    INT15 : origin = 0xFF9E, length = 0x0002
    INT16 : origin = 0xFFA0, length = 0x0002
    INT17 : origin = 0xFFA2, length = 0x0002
    INT18 : origin = 0xFFA4, length = 0x0002
    INT19 : origin = 0xFFA6, length = 0x0002
    INT20 : origin = 0xFFA8, length = 0x0002
    INT21 : origin = 0xFFAA, length = 0x0002
    INT22 : origin = 0xFFAC, length = 0x0002
    INT23 : origin = 0xFFAE, length = 0x0002
    INT24 : origin = 0xFFB0, length = 0x0002
    INT25 : origin = 0xFFB2, length = 0x0002
    INT26 : origin = 0xFFB4, length = 0x0002
    INT27 : origin = 0xFFB6, length = 0x0002
    INT28 : origin = 0xFFB8, length = 0x0002
    INT29 : origin = 0xFFBA, length = 0x0002
    INT30 : origin = 0xFFBC, length = 0x0002
    INT31 : origin = 0xFFBE, length = 0x0002
    INT32 : origin = 0xFFC0, length = 0x0002
    INT33 : origin = 0xFFC2, length = 0x0002
    INT34 : origin = 0xFFC4, length = 0x0002
    INT35 : origin = 0xFFC6, length = 0x0002
    INT36 : origin = 0xFFC8, length = 0x0002
    INT37 : origin = 0xFFCA, length = 0x0002
    INT38 : origin = 0xFFCC, length = 0x0002
    INT39 : origin = 0xFFCE, length = 0x0002
    INT40 : origin = 0xFFD0, length = 0x0002
    INT41 : origin = 0xFFD2, length = 0x0002
    INT42 : origin = 0xFFD4, length = 0x0002
    INT43 : origin = 0xFFD6, length = 0x0002
    INT44 : origin = 0xFFD8, length = 0x0002
    INT45 : origin = 0xFFDA, length = 0x0002
    INT46 : origin = 0xFFDC, length = 0x0002
    INT47 : origin = 0xFFDE, length = 0x0002
    INT48 : origin = 0xFFE0, length = 0x0002
    INT49 : origin = 0xFFE2, length = 0x0002
    INT50 : origin = 0xFFE4, length = 0x0002
    INT51 : origin = 0xFFE6, length = 0x0002
    INT52 : origin = 0xFFE8, length = 0x0002
    INT53 : origin = 0xFFEA, length = 0x0002
    INT54 : origin = 0xFFEC, length = 0x0002
    INT55 : origin = 0xFFEE, length = 0x0002
    INT56 : origin = 0xFFF0, length = 0x0002
    INT57 : origin = 0xFFF2, length = 0x0002
    INT58 : origin = 0xFFF4, length = 0x0002
    INT59 : origin = 0xFFF6, length = 0x0002
    INT60 : origin = 0xFFF8, length = 0x0002
    INT61 : origin = 0xFFFA, length = 0x0002
    INT62 : origin = 0xFFFC, length = 0x0002
    RESET : origin = 0xFFFE, length = 0x0002
    }

    /****************************************************************************/
    /* SPECIFY THE SECTIONS ALLOCATION INTO MEMORY */
    /****************************************************************************/

    SECTIONS
    {
    .bss : {} > RAM /* GLOBAL & STATIC VARS */
    .data : {} > RAM /* GLOBAL & STATIC VARS */
    .sysmem : {} > RAM /* DYNAMIC MEMORY ALLOCATION AREA */
    .stack : {} > RAM (HIGH) /* SOFTWARE SYSTEM STACK */

    .text : {}>> FLASH2 | FLASH /* CODE */
    .text:_isr : {} > FLASH /* ISR CODE SPACE */
    .cinit : {} > FLASH /* INITIALIZATION TABLES */
    .const : {} > FLASH | FLASH2 /* CONSTANT DATA */
    .cio : {} > RAM /* C I/O BUFFER */

    .pinit : {} > FLASH /* C++ CONSTRUCTOR TABLES */
    .init_array : {} > FLASH /* C++ CONSTRUCTOR TABLES */
    .mspabi.exidx : {} > FLASH /* C++ CONSTRUCTOR TABLES */
    .mspabi.extab : {} > FLASH /* C++ CONSTRUCTOR TABLES */

    .infoA : {} > INFOA /* MSP430 INFO FLASH MEMORY SEGMENTS */
    .infoB : {} > INFOB
    .infoC : {} > INFOC
    .infoD : {} > INFOD

    /* 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
    .int18 : {} > INT18
    .int19 : {} > INT19
    .int20 : {} > INT20
    .int21 : {} > INT21
    .int22 : {} > INT22
    .int23 : {} > INT23
    .int24 : {} > INT24
    .int25 : {} > INT25
    .int26 : {} > INT26
    .int27 : {} > INT27
    .int28 : {} > INT28
    .int29 : {} > INT29
    .int30 : {} > INT30
    .int31 : {} > INT31
    .int32 : {} > INT32
    .int33 : {} > INT33
    .int34 : {} > INT34
    .int35 : {} > INT35
    .int36 : {} > INT36
    .int37 : {} > INT37
    .int38 : {} > INT38
    .int39 : {} > INT39
    RTC : { * ( .int40 ) } > INT40 type = VECT_INIT
    LCD_C : { * ( .int41 ) } > INT41 type = VECT_INIT
    TIMER3_A1 : { * ( .int42 ) } > INT42 type = VECT_INIT
    TIMER3_A0 : { * ( .int43 ) } > INT43 type = VECT_INIT
    PORT2 : { * ( .int44 ) } > INT44 type = VECT_INIT
    TIMER2_A1 : { * ( .int45 ) } > INT45 type = VECT_INIT
    TIMER2_A0 : { * ( .int46 ) } > INT46 type = VECT_INIT
    PORT1 : { * ( .int47 ) } > INT47 type = VECT_INIT
    TIMER1_A1 : { * ( .int48 ) } > INT48 type = VECT_INIT
    TIMER1_A0 : { * ( .int49 ) } > INT49 type = VECT_INIT
    DMA : { * ( .int50 ) } > INT50 type = VECT_INIT
    AUX : { * ( .int51 ) } > INT51 type = VECT_INIT
    USCI_A2 : { * ( .int52 ) } > INT52 type = VECT_INIT
    USCI_A1 : { * ( .int53 ) } > INT53 type = VECT_INIT
    TIMER0_A1 : { * ( .int54 ) } > INT54 type = VECT_INIT
    TIMER0_A0 : { * ( .int55 ) } > INT55 type = VECT_INIT
    SD24B : { * ( .int56 ) } > INT56 type = VECT_INIT
    ADC10 : { * ( .int57 ) } > INT57 type = VECT_INIT
    USCI_B0 : { * ( .int58 ) } > INT58 type = VECT_INIT
    USCI_A0 : { * ( .int59 ) } > INT59 type = VECT_INIT
    WDT : { * ( .int60 ) } > INT60 type = VECT_INIT
    UNMI : { * ( .int61 ) } > INT61 type = VECT_INIT
    SYSNMI : { * ( .int62 ) } > INT62 type = VECT_INIT
    .reset : {} > RESET /* MSP430 RESET VECTOR */
    }

    /****************************************************************************/
    /* INCLUDE PERIPHERALS MEMORY MAP */
    /****************************************************************************/

    -l msp430f6723.cmd

  • Lina Lian你棒棒哒!你回答的问题都好有用!~~

  • 你好,我也遇到了类似于楼主遇到的问题,还请指导一下!

    我使用的MCU是MSP430F5529,MSP430F5529的flash大小共计128KB。

    =========================================================

    lnk_msp430f5529.cmd 部分内容如下:

    INFOC :      origin = 0x1880,   length = 0x0080
    INFOD :      origin = 0x1800,   length = 0x0080
    FLASH :     origin = 0x4400,    length = 0xBB80
    FLASH2 :   origin = 0x10000, length = 0x14400
    INT00 :       origin = 0xFF80,   length = 0x0002
    INT01 :       origin = 0xFF82,   length = 0x0002

    -----------------------------------------------------------------

    project的设置如下:

    1. -vmspx

    2. --abi=eabi

    3. --code_model=large

    4. --data_model=large 

    5. heap_size = 320

    6. stack_size = 320

    7. CCS_v5.5.0

    问题描述:

    1. 当代码容量低于48KB,也就是说未用到文件lnk_msp430f5529.cmd中提到的FLASH2时,程序编译,连接,下载都可以。

    2. 当代码容量超过48KB,也就是开始使用FLASH2时,程序编译连接失败,如下图:

    此时的.map文件部分内容如下,详情见附件。

    请问,这种问题有什么解决方案?为什么我启用了FLASH2依然报错?

  • Bilk Hellc,

    你的问题和楼主的问题看起来是不同的,主要在于你的第二个error, 你的map中明确指明 .cinit failed to allocate,你具体点开error 2看看你的.cinit允许arrange是多少吧。

    .cinit: Tablesfor explicitlyinitialized global and staticvariables.

    建议你直接参考一下CCS直接例程: MSP-EXP430F5529 User Experience, 其占用空间应该比你的例程多。

  • Lina Lian:

    谢谢,根据你指导,我的问题已经解决了。

    我使用了一个最稳妥的办法:

        .text          : {}>> FLASH | FLASH2        /* CODE                              */
        .text:_isr  : {} > FLASH                            /* ISR CODE SPACE                    */
    #ifdef __LARGE_DATA_MODEL__
        .cinit        : {} > FLASH | FLASH2          /* INITIALIZATION TABLES             */
        .const      : {} > FLASH | FLASH2          /* CONSTANT DATA                     */
    #else
        .cinit        : {} > FLASH | FLASH2          /* INITIALIZATION TABLES             */
        .const      : {} > FLASH | FLASH2          /* CONSTANT DATA                     */
    #endif
        .cio          : {} > RAM                                /* C I/O BUFFER                      */