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

使用SPI方式启动时,核0的magic地址为0而其他核的却正确,bootcomplete寄存器值为FF,而核0始终停留在boot rom范围内,寻求专家以及诸位高手的帮助。

各位好:

最近一直在研究SPI方式的多核启动,碰到一些问题想不通,有些心急如焚,希望得到大家的帮助,谢谢啊。

     我用的是自己设计的板子,然后 是不是如果我的boot parameter bable没错,镜像文件生成也没错,烧写入NOR flash也没错,bootmode模式也没错的话,就能顺利实现dsp的自启动。

1、首先描述一下我的遇到的问题,bootcomplete寄存器的值为000000FF,DEVSTAT寄存器的的值设置为0101000000110,也在编译的时候将每个核的L2的本地地址改为了全局地址,这些应该没问题,然而核0的magic address一直为0,而剩余的7核的magic address值都正确为0x0c000000,这是我通过一个multicoreboot 的子函数中将每个核的0x1*87fffc写入0x0c000000。出现上述现象原因是为何啊?

2、在启动过程中,是会初始化所有核的L2中的最后0xD23F个字节,还是只是核0的?下图是从核0的L2最后D23F个字节中相应的位置找出的,该位置对应存的应该是boot parameter bable,然而这些参数显示是后两个字节在前例如原来是00500000成为了00000050,不论大端还是小端,好像都不应该是这样,没找到bootloader的源码,所以不知是不是程序让其变成这样?应该没影响吧。

3、SPI启动过程,原理阐述的都是核0首先启动然后将各核的镜像文件搬至各核的L2中,然后再给各个核写magic address,最后再再给每个核发送核间中断。而因为我的工程比较大,所以将代码段分配到共享存储中去,具体任务通过DUMN区分,设计让每个核的程序入口地址都一样为0x0c000000,这样的设计在SPI启动过程中能启动成功吗?

4、由于启动一直没有成功,因此我到指定的地址查找看有没我要的代码(将导入dsp内的值与对应的.dat镜像文件的值进行对比),发现隔一定间隔个数发现不一致,有的会如下图所示有的1变成7,然而当我用NOR writer网flash写入的时候,提示的NOR programmimg completed successfully,出现这样的变化会影响启动吗?为什么会这样?

希望能得到大家的帮助啊,谢谢啊。。。。。

Allen35065:

1. 先不要管多核,仅core 0启动的话能不能成功?

2. SPI的读写接口可以通过写入回读验证一下。

zhifu yang:

回复 Allen35065:

您好,首先感谢您的回复。我写了个简单的工程每个核负责往ddr写指定的数,这样当它启动时便能查阅ddr以确认哪几个核是否有启动。

            按照您的提示,做了两次单核启动的尝试。

           1、我把代码段分配在L2中,能够成功启动,它的pc指针也停留在L2的范围内,ddr中也有核0所要的数,bootcomplete为0001,这样可以确认单核已启动。

           2、我把代码段分配在共享上,进行单核启动。pc指针停留在合理的范围内,bootcomplete为0001,ddr中也有我所要的数,第2次的单核启动也成功。

           3、我开始八核的启动,同样我分别做代码段分配在L2中与代码段在共享中。代码段在L2中的情况能成功多核启动。

           4、但是代码段分配在共享上只能启动核0与核1。核0与核1有成功往ddr写数。bootcomplete为0003,其他核的pc指针显示的位置在0x20B002A8,操作都没变只是修改代码段的分配位置而已。而且没有启动的核2~核7的IER寄存器显示使能四号中断,但是我为核间中断映射的是5号中断,为什么只有核0与核1是我所设置的。

                                                                            

           这样应该能判断我的boot table 是没问题!也就没有进行您说的对spi接口进行写入回读对比。

        1、在我所看的资料中,关于核0在启动时负责的任务都提到,核0将各核的镜像文件搬移至各自的L2中,而当我却是将代码分配在共享上,那么每个核的镜像文件中的代码段都一样?那么核0搬移代码的时候,实际过程是不是就类似于核1的代码段覆盖核0,核2覆盖核1这样?

         2、会不会是因为我将代码段分配在共享上,用SPI进行启动时从而影响到核间中断的发布与接收?那么怎么核1能接收到中断并唤醒,而其他核却收不到?或者说操作上有什么要另外注意的,例如对MSM进行什么配置?不然为什么当我将代码段分配在L2时其他核都能顺利被唤醒,而将代码段分配在共享上,同样的操作,却始终只能启动两核?

        急切地期待着您的回复,谢谢啊。。。

       

       

         

zhifu yang:

回复 Allen35065:

Allen,您好,每天都在期待您对我疑问的解答啊。疑问说到底旧事,代码段分配在共享上能不能通过SPi进行启动吗?为什么只有核1能收到核0发布的核间中断,其他核全部收不到,直接都停留在boot rom 的范围内,没有boot起来??尝试过代码段分配在L2中,多核能启动。

不知道什么导致问题的存在,详细写了我的过程,希望您看看!真的谢谢了,心里着急啊。。

          

Allen35065:

回复 zhifu yang:

抱歉,时间比较紧张,有时候没有办法及时回复。

我看了你的描述,现在两核能够正常启动,那么应该就没有太大问题了。

代码段共享肯定是没有问题的,不过我建议你把共享的代码做成lib的形式,这样可以保证其在内存的排布顺序是一样的,不会出现核之间的不同;

boot其它核的流程和boot 核1没有区别,就是写好boot magic address,然后发一个核间中断即可,而且你不需要在每个核实现核间中断的响应,这是DSP自身的响应。

我想你可以用几个简单的程序先试一试,检查boot magic address和核间中断是否正确,检查一下每个核的map文件看SL2里是否有地方冲突。

haotian chang:

你好问题解决了吗

赞(0)
未经允许不得转载:TI中文支持网 » 使用SPI方式启动时,核0的magic地址为0而其他核的却正确,bootcomplete寄存器值为FF,而核0始终停留在boot rom范围内,寻求专家以及诸位高手的帮助。
分享到: 更多 (0)