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.

[参考译文] 编译器/TMS320F2808:RAM中的随机数据故障。

Guru**** 2576195 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/642498/compiler-tms320f2808-random-data-failure-in-ram

部件号:TMS320F2808

工具/软件:TI C/C++编译器

您好,我遇到了一个不愉快的错误。

是的,这是非常具体的问题,但是...

在某些模式下,我的RAM中的数据会损坏。 这是随机损坏。

我找不到我在哪里做的事! 我有很多中断,这是一个大项目,但以前的项目是基于同一个程序,我没有遇到任何问题。

我正在使用--opt_level = 4;--opt_for _speed =5

有我的内存链接(对于F2808):

内存
{
第0页:/*程序内存*/
/*内存(RAM/FLASE/OTP)块可移至Page1以进行数据分配*/

RAML0_1 :原点= 0x0.8万,长度= 0x0.2万 /*片上RAM块L0+L1!@ PVE 18.10 .........17 @! *
OTP :原点= 0x3D7800,长度= 0x0.04万 /*片上OTP */
FLASHD :原点= 0x3E8000,长度= 0x0.4万 /*片上闪存*/
FLASHC :原点= 0x3EC000,长度= 0x0.4万 /*片上闪存*/
FLASHA :原点= 0x3F4000,长度= 0x003F80 /*片上闪存*/
CSM_RSVD:原点= 0x3F7F80,长度= 0x0.0076万 /* FLASHA的一部分。 在使用CSM时使用所有0x0000编程。 */
开始 :原点= 0x3F7FF6,长度= 0x0.0002万 /* FLASHA的一部分。 用于“引导至闪存”引导加载程序模式。 */
CSM_PWL :原点= 0x3F7FF8,长度= 0x0.0008万 /* FLASHA的一部分。 FLASHA */中的CSM密码位置

ROM :原点= 0x3FF000,长度= 0x000FC0 /* Boot ROM */
reset :原点= 0x3FFFC0,长度= 0x0.0002万 /*引导ROM */
矢量的一部分 :原点= 0x3FFFC2,长度= 0x0.0003万E /*启动ROM的一部分*/

第1页:/*数据存储器*/
/*内存(RAM/FLASE/OTP)块可以移动到PAGE0以进行程序分配*/
/*寄存器保留在Page1上 */

RAMM0 :原始= 0x0万,长度= 0x0.04万 /*片上RAM块M0 */
BOOT_RSVD:Origin = 0x0.04万,length = 0x0.008万 /* M1的一部分,引导ROM将使用此堆栈*/
RAMM1 :原点= 0x0.048万,长度= 0x0.038万 /*片上RAM块M1 */
RAMH0 :原点= 0x00A000,长度= 0x0.1万 /*片上RAM块H0 (第一部分-用于数据)-复制到数据空间!@ PVE 18.10 16 @! */
RAMH0_F :原点= 0x00B000,长度= 0x0.1万 /*片上RAM块H0 (第二部分-用于过滤器)-复制到数据空间!@ PVE 18.10 16 @! *
FLASHB :原点= 0x3F0000,长度= 0x0.4万 /*片上闪存*/
}/*

将段分配给内存块。
注意:
DSP28_CodeStartBranch.asm中的codegstart用户定义部分用于重定向代码
引导至闪存时执行
ramfuncs用户定义的部分,用于存储将从Flash复制到RAM
*/

部分
{

/*分配计划领域:*/
.cinit :> FLASHA 页面= 0
。Pinit :> FLASHA, 页面= 0
.text :> FLASHA 页面= 0
代码开始 :>开始 页面= 0
ramfuncts :负载= FLASHD,
Run = RAML0_1,
load_start(_RamfuncsLoadStart),
load_end (_RamfuncsLoadEnd),
run_start(_RamfuncsRunStart),
页面= 0

csmpasswds :> CSM_PWL 页=0
csm_rsvd :> CSM_RSVD页面= 0

/*分配未初始化的数据段:*/
.stack :> RAMM0 页面= 1
.ebss 	:> RAMH0 页面= 1
个.esysmem :> RAMH0 Page = 1

	firldb1	align (0x100)> RAMH0_F,page = 1
	firldb2	align (0x100)> RAMH0_F,page = 1
	firldb3	align (0x100)> RAMH0_F,page = 1
	firldb4	align (0x100)> RAMH0_F,page =
		1
		
	align (0x100,首页	) 页面= 1
	firldb8	align(0x100)> RAMH0_F,页面= 1
	firldb9	align(0x100)> RAMH0_F,页面= 1
	firldb10 align(0x100)> RAMH0_F,页面= 1

/*初始化书帖进入Flash */*
要对这些进行编程,必须将它们分配到第0页*
.econst :> FLASHA 页面= 0
。switch :> FLASHA 页面= 0

/*分配IQ数学领域:*/
IQmath :> FLASHC	页面= 0 /*数学代码,FLASHC -原始位置*/
IQmathTables :> ROM Page =0,type = NoLoad /* ROM */*中的数学表

。reset是编译器使用的标准部分。 它包含
_c_int00 for C Code的起始地址*/*。 /*
/*使用引导ROM时
,不需要此部分和CPU矢量*/*表。 因此,默认类型在此处设置为*/*
DSECT */
.reset :>重置, Page =0,type = DSECT
引导程序 :>引导程序 页面=0,类型= DSECT

} 

链接是否正确? 或者我有一些错误?

以及如何调试此问题(因为这只发生在运行中的真实设备上)  


