Поиск по сайту: |
|
По базе: |
|
Главная страница > Статьи > Средства разработки |
|
|||||||||||||||||||||||||
Программа на CВ этом примере рассмотрим компиляцию и линковку программы на C. Выше говорилось, что для запуска программ написанных на языке высокого уровня требуется некоторая предварительная работа по подготовке памяти. Кроме подготовки секции .data , необходимо заполнить секцию .bss нулями. Загрузочный образ будет собираться из 2-х модулей, на ассемблере и на C. На ассемблере написан код инициализации, текст программы, файл ex4.s :
Cкрипт линкера:
В скрипте определено несколько символов. Символ flash_sd хранит адрес конца секции .rodata. Начиная с этого адреса, будут размещаться данные секции .data в ROM. Именно в ROM! Адрес начала секции .bss в s_bss , а секции .data в s_data . Cимволы d_size и b_size , хранят размеры секций в байтах. В программе на ассемблере эти символы используются для копирования данных и подготовки секции .bss . После инициализации, вызывается подпрограмма main из модуля на C. Текст на C, файл ex4_1.c:
Стандарт C поддерживает 4 спецификатора класса памяти: extern, static, register, auto. Если класс не определён явно, то по умолчанию принимается класс extern для объектов, описанных вне функций, и класс auto в пределах описания функций. Автоматические объекты (auto) существуют только во время выполнения данного блока и при выходе из блока теряют свои значения и освобождают занимаемую память. Классы static и extern касаются объектов, существующих в течение всего времени выполнения программы. Разница между ними в том, что объекты класса extern доступны из всех модулей, в то время как объекты класса static , доступны только в пределах того модуля, где они описаны. Это краткое напоминание об основах C. Компилируем программу на С, командой:
Флаг -O0 указывает компилятору, что не нужно выполнять оптимизацию программы, так как возможны трудности с отладкой. Смотрим символы полученного объектного файла:
Все символы глобальные. Тип C - общедоступные символы (common). Тип D - глобальные символы в секции .data . Если программа состоит из нескольких модулей компилируемых раздельно, и в этих модулях имеются символы типа C с одинаковыми именами, то эти символы будут ссылаться на один и тот же участок памяти. А если эти символы разного размера, то под символ будет выбран участок памяти максимального размера, из имеющихся участков. И что важно, линковщик не сообщит, о том, что в разных модулях определены символы с одинаковыми именами. Проведём эксперимент, создадим 2-ой модуль на C, в котором объявим не инициализированную переменную dst, с классом памяти extern , и меньшего размера. Текст 2-го модуля на C, из файла ex4_2.c совсем короткий, из одной строки.
Скомпилируем командой:
Скомпонуем командой:
Посмотрим символ dst в ELF файле:
Как видим, в исполнимом файле создан символ типа B - не инициализированные данные в секции .bss. Символы типа C не создаются в исполнимых файлах ELF. Никаких предупреждающих сообщений не последовало об определении нескольких символов с одним именем в разных модулях. Нужно различать определение, от описания переменной. Описание переменной - это ссылка на участок памяти. Определение переменной - это выделение ей участка памяти. Можно запретить компилятору создавать символы типа C (common). В параметрах компилятора задаётся опция -fno-common. В этом случае для глобальных, не инициализированных переменных, будут создаваться символы типа B. А при компоновке, линковщик сообщит об ошибке, о наличии нескольких символов с одним именем в разных модулях. Переменная int i , по умолчанию имеет класс памяти auto. Для этой переменной компилятор не создаёт символ (именованный участок памяти в RAM), её значение хранится в регистре процессора. Кто интересуется, может получить ассемблерный текст, сгенерированный компилятором C:
Проведём ещё один эксперимент, изменим класс памяти переменных и функции на static:
Компилируем командой:
Таблица символов:
Переменные dst и src перестали быть доступными из других модулей, а функция main стала недоступной для вызова из модуля на ассемблере. Символ dst - типа b , не общедоступный (common), как в предыдущем примере. Это результат действия -fno-common . При попытке компоновки, будет выдано сообщение, о невозможности разрешить символ main. Для функции main, класс памяти static излишний, нужно изменить класc памяти функции main.
Главная - Микросхемы - DOC - ЖКИ - Источники питания - Электромеханика - Интерфейсы - Программы - Применения - Статьи |
|
Впервые? | Реклама на сайте | О проекте | Карта портала тел. редакции: +7 (995) 900 6254. e-mail:info@eust.ru ©1998-2023 Рынок Микроэлектроники |
|