реклама на сайте
подробности

 
 
> Перемещение кода в память, как указать где копия кода должна быть размещена во флеше.
Kabdim
сообщение Feb 15 2016, 10:13
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842



Есть связка: важный кусок программы(ВКП)+остальное. Среди прочего ВКП нужно скопировать в память и выполняться оттуда. Причем нужно что бы в случае если "остальное" будет стерто из флеша, то ВКП смог бы продолжать работать даже после ресета. Да, похоже на связку бут+программа, но связей между 2 кусками больше причем в обе стороны и они НЕ должны обновляться независимо. Соответственно что бы не городить разделение логически одной программы на 2 куска хочется указать линкеру что бы он часть ВКП отмапленную в память хранил в части флеша относящейся к ВКП же.

Т.е. структура флеша:
прерывания, startup&main, код и переменные ВКП который нужно загрузить в память, остальное
структура памяти:
код и переменные ВКП, память для остальной части программы

Как бы это сделать через ld? Пробовал через разные секции для разных частей кода, однако сохраненное для загрузки в память всё равно линкуется в конец бинарника. Как это сделать правильно?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Kabdim
сообщение Feb 18 2016, 16:04
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842



Было бы предпочтительней понять как перемещать сразу объектные файлы, без редактирования исходников. Пробую так:
CODE

INCLUDE "corp_AES_TEST_Debug_library.ld"
INCLUDE "corp_AES_TEST_Debug_memory.ld"

ENTRY(ResetISR)

SECTIONS
{
/* MAIN TEXT SECTION */
.text : ALIGN(4)
{
FILL(0xff)
__vectors_start__ = ABSOLUTE(.) ;
KEEP(*(.isr_vector))
/* Global Section Table */
. = ALIGN(4) ;
__section_table_start = .;
__data_section_table = .;
LONG(LOADADDR(.data));
LONG( ADDR(.data));
LONG( SIZEOF(.data));
LONG(LOADADDR(.data_RAM2));
LONG( ADDR(.data_RAM2));
LONG( SIZEOF(.data_RAM2));
__data_section_table_end = .;
__bss_section_table = .;
LONG( ADDR(.bss));
LONG( SIZEOF(.bss));
LONG( ADDR(.bss_RAM2));
LONG( SIZEOF(.bss_RAM2));
__bss_section_table_end = .;
__section_table_end = . ;
/* End of Global Section Table */

*(.after_vectors*)

/* Code Read Protect data */
. = 0x000002FC ;
PROVIDE(__CRP_WORD_START__ = .) ;
KEEP(*(.crp))
PROVIDE(__CRP_WORD_END__ = .) ;
ASSERT(!(__CRP_WORD_START__ == __CRP_WORD_END__), "Linker CRP Enabled, but no CRP_WORD provided within application");
/* End of Code Read Protect */
} >MFlash128

/* Main DATA section (RamLoc8) */
.data : ALIGN(4)
{
FILL(0xff)
_data = . ;
*(vtable)
*(.ramfunc*)
*wdt.o(.text*)
*wdt.o(.rodata .rodata.* .constdata .constdata.*)
*eeprom.o(.text*)
*eeprom.o(.rodata .rodata.* .constdata .constdata.*)
. = ALIGN(4);
*(.data*) . = ALIGN(4) ;
_edata = . ;
} > RamLoc8 AT>MFlash128

.text : ALIGN(4)
{
*(EXCLUDE_FILE(*wdt.o *eeprom.o) .text*)*(EXCLUDE_FILE(*wdt.o *eeprom.o) .rodata .rodata.* .constdata .constdata.*)
. = ALIGN(4);
} > MFlash128
/*
* for exception handling/unwind - some Newlib functions (in common
* with C++ and STDC++) use this.
*/
.ARM.extab : ALIGN(4)
{
*(.ARM.extab* .gnu.linkonce.armextab.*)
} > MFlash128
__exidx_start = .;

.ARM.exidx : ALIGN(4)
{
*(.ARM.exidx* .gnu.linkonce.armexidx.*)
} > MFlash128
__exidx_end = .;

_etext = .;

/* DATA section for RamUsb2 */
.data_RAM2 : ALIGN(4)
{
FILL(0xff)
PROVIDE(__start_data_RAM2 = .) ;
*(.ramfunc.$RAM2)
*(.ramfunc.$RamUsb2)
*(.data.$RAM2*)
*(.data.$RamUsb2*)
. = ALIGN(4) ;
PROVIDE(__end_data_RAM2 = .) ;
} > RamUsb2 AT>MFlash128

/* MAIN DATA SECTION */
.uninit_RESERVED : ALIGN(4)
{
KEEP(*(.bss.$RESERVED*))
. = ALIGN(4) ;
_end_uninit_RESERVED = .;
} > RamLoc8
/* BSS section for RamUsb2 */
.bss_RAM2 : ALIGN(4)
{
PROVIDE(__start_bss_RAM2 = .) ;
*(.bss.$RAM2*)
*(.bss.$RamUsb2*)
. = ALIGN (. != 0 ? 4 : 1) ; /* avoid empty segment */
PROVIDE(__end_bss_RAM2 = .) ;
} > RamUsb2
/* MAIN BSS SECTION */
.bss : ALIGN(4)
{
_bss = .;
*(.bss*)
*(COMMON)
. = ALIGN(4) ;
_ebss = .;
PROVIDE(end = .);
} > RamLoc8
/* NOINIT section for RamUsb2 */
.noinit_RAM2 (NOLOAD) : ALIGN(4)
{
*(.noinit.$RAM2*)
*(.noinit.$RamUsb2*)
. = ALIGN(4) ;
} > RamUsb2
/* DEFAULT NOINIT SECTION */
.noinit (NOLOAD): ALIGN(4)
{
_noinit = .;
*(.noinit*)
. = ALIGN(4) ;
_end_noinit = .;
} > RamLoc8

PROVIDE(_pvHeapStart = DEFINED(__user_heap_base) ? __user_heap_base : .);
PROVIDE(_vStackTop = DEFINED(__user_stack_top) ? __user_stack_top : __top_RamLoc8 - 0);

/* ## Create checksum value (used in startup) ## */
PROVIDE(__valid_user_code_checksum = 0 -
(_vStackTop
+ (ResetISR + 1)
+ (( DEFINED(NMI_Handler) ? NMI_Handler : M0_NMI_Handler ) + 1)
+ (( DEFINED(HardFault_Handler) ? HardFault_Handler : M0_HardFault_Handler ) + 1)
)
);
}


