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.

[参考译文] CCS/LAUNCHXL-CC2640R2:错误#10099-d 程序不能放入可用内存中

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/786001/ccs-launchxl-cc2640r2-error-10099-d-program-will-not-fit-into-available-memory

器件型号:LAUNCHXL-CC2640R2

工具/软件:Code Composer Studio

您好!

首先、我想说的是、我对 CCS 的了解仍然很新、 但是、我目前正在尝试将 main 函数从 TI Resource Explorer 中名为 nvsexternal.c 的示例代码执行到代码的修改版本、也可以从名为"simple_broadcaster "的资源浏览器执行此操作、该资源浏览器使用 SPI 读取、写入和擦除 TI-CC2640上的外部存储器。 我之前成功地单独运行了两个程序、但是现在在将这个 SPI 函数插入主代码时、我收到了这个错误:


"程序将不能放入可用的内存中。  ".TI.bound:nV_flash"大小为0x1000的段放置对齐失败、与".TI.bound:flashBuf$9"、大小为0x4000 (第0页)空:程序将不适合可用存储器。  ".TI.bound:nV_flash"大小为0x1000的段放置对齐失败、与".TI.bound:flashBuf$9"大小0x4000 (第0页)"重叠

以下是 SPI 的主要函数:

/
 * define (nvsexternal.c)
