GenaSPB 11 7 сентября, 2020 Опубликовано 7 сентября, 2020 (изменено) · Жалоба Нашел странный баг... Резервировал место в асемблрном куске (стартапе) программы - а линкер не увидел... Хотя размер секции определил как ненулевой. Что я делаю не так? Зеленым помечено то, что решило проблему. Тулзы - сборка от 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. Изменено 7 сентября, 2020 пользователем GenaSPB Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ural 0 8 сентября, 2020 Опубликовано 8 сентября, 2020 · Жалоба 7 часов назад, GenaSPB сказал: Нашел странный баг... Вероятно, в компиляторе включена оптимизация... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Aaron 1 8 сентября, 2020 Опубликовано 8 сентября, 2020 · Жалоба в линкер файле секцию (без полезных) данных выделить ключевым словом KEEP(*(.noinit*)), иначе при оптимизации все "пустые" секции вырезаются. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 8 сентября, 2020 Опубликовано 8 сентября, 2020 (изменено) · Жалоба Так она не пустая, размер есть... 0x03c0 байт... или keep к увеличению занятых адресов относится? зы: совет не помог... Изменено 8 сентября, 2020 пользователем GenaSPB Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Aaron 1 9 сентября, 2020 Опубликовано 9 сентября, 2020 · Жалоба Что-то значит вы делаете не так. Директива KEEP явно обязывает компилятор резервировать секцию в памяти, даже если в проекте ни один объект не ссылается на элементы из этой секции. Именно таким образом выделяются области памяти, которые могут потом хитрым образом использоваться в прошивке. 1) вы уверены, что линкер использует именно тот файл .ld, который вы правите? Проверьте, мб он тянет дефолтный ld из тулчейна. 2) может быть такое, что адрес начала секции .vram явно привязан к ссылке __bss_end__ ? в этом случае также будет наложение. 3) если п.1, п.2 в порядке, имеет смысл выложить сюда ваш ld файл. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 9 сентября, 2020 Опубликовано 9 сентября, 2020 (изменено) · Жалоба Тоже сталкивался ранее с такой проблемой. Особенно когда все оптимизации включены (компилятор и линковщик). Вот кусок моего 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 @.......... Вроде всё на месте и дышит как надо. Проверял дизасмом. Изменено 9 сентября, 2020 пользователем repstosw Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться