你好:
我最近在开发二级boot的时候出现如下的问题,我参考的是论坛中与startware库中关于boot的代码。
1.参考代码的流程都是spi从flash中读取app的代码,但是读出的app的代码存放的位置应该在什么位置?参考例程中是从flash读出的位置,并未明确
是不是需要根据app的地址进行修改
2.我自己开发的app代码需不需要注意什么,比如地址位置等,还是说只需要拿到entrypoint的位置,并在boot中跳转该位置就行了?
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.
你好:
我最近在开发二级boot的时候出现如下的问题,我参考的是论坛中与startware库中关于boot的代码。
1.参考代码的流程都是spi从flash中读取app的代码,但是读出的app的代码存放的位置应该在什么位置?参考例程中是从flash读出的位置,并未明确
是不是需要根据app的地址进行修改
2.我自己开发的app代码需不需要注意什么,比如地址位置等,还是说只需要拿到entrypoint的位置,并在boot中跳转该位置就行了?
二级引导加载的应用程序代码会存储在 Flash 。这些位置需要在编译时就确定好,并在引导代码中硬编码
我自己开发的app代码需不需要注意什么,比如地址位置等
代码大小不超过你为其分配的内存空间,并且它不会覆盖任何其他关键数据或代码
这个硬编码指的是什么操作?
是在代码中直接使用具体数值或地址,不是通过变量或参数来表示。指在代码中直接使用特定的地址、常数,而不是配置文件、宏定义
在二级 boot loader 中,硬编码为直接将 flash 中应用程序的地址固定在代码中
程序从flash中的固定地址开始执行,启动代码负责从flash中读取应用程序并将其加载到RAM中执行。这个过程会从flash中的预定义起始地址开始,这个地址可能是0,也可能是某个特定的地址。
对于二级跳转,确实应该从入口点地址跳转。这个地址在map文件中定义,就像您在图中看到的那样。
是这样的,我现在想做一个boot+app的二级boot。
1.我的app的entry point地址为,所有的data都放在了DDR中,DDR的起始地址为0xC0000000,用AIS生成了hex文件,通过自己设计的代码,spi烧入flash某个自定义的地址中(0x00200000)。
2.我的boot程序是参考startware的boot程序设计的,首先通过flash读出存在0x00200000中的代码,放入我预先定义的一个数组中,该数组的首地址定义在0xC0000000。然后跳转程序至entry point处,即0xc0c0fe40,但是现象是程序无法运行下去,像是在空跑
我感觉像是地址方面的问题,所以才询问你们的帮助。
ais生成的程序没有问题,我放在flash的0地址,程序是可以正常运行的;另外boot的程序地址和app的地址我也分开存放的,一个是在DDR的0xC0000000,一个是在0xC7000000。我的boot程序现在是接jtag在线调试的,并没有烧录进去。
是否是我地址的问题,或者是我操作步骤的问题呢?是否有可能的解决方向呢?
,我放在flash的0地址,程序是可以正常运行的;
这表明程序本身是没问题的。更可能是y问题出在了内存映射、跳转地址、Cache上
是否有可能的解决方向呢?
使用调试器检查一下`0xc0c0fe40`地址处的内存内容,看看是否和Flash中的`0x00200000`处的内容一致。
检查boot程序是否有正确的内存映射设置。
通过JTAG单步跟踪boot程序的执行,特别是在跳转到app之前和之后的行为
section load address
指的是程序的某个部分应当被加载到内存中的地址。它表明AIS文件中的数据将被加载到RAM的`0x80000000`地址。这表明您的boot程序应该将app的数据从Flash复制到这个RAM地址,而不是之前回复的第二步中提到的`0xC0000000`地址。
根据AIS文件的格式,每个section有一个特定的加载地址,这个地址是由链接器脚本预先定义的,确保app能够在设备的内存中正确地被定位。当您的boot程序执行时,它按照AIS文件中指定的地址将数据从Flash复制到RAM中相应的位置。