ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Воскресенье
28 апреля
941369
evgeniy1294 (20.08.2019 14:20, просмотров: 2719)
Пытаюсь склепать С-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] }