GenaSPB 0 September 7, 2020 Posted September 7, 2020 (edited) · Report post Нашел странный баг... Резервировал место в асемблрном куске (стартапе) программы - а линкер не увидел... Хотя размер секции определил как ненулевой. Что я делаю не так? Зеленым помечено то, что решило проблему. Тулзы - сборка от ARM под windows. arm-none-eabi-gcc --version arm-none-eabi-gcc.exe (GNU Arm Embedded Toolchain 9-2020-q2-update) 9.3.1 20200408 (release) Copyright (C) 2019 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Edited September 7, 2020 by GenaSPB Quote Share this post Link to post Share on other sites More sharing options...
Ural 0 September 8, 2020 Posted September 8, 2020 · Report post 7 часов назад, GenaSPB сказал: Нашел странный баг... Вероятно, в компиляторе включена оптимизация... Quote Share this post Link to post Share on other sites More sharing options...
Aaron 0 September 8, 2020 Posted September 8, 2020 · Report post в линкер файле секцию (без полезных) данных выделить ключевым словом KEEP(*(.noinit*)), иначе при оптимизации все "пустые" секции вырезаются. Quote Share this post Link to post Share on other sites More sharing options...
GenaSPB 0 September 8, 2020 Posted September 8, 2020 (edited) · Report post Так она не пустая, размер есть... 0x03c0 байт... или keep к увеличению занятых адресов относится? зы: совет не помог... Edited September 8, 2020 by GenaSPB Quote Share this post Link to post Share on other sites More sharing options...
Aaron 0 September 9, 2020 Posted September 9, 2020 · Report post Что-то значит вы делаете не так. Директива KEEP явно обязывает компилятор резервировать секцию в памяти, даже если в проекте ни один объект не ссылается на элементы из этой секции. Именно таким образом выделяются области памяти, которые могут потом хитрым образом использоваться в прошивке. 1) вы уверены, что линкер использует именно тот файл .ld, который вы правите? Проверьте, мб он тянет дефолтный ld из тулчейна. 2) может быть такое, что адрес начала секции .vram явно привязан к ссылке __bss_end__ ? в этом случае также будет наложение. 3) если п.1, п.2 в порядке, имеет смысл выложить сюда ваш ld файл. Quote Share this post Link to post Share on other sites More sharing options...
__inline__ 0 September 9, 2020 Posted September 9, 2020 (edited) · Report post Тоже сталкивался ранее с такой проблемой. Особенно когда все оптимизации включены (компилятор и линковщик). Вот кусок моего lds-файла: START_ADDR = 0x40000000 ; /* Entry Point */ ROM_SIZE = 1M ; /* Size of "Read-Only" Data */ RAM_SIZE = 2M ; /* Size of Static R/W Data */ HEAP_SIZE = 32M ; /* Heap Size */ STACK_SIZE = 4M ; /* Stack Size */ ROM_BASE = START_ADDR ; RAM_BASE = ROM_BASE + ROM_SIZE ; HEAP_BASE = RAM_BASE + RAM_SIZE ; STACK_BASE = HEAP_BASE + HEAP_SIZE ; ENTRY(Vectors) MEMORY { ROM (RX) : ORIGIN = ROM_BASE , LENGTH = ROM_SIZE RAM (RW) : ORIGIN = RAM_BASE , LENGTH = RAM_SIZE HEAP (RW) : ORIGIN = HEAP_BASE , LENGTH = HEAP_SIZE STACK (RW) : ORIGIN = STACK_BASE , LENGTH = STACK_SIZE } SECTIONS { .vectors : { KEEP(*(.vectors)) } > ROM .text : { *(.text) } > ROM .rodata : { *(.rodata) } > ROM .data : { *(.data) } > ROM //........ Вот сами объекты, которые надо защитить от вырезания (с метки Vectors ): .set MODE_USR, 0x10 .set MODE_FIQ, 0x11 .set MODE_IRQ, 0x12 .set MODE_SVC, 0x13 .set MODE_ABT, 0x17 .set MODE_UND, 0x1B .set MODE_SYS, 0x1F .equ I_F_BIT, 0xC0 .set UND_STACK_SIZE, 0x8 .set ABT_STACK_SIZE, 0x8 .set FIQ_STACK_SIZE, 0x8 .set IRQ_STACK_SIZE, 0x200000 .set SVC_STACK_SIZE, 0x8 .global Vectors .global gic_irq_handler .section .vectors,"ax" .code 32 @ Start point Vectors: ldr pc, ResetAddr @ Reset ldr pc, UndefAddr @ Undefined instruction ldr pc, SWIAddr @ Software interrupt ldr pc, PAbortAddr @ Prefetch abort ldr pc, DAbortAddr @ Data abort ldr pc, ReservedAddr @ Reserved ldr pc, IRQAddr @ IRQ interrupt ldr pc, FIQAddr @ FIQ interrupt ResetAddr: .word Reset_Handler UndefAddr: .word Undef_Handler SWIAddr: .word SWI_Handler PAbortAddr: .word PAbort_Handler DAbortAddr: .word DAbort_Handler ReservedAddr: .word 0 IRQAddr: .word IRQ_Handler FIQAddr: .word FIQ_Handler .ltorg .section .init, "ax" .code 32 .align 5 Reset_Handler: @ Setup a stack for each mode LDR r0, =_stack @ Read the stack address MSR cpsr_c, #MODE_UND|I_F_BIT @ switch to undef mode MOV sp,r0 @ write the stack pointer SUB r0, r0, #UND_STACK_SIZE @ give stack space @.......... Вроде всё на месте и дышит как надо. Проверял дизасмом. Edited September 9, 2020 by __inline__ Quote Share this post Link to post Share on other sites More sharing options...