Поиск по сайту: |
|
По базе: |
|
Главная страница > Статьи > Средства разработки |
|
|||||||||||||||
LMA и VMAВ этом примере рассмотрим работу с секцией инициализированных данных. Организация этой секции важна для связывания модулей написанных на языках высокого уровня. На рисунке 3 представлено, как располагаются секции, когда требуется задать секцию инициализированных данных. Необходимость определения инициализированных данных можно обойти, создав необходимые константы, которые будут размещены в ROM, а затем в программе будут копироваться в область неинициализированных данных (секцию .bss). Но для поддержки языков высокого уровня требуется другая методика.
Секцию .data размещают в ROM, а затем, её содержимое переносится в RAM . Таким образом, перед выполнением прикладной программы, нужно выполнить некоторый код инициализации, а так же задать соответственные команды в скрипте линковки. Каждый символ в секции .data будет иметь два различных адреса. Один адрес в области ROM - LMA (Load Memory Address). А другой адрес в RAM - VMA (Virtual Memory Address). Конечная программа будет работать с адресами VMA. Скрипт компоновщика приведён ниже:
Первыми идут секции кода. В стандарте языка линкера, предусмотрена возможность задания программистом символов хранящих адреса и константы. Значения этих символов доступны из программного кода. В скрипте определяется символ flash_sd , он хранит адрес конца секции констант и начало области, где будут размещаться символы секции .data в ROM. Символы ram_sd и ram_ed , содержат адреса начала и конца секции .data в RAM. Символ d_size хранит размер секции .data . Для определения размера секции .data использовалась стандартная функция SIZEOF . В коде инициализации, значения этих символов будут использоваться для копирования секции .data из ROM в RAM. Ключевое слово AT определяет адрес загрузки секции в ROM. Линковщик расположит её за секцией .rodata в ROM, в то время как адреса символов принадлежащих этой секции, будут соответствовать расположению в RAM. Чтобы всё стыковалось, и программа нормально работала, содержимое секции из ROM нужно скопировать в RAM программным кодом инициализации. Текст на ассемблере приведён ниже.
В этом примере используется директива .type . В данном случае она применяется для задания типа метки программного кода. При использовании этой директивы, необходимость в увеличении на единицу значения адреса, как в предыдущих примерах, отпадает. В начале программы команды, выполняющие копирование секции инициализированных данных, а затем простейший код, выполняющий суммирование значений 2-х переменных. Реальные значения символов определённых в скрипте линкера, можно узнать, воспользовавшись утилитой arm-none-eabi-nm, из инструментария. Для контроля результатов компоновки, выполняем команду:
Кроме размеров секций, дамп вывода содержит VMA и LMA адреса начала секций. У секции .data , VMA и LMA адреса не совпадают. Дополнительно, эта утилита выводит информацию об атрибутах секций. Атрибут LOAD (loadable section) - содержимое секции будет загружено в память целевой системы. Атрибут ALLOC (allocatable section) - секция будет занимать место в адресном пространстве во время выполнения. Секция bss не имеет данных для загрузки в память целевой системы, но имеет размер. Поэтому она имеет только атрибут ALLOC. Секция ARM.attributes - выполняет служебные функции и не имеет данных для размещения в памяти целевой системы, поэтому не имеет атрибутов ALLOC и LOAD. Секции отладки так же не размещаются в памяти целевой системы, эти секции использует отладчик. Значения остальных атрибутов очевидны.
Главная - Микросхемы - DOC - ЖКИ - Источники питания - Электромеханика - Интерфейсы - Программы - Применения - Статьи |
|
Впервые? | Реклама на сайте | О проекте | Карта портала тел. редакции: +7 (995) 900 6254. e-mail:info@eust.ru ©1998-2023 Рынок Микроэлектроники |
|