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/MSP430F5435:位于FLASH2上较高内存中的数据导致#1.7003万-D警告为大型数据模型

Guru**** 2573695 points
Other Parts Discussed in Thread: MSP430F5435

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/597039/ccs-msp430f5435-data-located-in-higher-memory-above-flash2-is-causing-17003-d-warning-is-large-data-model

部件号:MSP430F5435

工具/软件:Code Composer Studio

 CCS版本:7.0 Win10上运行的Win.0.0.0043万

我在链接程序命令文件中创建了一个数据段,如下所示:

PARAM_DATA10         :原点= 0x26E00,长度= 0x0200

链接程序cmd文件的sections部分:

章节

   .bss       :{}> RAM/*                 全局和静态vars             */
   数据      :{}> RAM/*                 全局和静态vars             */
   .TI.noinit :{}> RAM                 /*用于#pragma noinit               */
   sysmem    :{}> RAM/*                 动态内存分配区域   */
   堆栈     :{}> RAM (高)          /*软件系统堆栈            */

#ifndef __larate_data_model__
   text      :{}> flash               /* Code                             */
#否则
   .text      :{}>> FLASH2 | FLASH     /* Code                             */
#endif
   text:_isr :{}> FLASH               /* ISR代码空间                   */
   .cinit     :{}> flash               /* Initialization Tables            */
#ifndef __larate_data_model__
   const     :{}> flash               /*常量数据                    */
#否则
   const     :{}>> FLASH2     /*常量数据                    */
#endif
   CIO       :{}> RAM/*                 C I/O Buffer                     */

   .Pinit     :{}> flash               /* C++构造函数表           */
   binit     :{}> flash               /* boot-time Initialization tables  */
   init_array :{}> flash               /* C++构造函数表           */
   .mspabi.exidx :{}> flash             /* C++构造函数表           */
   .mspabi.extab :{}> flash             /* C++构造函数表           */
#ifdef __TI_Compiler_version__
 #if __TI_Compiler_version__>= 1500.9万
   #ifndef __larate_data_model__
   .TI.ramfunc :{} load=flash, run=ram, table(BINIT)
   #否则
   .TI.ramfunc:{} load=flash | FLASH2,run=RAM,table (BINIT)
   #endif
 #endif
#endif

 infoA    :{}> INFOA             /* MSP430信息闪存段*/
   信息B    :{}> INFOB.
   INFoC    :{}> INFOC.
   信息D    :{}> INFOD.
   .param_data1 :{}> Param_Data1.
   .param_data2:{}> Param_DATA2.
   .param_data3:{}> Param_DATA3.
   .param_data4:{}> Param_DATA4.
   .param_data5:{}> Param_Data5.
   .param_data6:{}> Param_DATA6.
   .param_data7:{}> Param_DATA7
   .param_data8:{}> Param_DATA8.
   .param_data9:{}> Param_DATA9
   .param_data10:{}> Param_DATA10.
   param_data11:{}> Param_DATA11.
   .param_data12:{}> Param_DATA12.
   .param_data13:{}> Param_DATA13.
   .param_data14:{}> Param_DATA14.
   .param_data15:{}> Param_DATA15.
   .param_data16:{}> Param_DATA16.
   .param_data20:{}> Param_DATA20.
   .param_data21:{}> Param_DATA21.

用于访问数据部分的变量声明为:

#pragma data_section(VarName,".param_data10")
T_typename      VarName;

当我尝试将元素(char)从结构传递到IO端口(使用全部8位)时,编译器会发出警告

说明   资源   路径   位置   类型
<ahref="processors.wiki.ti.com/.../1.7003万"> 从函数"FunctionName"重定位到符号"VarName"溢出;重定位的18位地址0x26e00太大,无法在16位字段中进行编码(类型='R_MSP430X_ABS16'(15),文件="./main.obj",偏移= 0x0.0003万e,部分=".text:FunctionName"+   FileName.h   ProjectC++ Probean")      
(是的,我更改了一些名称以保护无辜者)

我还尝试使用本地temp变量从结构中接收值,然后将其放到IO端口,但错误移动到带有temp变量的行中。

我已在项目中指定使用大型代码和大型数据模型。  与此警告一起的是警告:

说明   资源   路径   位置   类型
#1.0015万-D输出文件“ProjectName.out”不能在目标系统   ProjectName上加载和运行         C/C++问题

对我来说,这不仅仅是一个警告!

从IAR编译并运行良好的代码

有什么想法?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Greg,
    我将转到编译器论坛。 那里的专家可以为您提供最好的帮助。

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

    我已在项目中指定使用大型代码和大型数据模型。  

    还可以尝试将--near数据选项从"globals"更改为"none":

    通过设置大数据模型并将--near数据设置为none,我可以抑制附加示例上的警告,该示例中的数据位于高内存中。

    e2e.ti.com/.../MSP430F5435_5F00_high_5F00_data.zip

    [我尚未尝试运行该程序]

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

    Chester Gillon的回答正确。  我可以再解释几个细节,并提出一个额外的更改建议。

    因为此内存范围...

    Greg Greenwood 说:
    Param_DATA10         :原点= 0x26E00,长度= 0x0200[/报价]

    ...高于64K边界(高于地址0x1万),如果将可写数据放在此内存范围内,则必须将--near数据=globals更改为--near数据=none。   有关详细信息,请参阅MSP430编译器手册中标题为支持Near数据的部分。   

    在CCS中创建新的MSP430F5435项目时,将从生成选项--near数据=globals和--data模型=restricted开始。  虽然需要更改为--nnear数据=none,但不需要更改为--data_model=large。  除非您有一些大小超过64K的单个对象(如数组)。  这种情况很不可能发生。  因此,如果使用--data_model=restricted,您可能会看到代码大小和速度的小改进。  有关详细信息,请参阅同一手册中标题为数据存储器型号的章节。

    谢谢,此致,

    -George

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

    明白了。

    谢谢大家。

    代码迁移已完成并正常工作。

    还必须确保访问闪存的所有代码实例都使用声明为unsigned long *的变量。  显然,IAR (旧版本)是在没有抱怨或警告的情况下在后台执行此操作的。

    很高兴在CCS上!