TI中文支持网
TI专业的中文技术问题搜集分享网站

C6678全局变量初始化问题

TI工程师,你好:

我最近在调试自制信号处理板的C6678程序时遇到了一个问题,由于代码较多,所以我把.text段从各核的Local L2挪到了共享内存中,cmd文件附在后面了。在.text段移动之后,SPI boot就无法正常启动了。load symbol进行观察,发现零核在对SRIO进行初始化的时候,gpSRIO_regs本来应该被

CSL_SrioRegs * gpSRIO_regs = (CSL_SrioRegs *)CSL_SRIO_CONFIG_REGS;

赋值为0x02900000,但是在初始化失败的过程中发现存储于.neardata区的该变量以及其它很多变量都没有被正确初始化,而是保持了上电后的随机值,想了解一下出现该状况的原因。

期待您的回复,祝您新春快乐。

 

////////////////////////////c6678.cmd/////////////////////////////

-heap 0x8000

-stack 0x19500

 

MEMORY

{

         BOOT_CORE: o = 0x10800000 , l = 0x000000C0(origin地址随DNUM改变,此处只写core0)

         LL2:              o = 0x108000C0 , l = 0x00040000(同上)

         LL2_prog:            o = 0x108400C0 , l = 0x00030000(同上)

         SL2_prog:   o = 0x0C3868C0 , l = 0x00079740

         DDR3:        o = 0xA0000000 , l = 0x10000000

}

 

SECTIONS

{

         .myboot

         {

                   *.*<boot.obj>(.text)

         } > BOOT_CORE

         .text                            >       SL2_prog

         .cinit                            >       LL2_prog

         .const                >       LL2_prog

         .switch              >      LL2_prog

 

GROUP

{

                  .neardata

                  .rodata

                  .bss

} > LL2_prog

 

.far                     >      LL2_prog

.csl_vect           >      LL2_prog

.stack                 >      LL2_prog

.far_data          >      LL2_prog

.cio                     >      LL2_prog

.system             >      LL2_prog

Platform_lib     >      LL2_prog

.data_ddr3       >       DDR3

}

///////////////////End of c6678.cmd///////////////////

Yu Wang5:

第一次发帖不会编辑,在一楼补充一下:当.text段放在各核L2的时候,无论是通过SPI boot还是在线debug,程序均可正常运行;当.text段移至SL2之后,在线debug该程序正常、通过SPI boot启动不正常,才会出现主楼所述全局变量初始化不成功的现象。

,

Shine:

建议用仿真器跟一下boot过程看程序有没有被正确加载?只是SRIO这块代码加载后有问题吗?

,

Yu Wang5:

Shine 你好:

感谢您的回复。

首先回答您的问题,使用仿真器跟踪boot过程发现boot过程已经完成。不只SRIO这块代码加载后有问题,和它同处于.neardata 域中的其他代码均没有被成功初始化,比如gpDDR_regs等被赋予初值的全局变量,其指针地址本应指向器件手册上所对应的寄存器地址,由于这些指针未被初始化所以其指向了随机代码空间,无法获得模块的反馈结果,自然无法使模块初始化函数正常运行。

在新年的这段时间里,我尝试了TI中文和英文论坛上提到的多种方法,并据其对我的.cmd文件进行调整,目前进度如下:

1、仅将.text段置于MSMC SRAM中,boot正常,.neardata段中的变量均未被赋初值,初始化失败;

2、将.text段、.cinit段、.const段、.switch段置于MSMC SRAM中,boot正常,.neardata段中的变量均未被赋初值,初始化失败;

3、仅在Local L2中保留.cio段、.csl_vect段、.stack段和.sysmem段,其他段均置入MSMC SRAM中(我认为重点是将.neardata、.rodata、.bss三个段组成的GROUP置于了核间共享内存),boot正常、.neardata段及系统的初始化均正常。但是,由于很多原本存储于Local L2的变量被移至Shared L2,导致程序中要添加特别多 维护内存一致性的语句(因为.neardata中包含有核间中断触发相关的变量,需要保持各核一致),这需要对程序进行大量的修改。同时将该段放到SL2中也并非我本意,而且我在其他TI工程师的回复中看到,推荐将.neardata、.rodata、.bss组成的GROUP放到Local L2中。

所以我目前碰到的问题是:如何能在保持.text段在SL2的情况下,使存放于LL2的.neardata段变量正确初始化。

如果您对我所遇到的情况还有不清楚的地方,可以进一步询问,我会尽快回复。感谢您的帮助。

,

Yu Wang5:

补充一下,以上情况均是在使用SPI BOOT启动下得到的结果,使用仿真器进行在线DEBUG均不存在我所说的.neardata初始化错误的问题。

,

Shine:

如果在线debug没问题的话,那说明cmd文件配置是正确的。请看一下工程编译时是否使用了rom_model -c选项 (Autoinitializes variables at run time)。

,

Yu Wang5:

Shine,你好

感谢你的回复。我已确认我在工程properties->Build->C6000 Linker->Advanced options->Runtime Environment->Initialization model选项中选择了Link using ROM autoinitialization model(—rom_model, -c)选项。请问还有什么可能的原因吗?

期待您的回复。

,

Yu Wang5:

Shine您好,

请问有进一步的建议吗?期待您的回复。

,

Shine:

我把您的问题发到e2e上咨询产品线工程师,请关注下面帖子的回复。
e2e.ti.com/…/980337

,

Yu Wang5:

Shine,您好:
非常感谢您帮助我们询问工程师,我会继续关注英文论坛的进度,谢谢!

P.S.顺便说下最近的进度,我们将.neardata段放到LL2,同时零核.text段放到LL2,其它核.text段放到SL2,只有零核Neardata正常初始化了。

赞(0)
未经允许不得转载:TI中文支持网 » C6678全局变量初始化问题
分享到: 更多 (0)