2.1.md
ПРОЦЕСС СОЗДАНИЯ ПРОГРАММЫ ДЛЯ МИКРОКОНТРОЛЛЕРА
ПРЕОБРАЗОВАНИЕ ТЕКСТА ПРОГРАММЫ В «ПРОШИВКУ» ДЛЯ МИКРОКОНТРОЛЛЕРА
Текст программы не может быть загружен в микроконтроллер как есть. Для этого его нужно преобразовать из набора команда языка программирования С++ в набор команд языка микроконтроллера.
Исполняемый файл получается в результате обработки исходного кода специальными программами. В этом уроке мы рассмотрим общие положения как создается программное обеспечение для микроконтроллера
ПРОЦЕСС КОМПИЛЯЦИИ ИСХОДНОГО КОДА ПРОГРАММЫ НА C/C++
Процесс преобразования исходного кода (текста нашей программы), написанного на любом языке программирования (как правило, на языке среднего или высокого уровня), в язык машинного уровня, понятный компьютеру или микроконтроллеру, называется компиляцией. Программное обеспечение, которое используется для этого преобразования называют компилятором.
На языке C/С++ посредством компиляции исходный код языка C/С++ преобразуется в объектный код.
Применение объектного кода позволяет задействовать в нашей программе сторонние (написанные другими людьми) функции. Например, кто-то написал функцию вычисления площади треугольника и нам нет необходимости писать свой код ее вычисления, то мы можем подключить ее объектный код к нашей программе и вычислять площадь треугольника даже не зная как это реализовано на самом деле.
Объектный код — это промежуточное представление исходного кода. Еще не машинный, но уже не исходный. Он используется на этапе сборки программы из нескольких кусков (возможно, написанных в исходном коде разными людьми и в разное время).
Машинный код — уже готовый для исполнения процессором. То есть просто берете его, ничего не нужно более. Например, делаете двойной щелчок мыши, и программа запускается.
Компилятор принимает входные данные — исходный код (текст программы), и предоставляет выходные данные — объектный код.
Полный процесс компиляции на языке C далее разделен на четыре этапа:
1 Предварительная обработка.
2 Компиляция.
3 Сборка.
4 Линковка.
Компилятор проверяет исходный код на наличие синтаксических или структурных ошибок и после проверки, если исходный код найден без ошибок, затем генерирует объектный код с расширением .obj (для Windows) или .o (для Linux).
5 Предварительная обработка (препроцессор):
На этом этапе выполняется предварительная обработка исходного файла Предварительный процессор — это программа, которая принимает файл исходного кода C, а затем выполняет следующие задачи:
- удаляет комментарии из исходного кода;
- расширяет макросы (не беспокойтесь о макросах, мы узнаем о них позже);
- включение заголовочных файлов.
Препроцессор — это программа, которая обрабатывает исходный код перед передачей его компилятору. Каждый оператор предварительной обработки должен начинаться с знака #, где # называется директивой препроцессора.
Вот некоторые из директив препроцессора:
1 #include Включить определенный заголовок, используя имя файла заголовка, в программный код на языке C.
2 #define Это используется для определения макроса на языке C.
3 #error Эта команда препроцессора используется для вывода сообщения об ошибке. Существует множество других препроцессоров, но мы их не берем сейчас во внимание.
Следовательно, препроцессор расширяет исходный код (добавляет необходимую информацию), а затем этот расширенный исходный код передается компилятору.
6 Компиляция
Расширенный препроцессором код передается компилятору. Как мы знаем, компилятор — это программа, которая преобразует код языка высокого уровня (или языка среднего уровня) в код ассемблера, который затем преобразуется в машинный код, понятный машине. Поэтому предварительно обработанный код, передаваемый препроцессором компилятору, затем преобразуется компилятором в ассемблерный код, который затем передается ассемблеру.
Исходный файл, который получил расширение (.i) на предыдущем шаге, преобразуется компилятором в расширение (.s).
Ассемблер преобразует ассемблерный код, который он получает от компилятора, в объектный код. Расширение файла на этом шаге становится (.obj). Не думайте, что ассемблер — это отдельная программа, генерирующая объектный код. Ассемблер является частью процесса компиляции исходного кода языка C.
Компоновщик — это инструмент, который используется для соединения всех частей программы вместе в порядке выполнения. Код после этого этапа становится исполняемым машинным кодом. Могут быть некоторые ситуации, когда наша программа ссылается на функции, определенные в некоторых других файлах. Или, если код для какой-либо программы слишком большой, мы можем разбить его на два файла, которые будут скомпилированы отдельно, а затем связаны с помощью компоновщика. В процессе компиляции языка C компоновщик играет очень важную роль. Если ваша программа на C/С++ включает файл заголовка, и вы используете некоторую функцию, определенную в этом файле заголовка, тогда компоновщик свяжет требуемый объектный код для функции в библиотеке с объектным кодом вашей программы и упакует их вместе. Аналогично, если ваш программный код слишком большой и вы разбиваете его на два файла, то оба файла исходного кода будут преобразованы в объектный код отдельно, а затем компоновщик свяжет их и подготовит код к выполнению. Это также называется отдельной компиляцией.
Компиляцию можно сравнить с изготовлением машины:
- Дизайнер рисует макет машины — исходный текст программы.
- Далее конструктора создают чертежи — препроцессор.
- По чертежам работники задают программу станкам, которые изготавливают детали — ассемблерный код переходящий в объектный. Детали и есть аналог объектного кода.
- Затем детали поступают на конвейер, где их соединяют вместе. При этом на заводе не изготавливают колеса. Их изготавливает другая фирма и привозит на конвейер. Сторонняя фирма — это та самая библиотека с чужим кодом, а колеса объектный код нужный нам для сборки машины. На конвейере все детали соединяются вместе — это линковка.
И на выходе получаем новую машину — исполняемый файл или файл загрузки в микроконтроллер.