Поиск по сайту: |
|
По базе: |
|
Главная страница > Статьи > Средства разработки |
|
|||||||||||||||||||||||||||||
Связывание двух модулейБольшинство программ создаётся из нескольких модулей. В нашем следующем примере, простейшая программа создаётся из 2-х модулей, которые затем связываются в один бинарный файл. Текст программы 1-го модуля из файла ex2_m.s:
Массив констант выделен в отдельную секцию, применена директива .section .rodata . Начало массива отмечено меткой bar , а конец отмечен меткой ear . Секция .rodata будет размещена в ROM. Адреса начала и конца массива передаются в процедуру sum через регистры. В этой процедуре выполняется суммирование элементов массива. Она определена в другом модуле. Результат возвращается в регистре r3 и сохраняется в переменных var1 и var2 . Эти переменные определены в секции .bss , а сама секция размещена в RAM. После ассемблирования ex2_m.s , смотрим секции и символы объектного файла:
Секция .rodata имеет размер 5 байт. Символы типа U - это неопределённые символы, адреса не имеют. Переменные var1 и var2 , а так же процедура sum , определены в другом модуле, поэтому имеют тип U. Символы типа r - символы данных определённых в ROM, для чтения, но не для исполнения. Текст второй программы из файла ex2_s.s:
Метка sum задана как глобальная, это условие видимости метки из других модулей. Это же относится и к var1 , var2 . Для задания переменных в секции .bss используется директива .skip . Эта директива позволяет определять буфер произвольного размера. Переменные var1 и var2 по байту и buffer в 32 байта. Таблица символов и секций:
Символ типа B - глобальный символ в области неинициализированных данных, именно там расположены var1 и var2. Символ типа b - локальный символ. Получаем исполнимый файл командой:
Текст скрипта линковки:
Здесь приведен пример с использованием команды MEMORY, как и команда SECTIONS, это команда может встречаться единожды в скрипте. В фигурных скобках указаны названия областей памяти и атрибуты этих областей. Как легко догадаться атрибут RW - это область памяти с доступом чтения-записи, а атрибут X , означает возможность выполнения команд. Слово ORIGIN - начало области, LENGTH - её размер. Знаком ">" указывается, в какой области памяти расположить секции. После секции кода следует секция данных "только чтение", а затем секция не инициализированных данных, располагающаяся в RAM. На результат линковки влияет последовательность, в которой указаны объектные файлы, из которых собирается программа. Если порядок файлов поменять в командной строке, то результат окажется не работоспособным. Ниже приведены две таблицы символов исполнимых ELF файлов, полученных при разном порядке задания файлов в команде линковки.
Это понятно, в каком порядке подаются файлы, в таком порядке и размещаются их секции. В скрипте можно явно указать порядок линковки таким образом:
Другой вариант, выделить код, который требуется разместить по абсолютному адресу в отдельную секцию, и расположить эту секцию по абсолютному адресу. Но как это реализовать, станет ясно из последующего изложения. Правильность функционирования этого примера можно проверить, загрузив в микроконтроллер и прогнав в отладчике. Иногда при компоновке, выдаётся сообщение об ошибке, линковщик не может разрешить, переменную или функцию. В этом случае, нужно определить файл исходного текста, где этот символ определён, а затем скомпилировать этот модуль, и включить в процесс сборки.
Главная - Микросхемы - DOC - ЖКИ - Источники питания - Электромеханика - Интерфейсы - Программы - Применения - Статьи |
|
Впервые? | Реклама на сайте | О проекте | Карта портала тел. редакции: +7 (995) 900 6254. e-mail:info@eust.ru ©1998-2023 Рынок Микроэлектроники |
|