请问 chunlei gan ,你在SYS/BIOS系统下使用IPC多核触发的过程是怎么样的,就是加载一个.out文件到内存还是哪里,能说说你具体的步骤吗?
我调试这个功能很久没能成功,做法是:
1,先生成一个helloworld的out文件,并在开发板上仿真通过,就是打印一个hello world;
2,新建一个工程,启动SYS/BIOS,新建一个task,在核0上调试这个工程;
3,在task中将之前生成的helloworld.out(COFF格式)通过解析,得到段头SectonHead,从中得到加载的目的地址SectonHead.PhysicalAddr,将SectonHead.PhysicalAddr加上每个核的L2基地址即0x1n000000(n为核序号)作为最终的目的地址,将RawDataPointer指示的原始数据复制到目的地址,每个核的L2内存都复制一份;
4,向每个核的MAGIC_ADDR写入helloworld程序的入口点,比如从helloworld工程的map文件读出来的入口点是0x80000,我就把0x80000写到0x1n87fffc(n为核序号);
5,向每个核的IPCCFG寄存器最低位写1,即发送一个IPC中断。
我认为如果成功启动其他核,应该在console窗口打印一行hello world,但始终不成功,不知有什么问题,不知道您是怎么做的,请多指教!我的邮箱是water_sea@yahoo.cn,谢谢!
Andy Yin1:
您好,
文件中由core0向需要触发的核的MAGIC_ADDRESS写入C_init00的地址,并写每个核的IPCGR,将代码及数据段都放在SL2,堆栈放在L2,然后将将生成的out文件下载到通过core0 load,运行起来就能看到其他每个核运行的情况。
water sea:
回复 Andy Yin1:
感谢Andy Yin 的回复!还有两点疑问:
1.你说的“由core0向需要触发的核的MAGIC_ADDRESS写入C_init00的地址”,我是把hello world.out的C_init00的值直接写进去了,是不是应该写进当前工程的C_init00,我发现写当前C_init00的地址,值和当前工程map文件的C_init00值一致。
2.你说的SL2和L2有什么区别?我是按coff文件格式解析出来的地址去放的,你说的“将代码及数据段都放在SL2,堆栈放在L2”怎么操作,是指helloworld的代码及数据段吗?
谢谢!
water sea:
回复 water sea:
我通过仿真器将corepac0跑起来以后,去看它的BOOT_MAGIC_ADDR(0x1087fffc),其中的内容并不是_c_int00的地址,不知道放的是一个什么值,我应该在core1的BOOT_MAGIC_ADDR(0x1187fffc)写入什么值?
另外我通过core0将一个hello。out程序加载到core1的L2内存,再通过在寄存器窗口强制修改PC的值,使core1跳出IDLE,然后在反汇编窗口单步执行,当执行到我写到core1的BOOT_MAGIC_ADDR(0x1187fffc)的值(0x54a0)时,报“Security violation occurred,…(code 2)”,不知这是什么错
chunlei gan:
HI water sea ,
你不要连仿真器,直接在每个核去写一个地址数据看看,如果你连接了仿真器,说明core被仿真器已经触发了。又何必通过去写IPCCFG的操作呢。你先试下不连接仿真器看看。
water sea:
回复 chunlei gan:
感谢chunlei gan的回复,我只是用仿真器启动了core0,其他核没启动,我的程序没有boottable,用的例子就是你的http://www.deyisupport.com/question_answer/f/53/t/6068.aspx,加载了一个heloworld.out,但始终不行,如果我不接仿真器怎么调试呢?另外方便留下你的邮箱么?
chunlei gan:
回复 water sea:
HI water,
不接仿真器可以通过写DDR数据或者用闪灯操作调试的。你要改下platform的。把数据段和代码段都放在MSMC上,而不是L2上,在tools->RTSC tools->platform->edit(new).改下存放位置。也可以直接修改6678l的platform。
water sea:
回复 chunlei gan:
chunlei gan,感谢你的回复!
你的那个sysbios工程是在C6678EVM板上调试的吗?最后是能闪灯是吧,我对你程序里的write_boot_magic_number(i)这个函数的作用不是很明白,其实现是{DEVICE_REG32_W(MAGIC_ADDR,(BOOT_MAGIC_NUMBER+i))},麻烦说明一下,谢谢!
chunlei gan:
回复 water sea:
HI,water
我用的是公司自己的板子,不是demo板子,只有gel文件不同,你可以参考用demo的gel;
这句话我是参考文档的,
-》Linux host then pushes the HelloWorld boot image data to DDR memory, then writes the boot
entry address of the HelloWorld boot image to the magic address on core 0 to boot core 0. Core 0
starts to boot and print the “Hello World” booting information, and then boot all the other cores
by writing the address of _c_int00 to the magic address on other cores and sending an IPC
interrupt to other cores. The RBL running on other cores will jump to _c_int00 and start to boot,
each core will write 0xBABEFACE to its magic address by running a function
write_boot_magic_number().
这块代码原先就写好的,我并未做改动。你可以参考C:\Program Files\Texas Instruments\mcsdk_2_00_04_16\tools\boot_loader\examples\pcie\pcieboot_helloworld\evmc6678l的代码和pdf文件
你现在还是不行么?你有没有修改platform文件?这个必须要做修改的。
water sea:
回复 chunlei gan:
chunlei gan,感谢你的回复。我现在能实现功能,但需要手动修改core1的PC指针,让core1跳出IDLE状态,通过程序写IPCCGR寄存器不起作用,我发现是在一开始UNLOCK 寄存器不起作用,向KICK0和KICK1寄存器写那两个值好像就没写进去,不知道怎么回事