内存{PAGE 0:  /* Program Memory */       /*内存(RAM/FLASE/OTP)块可移至Page1以进行数据分配*/
  RAML0_1   :原点= 0x0.8万,长度= 0x0.2万   /*片上RAM块L0+L1!@ PVE 18.10 17 @! *  OTP      :原始= 0x3D7800,长度= 0x0.04万   /*片上OTP */  FLASHD   :原始= 0x3E8000,长度= 0x0.4万   /*片上闪存*/  FLASHC   :原始= 0x3EC000,长度= 0x0.4万   /*片上闪存*/  FLASHA   :原始= 0x3F4000,长度= 0x003F80 /CSM_STIC/        原点= 0x3F7F80,长度= 0x0.0076万   /* FLASHA的一部分。  在使用CSM时使用所有0x0000编程。 */  BEGIN    :Origin = 0x3F7FF6,length = 0x0.0002万   /*部分FLASHA。  用于“引导至闪存”引导加载程序模式。 */  CSM_PWL   :原点= 0x3F7FF8,长度= 0x0.0008万   /* FLASHA的一部分。  FLASHA */    ROM中的CSM密码位置      :原始= 0x3FF000,长度= 0x000FC0   /*引导ROM */  重置    :原始= 0x3FFFC0,长度= 0x0.0002万   /*引导ROM的一部分 */  矢量   :原始= 0x3FFFC2,长度= 0x0.0003万E   /*引导ROM的一部分 */
第1页:/*  数据存储器*/       /*内存(RAM/FLASE/OTP)块可以移动到PAGE0以进行程序分配*/       /*寄存器保留在Page1上                          */
  RAMM0    :Origin = 0x0万,length = 0x0.04万   /*片上RAM块M0 */  BOOT_RSVD  :origin = 0x0.04万,length = 0x0.008万   /* M1的一部分,boot ROM将对stack */  RAMM1使用此选项    :origin = 0x0.048万,length = 0x0.038万   /*片上RAM块M1 *//  RAML1    : 原点= 0x0.96万,长度= 0x000A00   /*片上RAM块L1 -已更改:从9000到9600,从1000到A00!@ PVE 18.10 .................17 @! */  RAMH0    :原点= 0x00A000,长度= 0x0.1万   /*片上RAM块H0 (第一部分-用于数据)-复制到数据空间!@ PVE 18.10 16 @! */  RAMH0_F   :原点= 0x00B000,长度= 0x0.1万   /*片上RAM块H0 (第二部分-用于过滤器)-复制到数据空间!@ PVE 18.10 16 @! */  FLASHB   :Origin = 0x3F0000,length = 0x0.4万   /*片上闪存*///  RAMH0    :origin = 0x3FA000,length = 0x0.2万   /*片上RAM块H0 */}
/*将部分分配给内存块。   注意:      DSP28_CodeStartBranch.asm中的codegstart用户定义部分用于重定向代码            引导至闪存时执行      ramfuncs 用户定义的部分,用于存储将从Flash复制到RAM*/  部分{   /*分配程序区域:*/  .cinit的函数        :> FLASHA   页面= 0  。Pinit        :> FLASHA,   page = 0  .text         :> FLASHA   页面= 0  代码启动       :>开始    页面= 0  ramfuncs.       :负载= FLASHD,               Run = RAML0_1,              load_start(_RamfuncsLoadStart),              load_end (_RamfuncsLoadEnd),              run_start(_RamfuncsRunStart),              页面= 0
  csmpasswds      :> CSM_PWL   页面= 0  CSM_rsvd.       :> CSM_RSVD  page = 0    /*分配未初始化的数据段:*/  .stack        :> RAMM0    page = 1//  .ebss         :> RAML1    page = 1  .ebss  :> RAMH0    page = 1  .esysmem       :> RAMH0    页面= 1
FIRldb1 align(0x100)> RAMH0_F,  page = 1 firldb2 align(0x100)> RAMH0_F,  page = 1 firldb3 align(0x100)> RAMH0_F,  page = 1 firldb4 align(0x100)> RAMH0_F,  page =     1 align(0x100)   Page = 1 firldb8 align (0x100)> RAMH0_F,  page = 1 firldb9 align (0x100)> RAMH0_F,  page = 1 firldb10 align (0x100)> RAMH0_F,  page = 1
  /*初始化部分进入Flash *//*  要使SDFlash对这些部分进行编程,必须将它们分配到第0页*/  .econst        :> FLASHA   PAGE = 0  .SWITCH        :> FLASHA   页面= 0     
  /*分配IQ数学领域:*/  IQmath        :> FLASHC  页面= 0          /*数学代码,FLASHC -原始位置*/  IQmathTables     :> ROM      Page =0,type = NoLoad  /* ROM中的数学表*/
  /*.reset是编译器使用的标准部分。  它包含   _c_int00 for C Code的起始地址*/*。   /*  /*使用引导ROM时  ,不需要此部分和CPU矢量*/*表。  因此,默认类型在此处设置为 */*  DSECT */   .reset        :>重置,   页=0,类型= DSECT  引导程序        :>引导   程序页面=0,类型= DSECT
}

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

    波塔波夫

    您提供的信息不足以提供有意义的调试提示。 通过"损坏",我假设您实际上是在谈论内存损坏,而不是RAM单元的一些物理损坏。  如果不 全面了解您的代码,就很难尝试调试此问题。 如果链接程序命令文件中存在严重错误(如重叠部分),则在链接过程中会出现错误。 但是,它无法检测到某些情况,如用户定义的节段大小不足,这可能导致应用程序覆盖不应该覆盖的位置。 如果怀疑堆栈溢出,此应用说明可能会有所帮助:

    http://www.ti.com/lit/an/spra820/spra820.pdf