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

 
 
> Перемещение кода в память, как указать где копия кода должна быть размещена во флеше.
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
Ответов
Сергей Борщ
сообщение Feb 26 2016, 16:15
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Какие-то сложные у вас решения
Код
    .text :
    {
        _image_start = .;
        KEEP(*(.isr_vector))
        LONG((_image_end - _image_start) / 4);    /* application size, in 4-byte words */
    } > TEXT
    .data :
    {
        . = ALIGN(4);
        _sdata = .;                /* start of .data label */
        *(.ramfunc)
        *(.ramfunc.*)
        *(.data)
        *(.data.*)
        . = ALIGN(4);
        _edata = .;                /* end of .data label */
    } > RAM AT > TEXT
    _sidata = LOADADDR(.data);    /* start of initialized data label */
    
    .text.1 :
    {
        . = ALIGN(8);
        __ctors_start__ = .;
        KEEP(*(.init_array))  /* eabi uses .init_array for static constructor lists */
               ....
    } > TEXT


Код
.text           0x08001000      0x124
                0x08001000                _image_start = .
*(.isr_vector)
.isr_vector    0x08001000      0x120 ./release/obj/startup.o
                0x08001000                g_pfnVectors
                0x08001120        0x4 LONG 0x1b79 ((_image_end - _image_start) / 0x4)

.vfp11_veneer   0x08001124        0x0
.vfp11_veneer  0x00000000        0x0 linker stubs

.v4_bx          0x08001124        0x0
.v4_bx         0x00000000        0x0 linker stubs

.iplt           0x08001124        0x0
.iplt          0x00000000        0x0 ./release/obj/startup.o

.rel.dyn        0x08001124        0x0
.rel.iplt      0x00000000        0x0 ./release/obj/startup.o

.data           0x20000000        0x4 load address 0x08001124
                0x20000000                . = ALIGN (0x4)
                0x20000000                _sdata = .
*(.ramfunc)
*(.ramfunc.*)
*(.data)
*(.data.*)
.data.__ctype_ptr__
                0x20000000        0x4 /home/serzh/opt/arm-gcc/launchpad/20150306/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m/libc.a(lib_a-ctype_.o)
                0x20000000                __ctype_ptr__
                0x20000004                . = ALIGN (0x4)
                0x20000004                _edata = .
                0x08001124                _sidata = LOADADDR (.data)

.igot.plt       0x20000004        0x0 load address 0x08001128
.igot.plt      0x00000000        0x0 ./release/obj/startup.o

.text.1         0x08001128     0x6cb4
                0x08001128                . = ALIGN (0x8)
                0x08001128                __ctors_start__ = .
*(.init_array)
.init_array    0x08001128        0x4 ./release/obj/adc.o


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
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 18 2016, 16:04
|- - AHTOXA   Посмотрел у себя - то же самое. Похоже, то, что кл...   Feb 18 2016, 17:19
- - 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
- - Kabdim   Сегодня наконец проверил. Досадно. Столько времени...   Mar 1 2016, 15:10


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

 


RSS Текстовая версия Сейчас: 8th August 2025 - 21:59
Рейтинг@Mail.ru


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