我正在编写一个小皮质M0 + bootloader。我在下面有一个内联汇编,它通过从Flash中的应用程序位置加载堆栈指针和重置处理程序,从引导加载程序启动主应用程序。
#define FLASH_APP_START 0x1000
[...]
__asm(
// Update stack pointer from user code vector table
"LDR r0, =%0 \n"
"LDR r1, [r0] \n"
"MOV sp, r1 \n"
// Load user code reset handler and jump to the user code
"LDR r0, [r0, #4] \n"
"BX r0 \n"
:
: "X"(FLASH_APP_START)
:
);
编译此代码时出现以下错误:
错误:表达不好 - `ldr r0,=#4096'
GCC在不应该存在的常量之前添加#。 如果我用以下内容替换第一行,它就能很好地工作。
LDR r0,= 0x1000
所以问题是如何使用定义的常量?
提前感谢您提供任何帮助
答案 0 :(得分:1)
首先,没有理由在这里使用内联汇编,简单的解决方案是将此代码编写为普通的汇编语言文件。您可以在头文件中定义FLASH_APP_START
宏,如果需要,可以包含在程序集和C源文件中。
如果您仍想使用内联汇编,那么下一个最简单的解决方案就是让编译器为您完成大部分工作,并将汇编语句简化为它无法做到的事情:
void ** const flash_vector_table = (void **) FLASH_APP_START;
asm volatile ("mov sp, %[stack]\n\t"
"bx %[reset]\n"
:
:
[stack] "r" (flash_vector_table[0]),
[reset] "r" (flash_vector_table[1]));