我想在core0读取一个coff格式的.out文件,把它加载到core1-7的内存,然后通过IPC中断执行改程序,请问怎么指定核的序号?还有内存访问有没有什么要注意的,比如我从.out文件读出来的目的地址是0x1000000,想把程序加载到这的语句应该怎么写?
跪谢!
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.
我想在core0读取一个coff格式的.out文件,把它加载到core1-7的内存,然后通过IPC中断执行改程序,请问怎么指定核的序号?还有内存访问有没有什么要注意的,比如我从.out文件读出来的目的地址是0x1000000,想把程序加载到这的语句应该怎么写?
跪谢!
您好,
多核加载时首先会有特定的工具进行文件格式的转换与合并得到最终一个镜像文件,bootloader会根据加载方式解析镜像文件,并将每个核的程序分发到不同的地址,从而完成各个核程序的加载;bootloader会向core0的MAGIC_ADDRESS写entry address启动core0从入口开始执行;如果想要触发其他的core,则需要由用户在core0添加应用程序分别向其他core的magic address写入每个core的entry address,并分别写IPCGR,进而触发其他core。
为了更清楚应用程序在不同加载方式时的需要添加的特定工作,需要先理解bootloader执行的过程,请参考rom source code:www.deyisupport.com/.../6352.aspx
感谢 Andy Yin的答复!
还有两点疑问,你说的那个镜像文件是不是用hex6x生成的.hex文件?我想用仿真器启动core0,core0启动其他核,是不是还不涉及bootloader,问题就是我怎么从core0把程序加载到其他核可以访问的内存,可能我领悟的不透,请多指教?
关于MAGIC_ADDR,我在C6678的bootloader的userguide文档中查到是说对于C6678,BOOT_MAGIC_ADDR是0x807FFF,而当King Wang给我的回复中说“代码加载完毕之后,你需要更改其他core的MAGIC ADDRESS。如果我没有记错的话应该是0x10873680+n*1000000,其中n是核号”,我不知道他这个计算MAGIC ADDRESS的方法是在哪个文档中查到的?在C6678的user manual中,寄存器列表中有每个corepac的BOOT_START_ADDR,其地址是0x02620000起始的一系列地址,这个和MAGIC ADDRESS是同一个东西吗,如果不是,什么文档中有关于MAGIC ADDRESS的内容?
谢谢!
water你好:
三点需要说明下:
1,MAGIC_ADDR以你查到的手册为准。
2,关于其他核可以访问的内存,我想DSP中只有LL2是私有的,其他都是公有。公有的就证明地址都一样,你core0直接将代码考入这个地址,其他核就可以通过这个地址访问。如果你想拷入LL2,那么各个核的地址范围是从0x10800000+n*1000000,为起始地址,大小是1M。你可以通过n区分不同的核,这样你就写入了不同的核的LL2内存。
3,当你拷贝完代码和数据后,需要将MAGIC_Address改成你想要的入口地址,比如你将Fun_A()的地址写到core1的MAGIC_Address之后,给Core1发送一个IPC中断,Core1就会从Func_A()的地址开始Run起来了。这样就完成了加载。
不知这样解释是否清楚,谢谢!
我试了通过core0把一个编译好的a.out(elf格式)先装入其他核的L2内存,做法是参考CCS一个自带的MemorySharing,找到一块未用的L2内存,把a.out的内容复制进去,然后把MAGIC_Address改为_c_init0,然后启动各个核的IPC中断,发现没有反应。我看了一下当前工程的map文件,发现_c_init0是当前的b.out的值,比如为0x8000000,是不是需要把a.out程序对应的_c_init0值,比如为0x820000,写入MAGIC_Address才起作用,我试了直接给_c_init0赋值不起作用,需要怎么操作?另外我的整个过程是不是正确的,谢谢!
你好:
你是否直接就将out文件导入内存?事实上out文件需要解析之后才能导入。不是找未用的内存导入就能起作用。
out文件解析后会有需要导入的地址,导入的长度和导入的内容,你需要根据这些信息按照正确的地址导入。
out文件的解析可参看bootloader里面的I2C master的章节,里面介绍使用工具进行out文件解析。
King Wang 你好:
你说的解析是指用hex6x将.out文件转化成.hex文件吧,转化之后的文件有地址,数据等内容,是直接向这个地址写入数据吗?另外入口点,就是c_init0怎么放到MAGIC_ADDR去,是不是也是从.hex读取c_init0的值,谢谢!
你好:
你的理解是正确的,解析之后根据地址导入数据。
_c_int00的函数是在编辑out文件的时候可以知道的,一般你要将这个_c_int00放置到一个特定的地址(使用.sect)命令。如果没有指定特定的地址就通过map文件查看。然后将这个地址写到MAGIC_ADDR就可以了。
谢谢!
谢谢King Wang 的快速回复,按照您说的意思,我生成了一个默认格式的.hex文件,其数据格式是%4E6...800000000...其中4E表示一行的字符数,8表示地址位数,00000000为第一行的地址,再之后是一行数据共64个字符,我把这个地址取出来了,这个地址是绝对地址吗,如果是那我怎么确定后面的数据是写到相应的核(0核以外的其他核)的内存呢,是不是也是用各个核的L2内存地址计算方式(0x1n800000,n为核序号)再加上这个地址,谢谢?
你好:
代码的地址是在编译链接时确定的。比如你的funcA的地址在0x80000000这个位置,是你的代码中将funcA()放到了这个位置所在的section中。换个话来说,编译链接之后代码位置就固定了,你不能随便更改。
你只有在编译前更改你的cmd文件,将代码放到你需要的空间中,比如核1的LL2,空间为0x11800000开始,你将代码放到这个空间中,通过cmd文件设置section,然后通过设置代码放到这个section中。
谢谢!
我将a.out生成默认格式的a.hex文件后,其数据格式是%4E6...800000000...其中4E表示一行的字符数,8表示地址位数,00000000为第一行的地址,再之后是一行数据共64个字符;第二行类似,地址那个字段就是00000000,00000020,00000040,00000060,00000080...这些有规律的数,我总感觉这些地址不太像实际的内存地址,而且两个地址之间的距离也不足以放下后面的64个字符(即64字节),我参考的是spru186文档。hex6x的参数是写到a.cmd文件里,然后在windows的命令行窗口用 hex6x a.cmd命令生成的a.hex。a.cmd内容是生成默认格式的hex文件,entrypoint =_c_init0,romwidth = 32,memwidth = 32,用-boot选项。不知我的做法是否正确,谢谢!