Microchip
直播中

陈燕

7年用户 1099经验值
私信 关注
[问答]

独立十六进制时没有启动呢?

嗨,我的Bootloader显示了一个Struts行为(至少对我来说)。我有一个引导加载程序和一个应用程序。当我使用统一的十六进制,由MPLABX创建时,一切都运行良好。引导加载程序启动、检查其条件并启动应用程序(基本上通过调用_RESET_ADDR中的地址)。在下一次重新启动时,将触发引导加载程序加载新的应用程序十六进制(不是统一十六进制,而是单个应用程序十六进制)并对闪存进行编程。它试图启动应用程序,但失败并进入重新启动循环。请注意,应用程序本身没有改变!这就是奇怪的部分:为什么应用程序在带有统一十六进制时启动时没有问题,而在闪烁“独立十六进制”时没有启动呢?两者应该有相同的内容,不是吗?到目前为止,我实际上是通过将EBASE地址放在KSG00SuffyTyMeM中来实现应用程序的工作。现在我需要理解为什么这样工作。有人能解释一下为什么ebase地址需要位于kseg0_._mem内部吗?我认为KSt00Studio MEM基本上是C程序。我也在这个论坛上看到,eBASE可以从任何地方开始从和谐1.08。在大多数示例中(如在AN1388中),ebase是0x9d000000,而kseg0_._mem在此之后开始。*统一过程做什么?它可能会改变地址而不这样说。*当前配置是否正确(安全使用)?或者这只是巧合吗?我使用的是PIC32 MZ2048 EFM114。引导加载程序本身松散地基于HARMony加载程序,但是完全不同(但是它使用NVM.c来编程应用程序)。我确信十六进制的字节被正确地写到闪存中。这是我的bootloader.ld(引导加载程序被放置在引导内存中)和(不工作)application.ld:这是可以工作的application.ld(引导加载程序没有改变):

回帖(3)

胡芝恒

2020-3-19 10:49:42
你需要再往下看。这就是在KSG00SuffyTym MEM的开始放向量表的原因。不一定要这样。如果给kseg0_boot_mem设置适当的大小,并将“>kseg0_._mem”更改为“>kseg0_boot_mem”,则只要向量table.ebase位于4K边界上,就可以在任意位置放置。这是因为EBASE的低12位用零填充。
举报

李郝荫

2020-3-19 11:06:13
谢谢你的暗示。但是我仍然没有掌握它的诀窍。现在我给kseg0_boot_mem一个长度,并将其放在程序闪存的开头。我把kseg0_._mem放在离它稍远的地方,并将单个异常向量移动到kseg0_boot_mem。ebase是kseg0_boot_mem和reset_vector的开始。指向kseg1_boot_mem。在bootloader项目中,我将0x9D002000设置为应用程序地址,这将是kseg1_boot_mem的开始(对吗?)应用程序仍然无法启动。
举报

胡芝恒

2020-3-19 11:25:01
我看不出分配程序内存的方式有什么明显的错误。但是,如果查看PIC32MZ2048EFM144.ld的默认链接器脚本,您将看到链接器脚本似乎缺少其他区域。默认链接器脚本具有缓存初始化数据和所有配置词的KSK1YBoToMyMy4B0。你能用默认的模板做一个新的吗?一旦您这样做了,您可以简单地将_RESET_ADDR更改为9FC0_0000,并将kseg1_boot_mem的原点更改为9FC0_0000,并且应用程序应该能够在没有引导加载程序的情况下运行。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分