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/MSP430F5659:如何编译大数组?!

Guru**** 2535250 points


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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/760601/ccs-msp430f5659-how-to-compile-big-arrays

器件型号:MSP430F5659

工具/软件:Code Composer Studio

各位 TI 专家、

今天我来这里是因为我遇到了与数组编译有关的问题。

我需要在项目中加载这个非常大的数据数组:

字符示例[]={164,74,196,74,229,82,5,83,39,91,71,72,91,104,99,136,99,169,99,169,107,169... };    //总大小= 124160*/

正如预期的那样、我有这个错误:#96数组太大。

在我的项目属性中、我 选择了大型代码存储器模型和受限数据存储器模型;因此、我知道在这种情况下、每个单独的对象的最大数据大小为64KB、不是吗?!

但是、如果我必须使用更大的数据数组(例如"示例")、那么、哪种方法可以避免这种问题呢?

您的建议和帮助将会得到真正的接受、

此致、谢谢!

Maria Angela

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

    [引用 user="Maria Angela Cianci"]但是,如果我必须使用更大的数据数组(如“示例”),那么,这是避免此问题的最佳方法?

    将数据存储器模型从限制更改为大。  在 MSP430编译器手册 中的"数据存储器模型"部分中阅读有关存储器模型的更多信息。

    谢谢、此致、

    乔治

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

    感谢您快速回复 George。

    将数据存储器模型从受限更改为大型后、我只能在将其定义为时编译数组"示例"  

    const char example[176660]={....}; 

    (但它目前不适用于我的项目)。

    如果是、我尝试使用  

    字符示例[176660]={... }; 

    遗憾的是、Code Composer 显示了此错误:"程序将无法放入可用的存储器中。 ".cinit"大小为0x24fed"的段定位失败。

    该阵列的内存放置有什么问题?

    此致、谢谢!

    MariaAngela

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

    [引用用户="Maria Angela Cianci"](但它目前无法与我的项目配合使用)。

    使用不同数据模型构建的目标文件不兼容。 应用程序中的所有文件都必须使用相同的数据模型构建。 此外、必须使用与该数据模型匹配的运行时支持库。

    检查--near_data 标志值。

    指定--near_data=globals 时、此选项告诉编译器所有全局读取/写入数据必须位于内存的前64K 中。 这是默认行为。 默认情况下、全局读取/写入数据放置在.bss 和.data 段中。 如果指定了--near_data=none,则此选项告诉编译器它不能依赖此假设来生成更高效的代码。

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

    由于关键字 const,这个数组...

    [引用用户="Maria Angela Cianci"] const char 示例[176660]={....};

    所需空间小于该数组...

    [引用用户="Maria Angela Cianci"]字符示例[176660]={... };[/报价]

    我将第一个调用 const 数组、第二个调用正则数组。

    const 阵列会立即创建并初始化。  在本例中、它占用176、660字节。

    常规数组是在单独的步骤中创建和初始化的。  编译器将所有值放置在名为.data 的已初始化段中。  链接器会将所有.data 段收集在一起、并基于此创建一个名为.cinit 的压缩初始化段。 然后、将.data 段从初始化更改为未初始化。  启动代码解压缩.cinit 段并将值复制到.data 中。  使用了多少内存?  未初始化的.data 段使用176、660字节。  由于压缩、初始化的.cinit 段使用的内容较少。  但它仍然大约为100、000字节。   

    因此、常规阵列使用的内存比常量阵列多得多。  在您的情况下、它会导致您的程序不适合您的系统。

    谢谢、此致、

    乔治

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

    尊敬的 Tomasz:

    尊敬的乔治

    非常感谢您提供清晰准确的答案。

    现在、最后、我非常好地了解.cinit 和.data 段是什么!

    如果我使用编译程序

    const char 示例[]={...}; 

    我使用 闪存/FRAM:181130字节。 RAM:222字节。

    否则、我无法加载调试会话的程序、因为我在上一篇文章中提到了与内存分配相关的错误。

    因此、如果我想使用常规数组、它必须更小、对吧? 没有其他方法可以编译和使用如此大的数据数组、有吗?

    如果有任何提示和建议、我们将不胜感激。

    此致、

    Maria Angela

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    对于每个常量和变量、您可以分配单独的数据段、并将该段放置在指定的数据地址。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Maria Angela Cianci 说:
    因此,如果我想使用常规数组,它必须更小,对吗?

    是的

    [引用用户="Maria Angela Cianci"]没有其他方法可以编译和使用如此大的数据数组,有吗?

    谢谢、此致、

    乔治