我想在core0读取一个coff格式的.out文件,把它加载到core1-7的内存,然后通过IPC中断执行改程序,请问怎么指定核的序号?还有内存访问有没有什么要注意的,比如我从.out文件读出来的目的地址是0x1000000,想把程序加载到这的语句应该怎么写?
跪谢!
Andy Yin1:
您好,
多核加载时首先会有特定的工具进行文件格式的转换与合并得到最终一个镜像文件,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
water sea:
回复 Andy Yin1:
感谢 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 sea:
回复 Andy Yin1:
感谢Andy 和King Wang 的帮助,我明白了,谢谢!
water sea:
回复 water sea:
我试了通过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赋值不起作用,需要怎么操作?另外我的整个过程是不是正确的,谢谢!
King Wang1:
回复 water sea:
你好:
你是否直接就将out文件导入内存?事实上out文件需要解析之后才能导入。不是找未用的内存导入就能起作用。
out文件解析后会有需要导入的地址,导入的长度和导入的内容,你需要根据这些信息按照正确的地址导入。
out文件的解析可参看bootloader里面的I2C master的章节,里面介绍使用工具进行out文件解析。
water sea:
回复 King Wang1:
King Wang 你好:
你说的解析是指用hex6x将.out文件转化成.hex文件吧,转化之后的文件有地址,数据等内容,是直接向这个地址写入数据吗?另外入口点,就是c_init0怎么放到MAGIC_ADDR去,是不是也是从.hex读取c_init0的值,谢谢!
King Wang1:
回复 water sea:
你好:
你的理解是正确的,解析之后根据地址导入数据。
_c_int00的函数是在编辑out文件的时候可以知道的,一般你要将这个_c_int00放置到一个特定的地址(使用.sect)命令。如果没有指定特定的地址就通过map文件查看。然后将这个地址写到MAGIC_ADDR就可以了。
谢谢!
water sea:
回复 King Wang1:
谢谢King Wang 的快速回复,按照您说的意思,我生成了一个默认格式的.hex文件,其数据格式是%4E6…800000000…其中4E表示一行的字符数,8表示地址位数,00000000为第一行的地址,再之后是一行数据共64个字符,我把这个地址取出来了,这个地址是绝对地址吗,如果是那我怎么确定后面的数据是写到相应的核(0核以外的其他核)的内存呢,是不是也是用各个核的L2内存地址计算方式(0x1n800000,n为核序号)再加上这个地址,谢谢?