我正在为一个小型ARM Cortex-M0+控制器ATSAMD 20 J16编写相当简单的生产测试应用程序。我使用Microchip(Atmel)Studio 7来实现此目的。这将在生产中有一个引导加载程序,从我的Angular 来看,这是一个黑盒。完成后,它将跳转到地址0x 0800,这是我的应用程序所在的位置,如果引导加载程序存在,这与预期的工作原理非常相似。在引导加载程序部分应该有一些永久存储值的空间,我将使用Microchip/Atmel ASF 4闪存读取-擦除-写入例程来存储这些值。
从调试的Angular 来看,如果我能在没有引导加载程序的情况下完成我的工作,那将是很方便的,它的设计还没有冻结,在几百次重新引导之后,超时有点老了。
到目前为止,试图说服链接器程序入口点在0x 0800中一直是一个响亮的失败。有没有可能说服ARM处理器跳过第一个2kB并从0x 0800开始执行,或者无论如何都从0x 0000开始执行?Microchip有这个应用笔记,暗示它应该可以重新定义可执行地址,但这对我不起作用。我认为UC 3中出厂安装的 Bootstrap 实际上跳转到0x 80002000,所以这就是为什么它能工作。
https://microchip.my.site.com/s/article/How-to-retain-the-boot-loader-in-the-UC3-devices-while-application-code-is-programmed-through-debugger
基本上将此添加到链接器脚本:
FLASH (rxai!w) : ORIGIN = 0x80002000, LENGTH = 0x0007E000
PROVIDE (__executable_start = 0x80002000);. = 0x80002000;
我还尝试了同一主题的其他变体,所有这些都导致处理器发出“内存越界或读取错误”的声音。我试过输入和提供注解了我试过的东西:
/* Memory Spaces Definitions */
MEMORY
{
bootrom (r) : ORIGIN = 0x00000000, LENGTH = 0x000007E8
userbytes (r) : ORIGIN = 0x00000000 + LENGTH(bootrom), LENGTH = 0x00000018
rom (rx) : ORIGIN = 0x00000000 + LENGTH(bootrom) + LENGTH(userbytes), LENGTH = 0x00010000 - LENGTH(bootrom) - LENGTH(userbytes) */
ram (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00002000
}
/* The stack size used by the application. NOTE: you need to adjust according to your application. */
STACK_SIZE = DEFINED(STACK_SIZE) ? STACK_SIZE : DEFINED(__stack_size__) ? __stack_size__ : 0x800;
/* ENTRY(Reset_Handler);*/
/* PROVIDE(__executable_start = 0x00000800); */
/* Section Definitions */
SECTIONS
{
.text 0x00000800:
{
.
.
} > rom
.userbytes (NOLOAD) :
{
. = ALIGN(4);
KEEP(*(.calibrate))
} > userbytes
我开始认为,唯一的方法,使这项工作将是使一个最小的 Bootstrap 版本,除了跳转到0x 0800和/或重置处理程序()?
1条答案
按热度按时间5cnsuln71#
我相信从 Bootstrap 代码中截取的这段代码应该能达到我的目的。我会看看我是否可以做裸骨版本,因为主应用程序将再次进行设置,虽然它并不真正重要,如果我做冗余设置,只要它〈2kB。
编译并刻录到内存空间的开始,然后使用Microchip Studio调试器与链接器设置,让第一个2KB单独做我的应用程序开发。