#include
#include
#include
/*驱动程序头文件*/
#include
#include
/*示例/板头文件*/
#include "Board.h"
#define footer ======================================================================================== "
放置在 RAM 中的/*缓冲器,用于保存从非易失性存储器读取的字节。 *
静态字符缓冲区[16];
静态常量字符签名[]=
{"SimpleLinktest..."};
/*********

void NVS_func (void)

   NVS_Handle nvsHandle;
   NVS_Attrs 区域 Attrs;
   NVS_Params nvsParams;
   Display_Handle displayHandle;
   /*
    *在 LaunchPad 上唤醒外部闪存。 默认情况下、它处于关闭状态
    但可以通过切换 SPI 芯片选择引脚打开。
    *
   #ifdef Board_wakeUpExtFlash
   Board_wakeUpExtFlash();
   #endif
   display_init();
   NVS_init();
   DisplayHandle = Display_open (Display_Type_UART、NULL);
   if (displayHandle == NULL){
       /* Display_open()失败*/
       while (1);
   }
   NVS_PARAMS_INIT (_nvsParams);
   nvsHandle = NVS_open (Board_NVSEXTERNAL、_nvsParams);
   if (nvsHandle == NULL){
       display_printf (displayHandle、0、0、"NVS_open () failed.");
       返回;
   }
   display_printf (displayHandle、0、0、"\n");
     /*
    *这将填充具有特定属性的 NVS_Attrs 结构
    *连接到 NVS_Handle、例如区域基地址、区域大小、
    和扇区大小。
    *
   NVS_getAttrs (nvsHandle、&regionAttrs);

   /*显示 NVS 区域属性。 *
   Display_printf (displayHandle、0、0、"扇区大小:0x%x"、
           regionAttrs.sectorSize);
   Display_printf (displayHandle、0、0、"区域大小:0x%x\n"、
           regionAttrs.regionSize);
   /*
    *将"sizeof (signature)"字节从 NVS 区域基地址复制到中
    *缓冲区。
    *
   NVS_READ (nvsHandle、0、(void *) buffer、sizeof (signature));
   /*
    *确定 NVS 区域是否包含签名字符串。
    *将字符串与复制到缓冲区中的内容进行比较。
    *
   if (strcmp ((char *) buffer、(char *) signature)==0){
       /*将缓冲区从闪存复制到控制台。 *
       display_printf (displayHandle、0、0、"%s"、buffer);
       Display_printf (displayHandle、0、0、"擦除 SPI 闪存扇区...");
       /*擦除整个闪存扇区。 *
       NVS_ERASE (nvsHandle、0、regionAttrs.sectorSize);
   }
   否则{
       /*在 NVS 区域未找到签名。 *
       Display_printf (displayHandle、0、0、"正在将签名写入 SPI 闪存...");
       /*
        *将签名写入存储器。 之前擦除闪存扇区
        执行写入操作。 这由指定
        * NVS_WRITE_ERASE。
        *
       NVS_WRITE (nvsHandle、0、(void *) signature、sizeof (signature)、
           NVS_WRITE_ERASE | NVS_WRITE_POST_VERIFY);
   }
   display_printf (displayHandle、0、0、"复位器件。");
   Display_printf (displayHandle、0、0、页脚);
   返回;

/

下面也是 simple_broadcaster .c 文件中的内存分配:

我之前曾尝试整体减小代码的大小、并删除了 display_print 函数、认为它只是程序太大、但现在我不确定从哪里开始解决此问题。 如果对这一问题提供任何指导,将不胜感激。

如果我还能提供任何其他帮助,我会很高兴地这样做:)

 

谢谢!

-Steven

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在进一步研究后、我发现我的问题在电路板文件中的某个位置、在这里、我将为 NVS 功能分配数据。 如果我对电路板文件的 NVS 部分有任何帮助、请执行以下操作:

    *========================================= NVS ================================================
    *
    #include
    #include
    #include

    #define NVS_REGESS_BASE 0x16000
    #define SECTORSIZE 0x1000
    #define REGIZE (SECTORSIZE * 2)

    #ifndef Board_exclude_NVS_INTERNAL_FLASH

    /*
    *通过放置一个未初始化的字节来保留闪存扇区以供 NVS 驱动程序使用
    *位于所需闪存地址的数组。
    *
    #if defined (__TI_Compiler_version__)

    /*
    *将未初始化的数组放置在 NVS_REGESS_BASE
    *
    #pragma LOCATION (flashBuf、NVS_REGESS_base);
    #pragma NOINIT (flashBuf);
    静态字符 flashBuf[REGIZE];

    #Elif defined (_IAR_systems_icc_)

    /*
    *将未初始化的数组放置在 NVS_REGESS_BASE
    *
    static __no_init char flashBuf[REGionIZE]@ NVS_REGESS_BASE;

    #Elif defined (_GNU_)

    /*
    *将闪存缓冲区放置在在在 gcc 链接器文件中创建的.NVS 段中。
    *.NVS 段在扇区边界上强制对齐、但可能会
    *放置在闪存中的任何位置。 如果需要、可以设置.NVS 段
    *通过更改 gcc 链接器文件中的以下内容来将地址更改为固定地址:
    *
    *.NVS (fixed_flash_ADDR)(NoLoad):at (fixed_flash_ADDR){
    * *(.NVS)
    *}> region_text
    *
    __attribute__((section (".NVS")))
    静态字符 flashBuf[REGIZE];

    #endif

    /*为 NVS 和 NVS SPI 分配对象*/
    NVSCC26XX_Object nvsCC26xx 对象[1];

    /* NVS 的硬件属性*/
    CONST NVSCC26XX_HWAttrs nvsCC26xxHWAttrs[1]={

    regionBase =(void *) flashBuf、
    regionSize = REGIZE、
    }、
    };

    #endif // Board_exclude_NVS_INTERNAL_FLASH */

    #ifndef Board_exclude_NVS_EXTERNAL_FLASH

    #define SPISECTORSIZE 0x1000
    #define SPIREONGIZE (SPISECTORSIZE * 32)
    #define VERIFYBUFSIZE 64

    静态 uint8_t verifyBuf[VERIFYBUFSIZ];

    /*为 NVS 外部区域分配对象*/
    NVSSPI25X_Object nvsSPI25XObjects[1];

    /* NVS 外部区域的硬件属性*/
    CONST NVSSPI25X_HWAttrs nvsSPI25XHWAttrs[1]={

    regionBaseOffset = 0、
    .ONSSIZE = SPIREGIZIZE、
    sectorSize = SPISECTORSIZE、
    verifyBuf = verifyBuf、
    verifyBufSize = VERIFYBUFSIZE、
    .spiHandle = NULL、
    spiIndex = 0、
    spiBitRate = 4000000、
    spiCsnGpioIndex = CC2640R2_LAUNCHXL_GPIO_SPI_FLASH_CS、
    .statusPollDelayU = 100、
    }、
    };

    #endif // Board_exclude_NVS_EXTERNAL_FLASH */

    /* NVS 区索引0和1分别指 NVS 和 NVS SPI */
    CONST NVS_Config NVS_CONFIG[CC2640R2_LAUNCHXL_NVSCOUNT]={
    #ifndef Board_exclude_NVS_INTERNAL_FLASH

    .fxnTablePtr =&NVSCC26XX_fxnTable、
    .object =_nvsCC26xx 对象[0]、
    hwAttrs =&nvsCC26xxHWAttrs[0]、
    }、
    #endif
    #ifndef Board_exclude_NVS_EXTERNAL_FLASH

    .fxnTablePtr =&NVSSPI25X_fxnTable、
    .object =_nvsSPI25XObjects[0]、
    hwAttrs =&nvsSPI25XHOWAttrs[0]、
    }、
    #endif
    };

    const uint_least8_t NVS_count = CC2640R2_LAUNCHXL_NVSCOUNT;

    /*
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    对于感兴趣的人,我通过将 var NVS_REGESS_BASE 更改为0x18000并保持 REGIZE 为(SECTORSIZE * 2)找到了我的解决方案。


    #define NVS_REGESS_BASE 0x18000
    #define SECTORSIZE 0x1000
    #define REGIZE (SECTORSIZE * 2)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Steven、

    很高兴你能解决这个问题!

    Riz