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.

6670 多核boot



Hi all,

请问如果要想把6670的4个核都boot起来,是每个核都需要一个.out文件吗?各个核是如何知道哪个.out文件对应哪个核的?

是利用cmd文件吗?我试过在里面的MEMORY段定义各个核的L2地址,但是生成的boot table里面的地址都是一样的。请问该如何设置?

我知道最终多个核的boot table要合并为一个table,但是各个核的boot table在整个表中的位置是怎么确定的?由于主核要向其他核的MAGIC_ADDRESS处写其他核的应

用程序的地址,这些地址该如何获得呢?

Thanks a lot

Nick

  • Nick 你好:

    4个核使用4个out文件。

    每个out文件的cmd文件需要不一样,其中L2的section要使用物理地址,比如core0 使用 0x10800000,core1使用0x11800000等;这样每个table的地址就不一样了。

    而core0是主核,core0负责download所有代码和数据(包括其余核)到DSP。core0的MAGCI_ADDRESS是在core0的boot table中写进去的,其余Core的table也会写各自的MAGIC_ADDRESS。

    core0 download完成之后,会给其余Core发送IPC中断,然后所有核就都各自跳转到MAGIC_ADDRESS的地方开始运行。

    最后补充一点,多个core的table可以用工具merge在一起,具体谁的位置在哪里都没关系。

  • Hi King,

    我在cmd文件中的MEMORY部分定义了core0使用本地L2地址,也就是0x10800000。之后在下面的SECTION部分分别

    定义了把变量、程序等都放到这个地址处。但是在编译过后,.map文件中依然显示程序的入口地址是在公共L2中。请

    问这是怎么回事呢?

    还有,你上面所说的“core0的MAGCI_ADDRESS是在core0的boot table中写进去的”, 意思是在写各个核的程序时不

    用在程序里写明把各个核的应用程序的地址写到MAGIC_ADDRESS中,是吗?这个过程是自动完成的?

    core0 download完之后,给其他核发IPC中断,关于发送IPC中断,是不是只是将IPCGR这个寄存器呢?还需要其他一

    些什么操作吗?

    Thanks a lot

    Best regards,

    Nick

  • Nick:

    你好,你说的程序入口地址是什么函数?该函数是放在.text段中么?而.text指定的memory是哪段内存?

    MAGIC_ADDRESS的值是在解析out文件时加入的,也就是在hex6x工具的附加指令,不需要用户编程。

    发送IPC中断也是由bootloader完成的,不需要用户做,就是写IPC中断寄存器。

    谢谢!

  • Hi King,

    程序入口地址就是_c_int00的地址。首先我在MEMORY段中写了这条语句“C0LL2MEM: origin = 0x10820400 length =

    0x000f0000”,这个是核0的程序,所以放在核0的L2处。下面我又在SECTION段中定义了“.boot: > C0LL2MEM,.text: >

    C0LL2MEM,.data: > C0LL2MEM”等等。但是编译完之后,.map文件中显示_c_int00的地址依然为公共L2的地址。不

    是应该为core0本地L2的地址了吗?

    你所说的“MAGIC_ADDRESS的值是在解析out文件时加入的”是指用hex6x工具时的“-e”指令吗?

    “发送IPC中断也是由bootloader完成的,不需要用户做”,但是如果我不在程序中将IPCGR0的IPCG位置1,core0怎么会

    触发IPC中断呢?

    Thanks a lot

    Best regards,

    Nick

  • Nick你好:

    你可以看看map文件中对c_int00的定义,比如:

    1084f140    00000080                      : boot.obj (.text:_c_int00)

    这个说明_c_int00函数在boot.c中,并且在.text section中,然后你查.text的定义(也是在map中)

    SEGMENT ALLOCATION MAP

    run origin  load origin   length   init length attrs members

    ----------  ----------- ---------- ----------- ----- -------

    10800000    10800000    00000200   00000200    r-x

     10800000    10800000    00000200   00000200    r-x .csl_vect

    10802000    10802000    00040000   00000000    rw-

     10802000    10802000    00020000   00000000    rw- .stack

     10822000    10822000    00020000   00000000    rw- .sysmem

    10842000    10842000    0000da40   0000da40    r-x

     10842000    10842000    0000da40   0000da40    r-x .text

    这说明.text在LL2中。

    根据这样你能查询到是哪里没有对上,继而找到问题的原因,比如cmd文件格式书写有误等。

    hex6x中的-e是MAGIC_ADDRESS。你的boot过程(在进入_c_int00之前)都是通过bootloader完成的,跟你的代码没有关系,这是一段DSP内部固化的ROM code,它会完成boot过程并且发送核间中断。

    谢谢!

  • Hi King,

    谢谢你的回复。我现在多核boot的情况是这样的:核0可以起来,想把核1也boot起来。但是现在的问题是,无法触发

    IPC中断,也就是想IPCG1寄存器写值的话,没有效果。该寄存器还维持上电时候的数值。

    还有,我想问一下,在写IPC寄存器之前是不是要先写KICK0、KICK1寄存器呢?我看E2E上面有人是这么说的。但是我

    调用CSL库中的函数,CSL_BootCfgUnlockKicker(),但也是写寄存器不成功。请问这是怎么回事?

    Thanks a lot

    Best regards,

    Nick

  • Hi, Nick

    不知道你的多核boot怎么样了?

    在触发IPC中断前,确实需要先写kick0、kick1寄存器,如果调用csl库写入失败的话,你可以直接对这两个寄存器赋值。

    #define CHIP_LEVEL_REG  0x02620000

    #define KICK0          *(volatile int * ) (CHIP_LEVEL_REG + 0x0038)

    #define KICK1          *(volatile int * ) (CHIP_LEVEL_REG + 0x003C)

    /* Unlock the chip registers */

    KICK0 =0x83e70b13;

    KICK1 =0x95a4f1e0;

    应该可以写IPC寄存器了吧。

  • Hi tthnny,

    现在我是想用core0 boot从flash core1,但是就有困难了。关于您说的方法我也试过了,但是IPC寄存器还是写不进去,

    我是通过JTAG看DSP的内存。请问还有什么方法吗?

    而且,请问如果我需要给core1的MAGIC_ADDRESS处写地址,是否也需要先写KICK0、KICK1寄存器呢?

    Thanks a lot

    Best regards,

    Nick

  • Nick 你好:

    写IPC寄存器需要写KICK0和KICK1,,我不是太理解你的 Core0 boot 从flash core1是什么意思?

    如果写Core的MAGIC_ADDRESS,不需要写KICK0和KICK1,KICK0和KICK1主要是保护Device的register的,你的MAGIC_ADDRESS只是一个memory的地址,不是寄存器地址。

    谢谢!

  • Hi King,

    现在可以了,可以通过core0bootcore1了,感谢你的帮助。

    Thanks a lot

    Nick

  • 你好,请问你是如何通过core0 来boot core1的,我现在用SI flash成功引导程序boot起来核0,代码存放在core0的L2,然后core0把自己的L2的东西搬移到core1,修改core1的Magic address的地址为 程序的入口地址_c_inint.然后向core1给个IPC中断,但是core1boot起来后并没有跳到指定的位置,我用仿真器连接看core1的PC指针,发现只想0x70000000后面的某一块地址。我手动修改PC后core1可以正常跑了,这是为什么??我那一步错了呢?

    另外我是用EDMA吧core0的整个L2的数据搬移到core1的L2中的。

  • Hi Nick:

    我现在在尝试6670的多核引导部分,看了这篇帖子后很有启发,但是有很多地方还是不懂,还没有实现多核引导。第一个问题是,您是不是将4个.out文件合在了一起,如果是那么具体操作是怎样的呢?用了哪个工具,如何操作呢?第二个问题,您是不是将核0运行的project中多核引导程序段放在核0的L2处(即在cmd文件中体现),其他程序段放在公共存储区内,核1,2,3运行的project的程序段放在公共存储区内?第三个问题,我在写KICK0/1寄存器时无法写入,请问您知道其原因么?第四个问题,如何利用IPC发中断给其他核,只是需要写IPCGR0~7么?第五个问题,如何写MAGIC_ADDRESS,是将其他核project的程序段的入口地址写给MAGIC_ADDRESS么?如果是,那么是不是发一个中断写一个入口地址呢(比如说发IPC给CORE1后写其程序段入口地址)?

    Million thanks

    Tom

  • Hi,Tom

    1. 是将4个核的.out文件和在一起了,具体用的工具比较多,你可以留下你邮箱,我给你发过去。

    2. 我们使用的是I2C启动模式,核0的程序是放到本地L2处了。其他核的程序放在哪里都可以,可以放在各个核本地L2,也可以放到共享内存中。

    3. 这两条语句就可以解锁KICK0和KICK1寄存器,其中具体要包哪个头文件,你在查下吧。    DEVICE_REG32_W(KICK0, 0x83e70b13);    DEVICE_REG32_W(KICK1, 0x95a4f1e0); 4. 关于IPC中断的话,就是写那个寄存器,具体也是下面的语句。IPCGR1这个寄存器地址你应该可以找到吧,然后写1就可以了    DEVICE_REG32_W(IPCGR1, 1);

    5. 写MAGIC_ADDRESS地址就是将各个核的应用程序入口地址找到,分别写到这个地址就可以了,没什么特殊的。 其他三个核的MAGIC_ADDRESS为:0x118FFFFC,0x128FFFFC,0x138FFFFC

    希望可以帮到你

    谢谢

    Nick

  • Hi, Henry

    关于你说的boot core1的时候,把core0的程序搬移到core1的L2,我不太清楚这样行不行,我没有尝试过。

    你可以将两个核的程序分开写,并将.out文件利用工具合称为一个,再试试。我就是这样做的。

    Thanks

    Nick

  • Hi,Nick

    谢谢你的解答,麻烦把工具发送到huasy123@126.com,另外,你那里有比较简单的例子程序么?也一起发给我参考一下行么,谢谢!

    Million thanks

    Tom

  • hi Henry

        我最近也在学习EDMA3,有很多问题都不是很懂,请问,你能将你的例程代码发给我看看嘛?ti给的相关文件看的不是很清楚,我的邮箱是zyl719153877@163.com.

     thanks a lot

                                  yueling zhu

  • 您好,请问可不可以交流一下,你的EMAIL多少啊?

  • 不好意思,最近在忙别的事情,一直没上论坛。是要我的邮箱吗?不是的话也可以互相交流下,我的QQ478005930