能否通过GCC让Cortex-M0+跳过Bootloader直接启动应用?
问题:如何让ATSAMD20J16无Bootloader时直接从0x0800运行应用
背景
- 基于ARM Cortex-M0+内核的ATSAMD20J16开发生产测试应用,使用Microchip Studio 7,借助ASF4的闪存读写擦除例程操作Bootloader预留的永久存储区域。
- 生产环境下黑盒Bootloader可正常跳转至0x0800地址启动应用,但调试阶段Bootloader尚未定型,频繁重启的超时机制严重影响效率,希望实现无Bootloader直接运行应用。
尝试过的方案及问题
修改链接脚本调整执行起始地址
- 尝试套用UC3系列的地址逻辑设置FLASH起始并指定执行入口:
执行后处理器报内存越界或读取错误。FLASH (rxai!w) : ORIGIN = 0x80002000, LENGTH = 0x0007E000 PROVIDE (__executable_start = 0x80002000);. = 0x80002000; - 调整MEMORY定义,注释ENTRY和PROVIDE语句,强制.text段从0x00000800开始:
调整后仍无法正常启动应用。/* 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 }
- 尝试套用UC3系列的地址逻辑设置FLASH起始并指定执行入口:
核心疑问
- ARM Cortex-M0+是否必须从0x0000地址启动?能否直接跳过前2KB空间从0x0800执行?
- Microchip应用笔记提及可重定义执行地址,但在ATSAMD20上无效(推测UC3系列可行是因为原厂Bootloader会主动跳转至对应地址)。
求助
是否只能通过编写一个仅跳转至0x0800或Reset_Handler()的极简Bootloader来解决该问题?
内容的提问来源于stack exchange,提问作者Barleyman
相关产品推荐
相关产品推荐

