2.1.md


ПРОЦЕСС СОЗДАНИЯ ПРОГРАММЫ ДЛЯ МИКРОКОНТРОЛЛЕРА


ПРЕОБРАЗОВАНИЕ ТЕКСТА ПРОГРАММЫ В «ПРОШИВКУ» ДЛЯ МИКРОКОНТРОЛЛЕРА


Текст программы не может быть загружен в микроконтроллер как есть. Для этого его нужно преобразовать из набора команда языка программирования С++ в набор команд языка микроконтроллера.

Исполняемый файл получается в результате обработки исходного кода специальными программами. В этом уроке мы рассмотрим общие положения как создается программное обеспечение для микроконтроллера

ПРОЦЕСС КОМПИЛЯЦИИ ИСХОДНОГО КОДА ПРОГРАММЫ НА C/C++


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

На языке C/С++ посредством компиляции исходный код языка C/С++ преобразуется в объектный код.

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

Объектный код — это промежуточное представление исходного кода. Еще не машинный, но уже не исходный. Он используется на этапе сборки программы из нескольких кусков (возможно, написанных в исходном коде разными людьми и в разное время).

Машинный код — уже готовый для исполнения процессором. То есть просто берете его, ничего не нужно более. Например, делаете двойной щелчок мыши, и программа запускается.

Рисунок 1

Компилятор принимает входные данные — исходный код (текст программы), и предоставляет выходные данные — объектный код.

Полный процесс компиляции на языке C далее разделен на четыре этапа:

1 Предварительная обработка.

2 Компиляция.

3 Сборка.

4 Линковка.

Компилятор проверяет исходный код на наличие синтаксических или структурных ошибок и после проверки, если исходный код найден без ошибок, затем генерирует объектный код с расширением .obj (для Windows) или .o (для Linux).

5 Предварительная обработка (препроцессор):

На этом этапе выполняется предварительная обработка исходного файла Предварительный процессор — это программа, которая принимает файл исходного кода C, а затем выполняет следующие задачи:

  • удаляет комментарии из исходного кода;
  • расширяет макросы (не беспокойтесь о макросах, мы узнаем о них позже);
  • включение заголовочных файлов.

Препроцессор — это программа, которая обрабатывает исходный код перед передачей его компилятору. Каждый оператор предварительной обработки должен начинаться с знака #, где # называется директивой препроцессора.

Вот некоторые из директив препроцессора:

1 #include Включить определенный заголовок, используя имя файла заголовка, в программный код на языке C.

2 #define Это используется для определения макроса на языке C.

3 #error Эта команда препроцессора используется для вывода сообщения об ошибке. Существует множество других препроцессоров, но мы их не берем сейчас во внимание.

Следовательно, препроцессор расширяет исходный код (добавляет необходимую информацию), а затем этот расширенный исходный код передается компилятору.

6 Компиляция

Расширенный препроцессором код передается компилятору. Как мы знаем, компилятор — это программа, которая преобразует код языка высокого уровня (или языка среднего уровня) в код ассемблера, который затем преобразуется в машинный код, понятный машине. Поэтому предварительно обработанный код, передаваемый препроцессором компилятору, затем преобразуется компилятором в ассемблерный код, который затем передается ассемблеру.

Исходный файл, который получил расширение (.i) на предыдущем шаге, преобразуется компилятором в расширение (.s).

Рисунок 1

Ассемблер преобразует ассемблерный код, который он получает от компилятора, в объектный код. Расширение файла на этом шаге становится (.obj). Не думайте, что ассемблер — это отдельная программа, генерирующая объектный код. Ассемблер является частью процесса компиляции исходного кода языка C.

Компоновщик — это инструмент, который используется для соединения всех частей программы вместе в порядке выполнения. Код после этого этапа становится исполняемым машинным кодом. Могут быть некоторые ситуации, когда наша программа ссылается на функции, определенные в некоторых других файлах. Или, если код для какой-либо программы слишком большой, мы можем разбить его на два файла, которые будут скомпилированы отдельно, а затем связаны с помощью компоновщика. В процессе компиляции языка C компоновщик играет очень важную роль. Если ваша программа на C/С++ включает файл заголовка, и вы используете некоторую функцию, определенную в этом файле заголовка, тогда компоновщик свяжет требуемый объектный код для функции в библиотеке с объектным кодом вашей программы и упакует их вместе. Аналогично, если ваш программный код слишком большой и вы разбиваете его на два файла, то оба файла исходного кода будут преобразованы в объектный код отдельно, а затем компоновщик свяжет их и подготовит код к выполнению. Это также называется отдельной компиляцией.

Компиляцию можно сравнить с изготовлением машины:

  1. Дизайнер рисует макет машины — исходный текст программы.
  2. Далее конструктора создают чертежи — препроцессор.
  3. По чертежам работники задают программу станкам, которые изготавливают детали — ассемблерный код переходящий в объектный. Детали и есть аналог объектного кода.
  4. Затем детали поступают на конвейер, где их соединяют вместе. При этом на заводе не изготавливают колеса. Их изготавливает другая фирма и привозит на конвейер. Сторонняя фирма — это та самая библиотека с чужим кодом, а колеса объектный код нужный нам для сборки машины. На конвейере все детали соединяются вместе — это линковка.

И на выходе получаем новую машину — исполняемый файл или файл загрузки в микроконтроллер.