Пытаюсь склепать С-startup для stm'ок, заметил странное: при попытке обратиться к переменным, генерируемым линкером, как в примере ниже, компилятор генерирует не совсем корректный код - вместо известного мне значения в переменной оказывается мусор. Если пользоваться ассемблерной вставкой, то все ок.
extern volatile unsigned int __heap_start__;
extern volatile unsigned int __heap_end__;
static volatile uint32_t tmp; // addr 0x20000190
volatile void startup()
{
// Так работает
asm("ldr r0, = __heap_start__");
asm("ldr r1, =0x20000190");
asm("str r0, [r1]");
// А так нет
tmp = __heap_start__;
}
Ниже выхлоп дизассемблера, отличие всего на одну команду.
static volatile uint32_t tmp;
volatile void startup()
{
asm("ldr r0, = __heap_start__");
ldr r0, =0x200001C8
asm("ldr r1, =0x20000190");
ldr r1, =0x20000190 <tmp>
asm("str r0, [r1]");
str r0, [r1]
tmp = __heap_start__;
ldr r3, =0x200001C8
ldr r3, [r3]
ldr r2, =0x20000190 <tmp>
str r3, [r2]
}