我正在尝试执行一个引导加载程序、该引导加载程序会跳转到应用程序。 以下是我到目前为止所做的工作:
- 创建了一个引导加载程序项目、用于配置某些外设并使某些 LED 闪烁。 这工作正常。
- 创建了一个用户应用程序项目、我希望引导加载程序跳转到该项目(我还不想从 SPI 或 UART 等外部源加载;我只需强制将应用程序二进制文件放入闪存、并希望跳转到该项目)。
用户应用程序执行不正确。 当我单步执行引导加载程序时、我可以看到它跳转到我为用户应用程序0x00020000指定的地址。
当我单步执行我的应用程序起始地址 0x00020000时 、我运行到 undefEntry 中(在地址 x4处)。 这可能是因为我的引导加载程序工程没有适用于我的应用程序的符号、但我不确定。 无论如何、即使我只是加电并希望它运行、我的应用程序也不会继续运行。 请注意、我的应用程序不配置任何器件-它只是尝试写入 GPIO、与引导加载程序配置并成功使用的器件相同。 如果我需要在引导加载程序完成后重新初始化任何外设并跳转到应用程序、请更正我的错误。
以下是我的链接器脚本。 因为您可以告诉我正在尝试将我的用户应用程序定位在 0x00020000。 我已经尝试将引导和应用程序输出转换为原始二进制文件、并 分别将它们加载到地址0x0和0x00020000、这没什么区别。 引导加载程序始终运行正常、但不运行应用程序。 感谢您在调试此内容或解决遗漏的任何问题方面提供的帮助。
boot_linker.cmd
/*------------------ *
定义大小为4G 的存储器内存内存;
define region vectors = mem:[来自0x00000000大小0x00000020];
定义区域闪存=内存:[0x00000020大小0x0017FFE0]
| mem:[来自0x00180000大小0x00180000];
define region stack = mem:[从0x08000000开始、大小为0x00001500];
定义区域 RAM =内存:[自0x08001500大小0x0003eb00];
定义块堆、大小= 0x800、对齐= 8{};
通过副本{readwrite}进行初始化;
不初始化{section.noinit};
放入向量{readonly section .intvecs};
置于闪存{readonly}中;
放入 RAM{readwrite};
放入 RAM{block heap};
/*------------------ *
app_linker.cmd
/*------------------ *
定义大小为4G 的存储器内存内存;
define region vectors = mem:[自0x00020000大小0x00000020];
定义区域闪存=内存:[从0x00020020大小0x0017FFE0]
| mem:[来自0x00180000大小0x00180000];
define region stack = mem:[从0x08000000开始、大小为0x00001500];
定义区域 RAM =内存:[自0x08001500大小0x0003eb00];
定义块堆、大小= 0x800、对齐= 8{};
通过副本{readwrite}进行初始化;
不初始化{section.noinit};
放入向量{readonly section .intvecs};
置于闪存{readonly}中;
放入 RAM{readwrite};
放入 RAM{block heap};
/*------------------ *