Создание командного файла компоновщика 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Создание командного файла компоновщика



Секции

Программа, написанная на языке Си, содержит одновременно и код, и разные типы данных (глобальные, локальные и т.д.). Texas Instruments и в принятом формате COFF эти различные части программы называются секциями – Sections. Разделение кода и данных на различные секции обеспечивает гибкость, так как позволяют размещать кодовые секции в ПЗУ, а переменные в ОЗУ. В таблице 3.1 показаны секции, создаваемые компилятором.

 

Таблица 3.1 - Имена секций компилятора

Инициализированные секции
Имя Описание Адрес размещения
.text Код программы Программа
.cinit Инициализированные глобальные и статические переменные Программа
.econst (.const) Содержит данные (например, const int k = 3;) Данные
.switch Таблицы для оператора switch Данные (программа для ‑mt)
.pinit Таблицы глобальных конструкторов языка Си Программа
Неинициализированные секции
Имя Описание Адрес размещения
.ebss (.bbs) Глобальные и статические переменные Данные
.stack Пространство стека Младшие 64К данных
.esysmem (.sysmem) Память для функций определения памяти far malloc Данные

Примечание: в скобках указаны секции для модели памяти.small (см. рис 3.5).

Секции программы на языке Си должны размещаться в разных областях памяти процессорной системы. Раздельные секции для кода, констант и переменных позволяет достичь большей производительности. В этом случае секции могут быть размещены точно в нужной область памяти процессорной системы. Секции размещают исходя из назначения (рисунок 3.6), руководствуясь следующими правилами:

Программный Код (.text)

Программный код состоит из последовательности инструкций для обработки данных, инициализации системных настроек и так далее. Программный код должен быть определен во время сброса (Reset) или включения питания. Поэтому необходимо помещать программный код в энергонезависимую память такую как Flash или EPROM.

Рисунок 3.5 – Опции компилятора.

 

Рисунок 3.6 – Разделение кода программы по секциям памяти.

 

Константы (.cinit – инициализированные данные)

Инициализированными называются те области памяти данных, которые должны быть определены во время сброса (Reset) или включения питания. Константы содержат начальные значения переменных или значения по умолчанию. Константы подобно программному коду определяют в энергонезависимой памяти.

Переменные (.ebss – неинициализированные данные)

Неинициализированные области памяти содержат данные, которые могут изменяться в процессе выполнения программного кода. Эти данные, в отличие от программного кода и констант, должны находиться в ОЗУ. Эти области памяти могут модифицироваться и обновляться, как это происходит в языках высокого уровня при вычислении математических формул. Каждая переменная объявляется директивой, чтобы зарезервировать память, содержащую ее значение. В соответствии с их определением, им не присваивается какое-либо значение, а изменить их может только работающая программа.

Процесс компоновки кода состоит из трех шагов:

1) Определение различных областей памяти (встроенная SARAM, Flash, внешняя память)

2) Описание распределения секций по областям памяти

3) Запуск компоновщика в процессе сборки (build) или пересборки (rebuild)

Командный Файл Компоновщика (.cmd)

Компоновщик объединяет секции из всех входных файлов, определяя память каждой секции исходя из ее длины и положения определяемого командами MEMORY и SECTIONS в командном файле компоновщика.

Область команды MEMORY описывает конфигурацию памяти процессорной системы для компоновщика.

Формат описания следующий:

Name: origin = 0x????, length = 0x????

 

Например, если разместить 128К Flash-памяти начиная с адреса 0x3D8000, то содержимое файла будет следующим:

MEMORY

{

FLASH: origin = 0x3D8000, length = 0x20000

}

 

Таким же образом определяются другие сегменты памяти. Если определить M0SARAM и M1SARAM, то это будет записано как:

MEMORY

{

M0SARAM: origin = 0x000000, length = 0x0400

M1SARAM: origin = 0x000400, length = 0x0400

}

Микроконтроллер имеет два типа памяти: память программ и память данных (Гарвардская архитектура). Поэтому описание каждого типа памяти должно быть раздельно. Компоновщик использует следующий синтаксис для их описания:

Страница компоновщика Определение Texas Instruments
Page 0 Program (память программ)
Page 1 Data (память данных)

 

Командный файл будет следующим:

MEMORY

{

PAGE 0: /* Память программ */

FLASH: origin = 0x3D8000, length = 0x20000

PAGE 1: /* Память данных */

M0SARAM: origin = 0x000000, length = 0x0400

M1SARAM: origin = 0x000400, length = 0x0400

}

Директива SECTIONS определяет, как будут распределены секции в описанной памяти. Следующий код используется для связи секций с памятью определенной в предыдущем примере:

SECTIONS

{

.text:> FLASH PAGE 0

.ebss:> M0SARAM PAGE 1

.cinit:> FLASH PAGE 0

.stack:> M1SARAM PAGE 1

}

 

Компоновщик будет собирать все кодовые секции из всех файлов проекта вместе. Также он поступает с остальными секциями.

Начиная с первой секции, компоновщик поместит их в указанный сегмент памяти.

MEMORY

{

PAGE 0: /* Память программ */

FLASH: origin = 0x3D8000, length = 0x20000

PAGE 1: /* Память данных */

M0SARAM: origin = 0x000000, length = 0x0400

M1SARAM: origin = 0x000400, length = 0x0400

}

SECTIONS

{

.text:> FLASH PAGE 0

.ebss:> M0SARAM PAGE 1

.cinit:> FLASH PAGE 0

.stack:> M1SARAM PAGE 1

}



Поделиться:


Последнее изменение этой страницы: 2016-08-12; просмотров: 286; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.144.253.161 (0.013 с.)