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

基于BIOS多核工程的各个核在cfg文件中的内存分配问题

基于BIOS多核工程的各个核在cfg文件中的内存分配问题,我们在程序中根据DNUM来分配不同的核进入不同的处理中,但是在cfg文件各个核的代码段、far段、text段、堆栈段等如何区分呢?本人目前使用C6678中的两个核,主核0负责网口实时接收数据,核1负责算法处理。而在核1处理数据进入子函数后出现子函数返回主函数的地址被改写,以至于出现如下问题

c041490 A13=0x2

A14=0x1ffffffe A15=0x0
A16=0x861b38 A17=0x1
A18=0x861b2c A19=0x861b1c
A20=0x861b34 A21=0x861b24
A22=0x861b30 A23=0x861b3c
A24=0x1 A25=0x861b44
A26=0x861b20 A27=0x861b40
A28=0x861b10 A29=0x861b18
A30=0x8100 A31=0x1
B0=0x8100 B1=0x1
B2=0x861b08 B3=0x80856aae
B4=0x861af8 B5=0x861b28
B6=0xc053938 B7=0xc05a91a
B8=0x2 B9=0x861ad0
B10=0x861b00 B11=0x2
B12=0x861b04 B13=0x861b0c
B14=0x80856b16 B15=0x861a28
B16=0xc05957c B17=0x0
B18=0x2e20000 B19=0x0
B20=0x0 B21=0x861a60
B22=0x0 B23=0x861a60
B24=0xffffffff B25=0xffffffff
B26=0xfffffff7 B27=0x0
B28=0x66666666 B29=0x30666666
B30=0x8002c698 B31=0x8085fdb4
NTSR=0x0
ITSR=0x2
IRP=0xc053938
SSR=0x0
AMR=0x7
RILC=0x861aac
ILC=0x80856c08
Exception at 0x0
EFR=0x2 NRP=0x0
Internal exception: IERR=0x1
Instruction fetch exception
ti.sysbios.family.c64p.Exception: line 255: E_exceptionMin: pc = 0x31010b1c, sp = 0x0c05a91a.
To see more exception detail, use ROV or set 'ti.sysbios.family.c64p.Exception.enablePrint = true;'
xdc.runtime.Error.raise: terminating execution

根据提示可以知道只是地址冲突产生的问题。我将两个核进行sys reset 后发现 这两个的main函数地址全是一样的,这样的话后面两个同时跑,出现各个段地址被相互改动就很有可能。我的问题是如何在cfg通过配置将两个核的各个段独立出来,这样互不干涉,才能使整个工程不回出现异常!请教一下各位,谢谢咯!(关于修改cmd文件的配置我知道怎么改,但是基于BIOS工程如何改,我不太清楚)

Gangping Li:

查询main函数的地址发现,该工程代码段放置在共享存储中。我觉得既然每个核都有自己L2,那如何配置cfg文件才能将自己的代码段放置在自己那个核的L2,这样岂不是既避免了函数之间的地址相互修改,又能充分利用每个核的资源,还能释放共享存储!希望各位能知道!谢谢了!

Andy Yin1:

只要堆栈独立即可,代码段可以是共享也可以是独立的,全局数据段也是根据应用需求觉得。

Gangping Li:

回复 Andy Yin1:

Andy,你好!由于现在工程问题出现在核1运行时子函数返回地址错误,所以我认为是由于两个核同时启动,两个核的代码有相互修改导致子函数不能返回主函数。那么如何使得代码段相互独立开呢,还有就是如何把堆栈独立开呢?这个问题困扰了很久了,谢谢Andy哦!

Li Chuanzhi Li Chuanzhi:

回复 Gangping Li:

hi Gangping, 你的问题解决了吗?我们也遇到了类似的问题,弄了几天了,一直没有结果。项目较紧,打算把此问题抛出来,寻求外协。我联系方式:Q(一四四零零七四六),多谢!

dong zhang5:

回复 Gangping Li:

可以在platform中设置bios系统的cmd文件,可以在cfg文件中的cfg Scrip指定变量类型的存储空间,例如Program.sectMap[".externalMEM"]={runSegment: "DDR_1"};Program.sectMap[".far"]={loadSegment: "L2SRAM_1"}。

Gangping Li:

回复 dong zhang5:

谢谢你的建议,请问你所说的“可以在platform中设置bios系统的cmd文件”,在哪里设置呢?(我没有找到);是不是在设置好了BIOS系统的cmd文件之后,再利用“Program.sectMap[".externalMEM"]={runSegment: "DDR_1"};Program.sectMap[".far"]={loadSegment: "L2SRAM_1"}”这几句来指定变量的位置。“Program.sectMap[".externalMEM"]={runSegment: "DDR_1"};Program.sectMap[".far"]={loadSegment: "L2SRAM_1"}”这里面的DDR_1,L2SRAM_1是自己在CDM文件定义的还是BIOS里面默认存在的呢?

Gangping Li:

回复 Li Chuanzhi Li Chuanzhi:

我目前是解决了这个问题,但是只是目前解决了,我没有找到产生问题的原因,也没有找到最彻底的方法,我觉得可以后面还有可能存在这类问题。

dong zhang5:

回复 Gangping Li:

这些地址段是在platform文件里自己定义的。在CCS Debug模式下选择Tools -> RTSC Tools -> Platform -> Edit.选择好路径就可以设置你的bios工程的platform文件了。设置好cmd文件就可以在cfgScrip里来指定具体变量类型的存储地址。另外我想问下你怎么解决的?学习学习经验。我貌似也是遇到过,调试有时可以有时卡住,有时正确有时错误这种奇怪问题,不过我没像你考虑的这么深入。总之就是学习过程很头疼。

Gangping Li:

回复 dong zhang5:

具体要看代码的架构,我改的是在线程中加了大无限循环,去除了建工程默认的bios_exit函数。我从生成的cmd文件查看地址(在Debug中)发现我只用到了DDR的八分之一存储,而且不能将属于各个核的代码分开(用CSL_chipReadReg (CSL_CHIP_DNUM)只能告诉各个核应该执行哪一段代码,而不能把专属于某核的代码值存在该核中)。 还有就是这张图里面的“DDR3”是系统在哪里定义了(我没找到),我想只要找到“DDR3”等这类系统定义的存储器名称,我们就能更改各个存储器的大小,以至于我们就能根据我们的需求,来分配各个储存资源

赞(0)
未经允许不得转载:TI中文支持网 » 基于BIOS多核工程的各个核在cfg文件中的内存分配问题
分享到: 更多 (0)