完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
我想在core0读取一个coff格式的.out文件,把它加载到core1-7的内存,然后通过IPC中断执行改程序,请问怎么指定核的序号?还有内存访问有没有什么要注意的,比如我从.out文件读出来的目的地址是0x1000000,想把程序加载到这的语句应该怎么写?
跪谢! |
|
相关推荐
15 个讨论
|
|
|
您好,
多核加载时首先会有特定的工具进行文件格式的转换与合并得到最终一个镜像文件,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 |
|
|
|
|
|
|
|
zbb9612 发表于 2018-12-26 10:10 感谢 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的内容? 谢谢! |
|
|
|
|
|
|
|
77uufuwr 发表于 2018-12-26 10:18 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赋值不起作用,需要怎么操作?另外我的整个过程是不是正确的,谢谢! |
|
|
|
|
|
|
|
77uufuwr 发表于 2018-12-26 11:05 你好: 你是否直接就将out文件导入内存?事实上out文件需要解析之后才能导入。不是找未用的内存导入就能起作用。 out文件解析后会有需要导入的地址,导入的长度和导入的内容,你需要根据这些信息按照正确的地址导入。 out文件的解析可参看bootloader里面的I2C master的章节,里面介绍使用工具进行out文件解析。 |
|
|
|
|
|
|
|
MAZHILEI 发表于 2018-12-26 11:22 King Wang 你好: 你说的解析是指用hex6x将.out文件转化成.hex文件吧,转化之后的文件有地址,数据等内容,是直接向这个地址写入数据吗?另外入口点,就是c_init0怎么放到MAGIC_ADDR去,是不是也是从.hex读取c_init0的值,谢谢! |
|
|
|
|
|
|
|
77uufuwr 发表于 2018-12-26 11:39 你好: 你的理解是正确的,解析之后根据地址导入数据。 _c_int00的函数是在编辑out文件的时候可以知道的,一般你要将这个_c_int00放置到一个特定的地址(使用.sect)命令。如果没有指定特定的地址就通过map文件查看。然后将这个地址写到MAGIC_ADDR就可以了。 谢谢! |
|
|
|
|
|
|
|
77uufuwr 发表于 2018-12-26 12:09 你好: 代码的地址是在编译链接时确定的。比如你的funcA的地址在0x80000000这个位置,是你的代码中将funcA()放到了这个位置所在的section中。换个话来说,编译链接之后代码位置就固定了,你不能随便更改。 你只有在编译前更改你的cmd文件,将代码放到你需要的空间中,比如核1的LL2,空间为0x11800000开始,你将代码放到这个空间中,通过cmd文件设置section,然后通过设置代码放到这个section中。 谢谢! |
|
|
|
|
|
|
|
MAZHILEI 发表于 2018-12-26 12:29 我将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选项。不知我的做法是否正确,谢谢! |
|
|
|
|
|
|
|
只有小组成员才能发言,加入小组>>
545 浏览 0 评论
1609 浏览 0 评论
2045 浏览 0 评论
为啥BQ7693003DBTR芯片在和BQ769X0盒子通讯时收不到信号?
1507 浏览 0 评论
DSP 28027F 开发板 XDS100v2调试探针诊断日志显示了 Error -150 (SC_ERR_FTDI_FAIL)如何解决
1331 浏览 0 评论
AT32F407在USART2 DMA发送数据时,接包接到了要发送的数据,程序还是处于等待传输完成的标识判断中,为什么?
1756浏览 29评论
2781浏览 23评论
请问下tpa3220实际测试引脚功能和官方资料不符,哪位大佬可以帮忙解答下
1723浏览 20评论
请教下关于TAS5825PEVM评估模块原理图中不太明白的地方,寻求答疑
1634浏览 14评论
两个TMP117传感器一个可以正常读取温度值,一个读取的值一直是0,为什么?
1645浏览 13评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-1 17:28 , Processed in 1.739597 second(s), Total 93, Slave 77 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
4539