В мапе в итоге получаю:
.data 0x10000000 0x28 load address <адрес в конце слинкованого флеша>

Сообщение отредактировал Kabdim - Feb 18 2016, 16:05
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Feb 18 2016, 17:19
Сообщение #3


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Посмотрел у себя - то же самое. Похоже, то, что кладётся в секцию через AT>, попадает туда в последнюю очередь. Хм...
Попробуйте тогда вот так:
Код
    .text : ALIGN(4)
    {
        __vectors_start__ = ABSOLUTE(.);
        KEEP(*(.isr_vector))
        _label1 = .
    } >FLASH

    .data : AT ( _label1 )
    {  
        . = ALIGN(4);
        *(.ramfunc*)
        *(.data)
        *(.data.*)
    } >RAM

Я думал, что это одно и то же, но теперь вижу, что этот вариант даёт больше контроля.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Kabdim   Перемещение кода в память, как указать где копия кода должна быть размещена во флеше.   Feb 15 2016, 10:13
- - Aaron   1. Всё, что должно помещаться в ram, есть initiali...   Feb 15 2016, 12:46
- - scifi   Цитата(Kabdim @ Feb 15 2016, 13:13) Приче...   Feb 15 2016, 13:01
|- - dimka76   Цитата(scifi @ Feb 15 2016, 16:01) Вне за...   Feb 15 2016, 13:45
|- - Kabdim   Цитата(Aaron @ Feb 15 2016, 15:46) 1. Всё...   Feb 15 2016, 16:08
- - Kabdim   Сделал как предложил Aaron, но всё равно во флеше ...   Feb 18 2016, 09:29
|- - AHTOXA   Покажите скрипт линкера.   Feb 18 2016, 10:26
- - Kabdim   Размещение в памяти теперь правильное, но конфликт...   Feb 19 2016, 12:41
- - Kabdim   Прошу помочь с этим сдвигом. Мозги кипят. Пробую: ...   Feb 19 2016, 16:59
- - Kabdim   Тихо сам с собой. Похоже получилось сдвинуть секци...   Feb 20 2016, 13:10
- - Aaron   Подождите, что значит, не работает } > RAM AT ...   Feb 26 2016, 14:07
|- - Kabdim   Цитата(Aaron @ Feb 26 2016, 17:07) Подожд...   Feb 26 2016, 15:18
- - Сергей Борщ   Какие-то сложные у вас решения Код .text : { ...   Feb 26 2016, 16:15
- - Kabdim   Сегодня наконец проверил. Досадно. Столько времени...   Mar 1 2016, 15:10


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 31st July 2025 - 13:51
Рейтинг@Mail.ru


Страница сгенерированна за 0.0141 секунд с 7
ELECTRONIX ©2004-2016