реклама на сайте
подробности

 
 
> Makefile
alexxx86
сообщение Aug 14 2015, 04:32
Сообщение #1





Группа: Новичок
Сообщений: 7
Регистрация: 13-08-14
Пользователь №: 82 535



Кто может разъяснить зачем нужен makefile?! На просторах интернета внятной информации не нашел. К примеру в некоторых темах пишут что при правки makefile нужно указывать тип микроконтроллера, рабочаю частоту и т. д. Я работаю в atmel studio и там в makefile нет таких пунктов. Просто хочется для общего развития понимать зачем он нужен и почему он бывает разный.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
zhevak
сообщение Aug 14 2015, 05:14
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 723
Регистрация: 29-08-05
Из: Березовский
Пользователь №: 8 065



Цитата(alexxx86 @ Aug 14 2015, 09:32) *
Кто может разъяснить зачем нужен makefile?!

Makefile изначально использовался в среде типа UNIX, которые построены на парадигме управления задачами посредством команд, которые вводятся в консоли (символьной -- а графических консолей тогда и не было) с клавиатыры. Результат выполнения также отображался в символьном виде на экране тойже консоли. Вместо экрана висплея можно было подключить принтер. А почему бы нет!

Ну Вы поняли! Кнопочек и менюшечек не было. Мышей -- тоже. А управлять заданиями, то есть работать на компе было нужно. Вопрос -- как? Единственный выход в те времена -- использование клавиатуры и экрана (принтера). Понтное дело, что при таком раскладе ни о какой графике говорить уже не приходилось. Команды системе отдавались в виде слов, и получение резултата вываливалось на экран тоже в виде слов.

Ну это прописные истины. Я их сказал тоько для того, что бы мы понимали друг друга однозначно. Идем дальше.

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

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

В общем, в файле Makefile перечисляются исходные положения -- типа каким компилятором будем пользоваться, где и какие расположены библиотеки, каким линковщиком будем собирать проект, к стати -- имя проекта, состав файлов проекта, зависимости файлов друг от друга, тип процессора, тактовая частота... ну и другие параметры. Всего не перечислить! Да, в общем-то, и нет это нужно. Makefile в самом минимальном варианте тоже рулят. Мне иногда приходится создавать тестовые пректики. Поэтому накидать с нуля Makefile из десятка строк иногда бывает проще, чем адаптировать мега-Makefile из соседнего проекта.

В Видовсе принято программировать мышкой. Поэтой причине в Виндовсе Makefile-ы не очень распространены. И правда, какой смысл в файле, если все параметры контролируются средой разработки (IDE), и сама среда уже знает какой компилятор использовать?

Если Вы не собираетесь пробовать Линукс, то и заморачиваться особо на эти Makefiles Вам нет никакого смысла. Это в среде Линукса зание Makefile жизненно необходимо.


--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
Go to the top of the page
 
+Quote Post
alexxx86
сообщение Aug 14 2015, 05:34
Сообщение #3





Группа: Новичок
Сообщений: 7
Регистрация: 13-08-14
Пользователь №: 82 535



zhevak, спасибо за ответ! В общих чертах я понял про makefile. Мне больше не понятно другое, к примеру берем какой нибудь чужой проект с всеми исходниками и makefileом, в makefile указан тип микроконтроллера и рабочаю частота. Или другой пример, решил я почитать про bootloaded, нашел тему где все подробно расписано и есть все исходники и makefile, опять-же там указывается тип и частота. Я работаю в atmel studio 6, там автоматически генерируется makefile, но там нет таких пунктов. Вот мне и не понятно почему где-то указывается тип и частота а где-то нет.

Сообщение отредактировал alexxx86 - Aug 14 2015, 05:36
Go to the top of the page
 
+Quote Post
zhevak
сообщение Aug 14 2015, 07:55
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 723
Регистрация: 29-08-05
Из: Березовский
Пользователь №: 8 065



Цитата(alexxx86 @ Aug 14 2015, 10:34) *
Мне больше не понятно другое, к примеру берем какой нибудь чужой проект с всеми исходниками и makefileом, в makefile указан тип микроконтроллера и рабочаю частота. Или другой пример, решил я почитать про bootloaded, нашел тему где все подробно расписано и есть все исходники и makefile, опять-же там указывается тип и частота. Я работаю в atmel studio 6, там автоматически генерируется makefile, но там нет таких пунктов. Вот мне и не понятно почему где-то указывается тип и частота а где-то нет.


Давайте подумаем вот на какую тему -- а на что, собственно, влияет тактовая частота процессора в программе?

Делаю паузу, чтобы Вы сам попробовали ответить на это вопрос.

Подумайте хояты минуту, прежде чем читать далее.

На скорость сборки проекта или на состав проекта (из каких файлов будет состоять прект) тактовая частота никак не влияет. Это понятно.

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

Другое дело, когда в вашей программе нужно четко соблюдать время и/или временные интервалы. Нпример, синхроимпульс, который вырабатывает ваше устройство должен иметь длительность ровно 100 мкс. Или последовательный порт UART должен работать на скорости 9600 бод. В этих случаях где-то в программном коде будут вычисляться коэффициенты для таймеров, для UART-ов или количество пустых циклов для программной задержки.

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

Код
void delay100us(void)
{
  volatile uint8_t i;
  for (i = 0; i <=36; i++)
   ; // do nothing
}

Или для того чтобы UART работал на скорости 9600 бод в регистр UBBRL нужно записать значение 49:

Код
...
  UBBRL = 49;
...

В этом коде значение тактовой частоты тоже отсутствует.

Во втором случае вы можете в программе задать записать определение констатны, которая соответствует тактовой чатоте процессора. Ну, наприер:

Код
#define FCPU (7372800UL)

Тогда в программе для рассчета количества циклов и коэффициента для UBBR прямо в тексте исходного кода може использовать эту константу для вычисления нужных значений:

Код
#define FCPU (7372800UL)
#define BAUD (9600)
...
void delay100us(void)
{
  volatile uint8_t i;
  for (i = 0; i <= (FCPU / 324); i++)
   ; // do nothing
}
...
  UBBRL = FCPU / (16 * BAUD) - 1;
...


Удобство в этом случае состоит в том, что теоретически вам уже не нужно вычислять все коэффициенты в ручную. Оптимизирующие компиляторы вычисления сделают за вас и в код микроконтроллера попадет уже готовое значение коэффициента. То есть компилятор сгенерирует не команды, вычичляющие коэффициент, а уже готовую констатну. Я сказал -- "теоретически". Практически же, понятное дело, лучше такие вещи все-же проконтролировать. У меня по жизни несколько раз были случаи, когда вычисления вылетали за диапазон допустимых значений. Приходилось код подправлять ручками. Собственно, в этом и состоит труд разработчика-программиста.

Идем дальше.

Теперь занкомиься с понятием "символ". Вы знакомы с этим понятием в узком круге -- буква, цифта или знак препинания. Компиляторы, линковщики и прочиеутилиты рассматривают понятие "символ" как эквивалент имени констатны, имени переменной, имени функции. То есть несколько более расширено.

В нашем предыдущем коде символами являются следующие дефиниции: FCPU, BAUD, delay100ms, UBBRL. Какие-то из символов уйдут при компиляции, какие-то остануться вплоть до elf-файла. Ну, например, FCPU и BAUD скорее всего вы уже не найдете в elf-файле? А вот delay100ms -- он будет отаваться долго. Если вы пишите прогу для компа, а не для микроконтроллера, то этот символ также будет присутствовать и в исполняемом файле, если вы ничего специально не предпримите для его (точнее -- для их) удаления.

Так вот, символ -- это какая-то программная единица с уникальным именем.

До сих пор мы с вам говорили о символах, которые определены в программном коде. Но символы можно также определить (или задать) вне исходных текстов программы. Например, подставлять их в качестве параметра в строку при вызове компилятора:

Код
avr-gcc -mmcu=atmega32 -Wall -Os -DF_CPU=7372800UL -c -o myproga.o myproga.c


Это почти реальная строка для компиляции файла myproga.c в объектный файл myproga.o. Здесь компилятор -- avr-gcc, тип процессора atmega32, ну и так далее.

Обратите внимание на параметр -DF_CPU=7372800UL. Понятно, что эта конструкция определяет тактовую частоту. Но как! Имя "F_CPU" -- это ни что иное как символ. Конструкция "-D" -- это имя параметра. Черточка '-' говорит компилятору, что далее последует имя ключа. (В Виндовсе обычно используется знак '/' а не черточка.) Буква 'D' -- имя ключа, производное от слова DEFINE. И сразу за именем ключа следут имя символа. С непривычки это , конечно, кажетя одиозным! Чужая идеология, чужие понятия, чужие ценности. Но тот, кто постоянно этим пользуется не видят вообще ни каких проблем. Проблема чистов перестройке мышления. Однако, мы отошли от темы!

Так вот. С точки зрения компилятора, ему нет никакой разницы в том, откуда к нему пришел тот или иной символ -- из исходного теста программы или из командной строки. Во время совей работы компилятор составляет таблицы символов. И как в эту втаблицу попадают символы -- дело десятое. Главное чтобы таблица была и была валидной в работе.

Ну и наконец нам остается уточнить, что в работе мы используем Makefile. А это занчит, что в Makefile мы можем задать наши определения, например, вот так:

Код
MCU=atmega32
CC=avr-gcc
COMMON=-mmcu=$(MCU)

## Compile options common for all C compilation units.
CFLAGS=$(COMMON)
CFLAGS+=-Wall -DF_CPU=7372800UL -Os
...


и далее в этом Makefile их использовать для компиляции вот так:


Код
$(CC) $(CFLAGS) -c -o myproga myproga.c


или что тоже самое:

Код
avr-gcc -mmcu=$(MCU) -Wall -DF_CPU=7372800UL -Os -c -o myproga myproga.c


Ну, вроде бы доходчиво объяснил, откуда что берется.

И да! Чуть не забыл. Если вы посмотрите на проекты, в которых используется ARM-ы, то вы увидите, что символы задаются не только в исходниках и Makefile. Символы задаются еще и в ld-файле, который отвечает за сборку проекта. Тут вы найдете такие символы, как адреса начала оперативной памяти, ее размера. начало и размер флешь-памяти. Названия секций (text, data, bss и другие). И многие другие нужные символы.

Это по началу кажется очень сложным. Но когда познакомишься с "механикой", то начинаешь приходить к мысли, что ты реально Бог для своего проекта. Всё, абсолютно всё в твоей власти. И ты четко понимаешь как всё устроено и как на выходе получается код. Всё открыто, всё прзрачно. И самое главное -- что нужно сделать, чтобы внести те или иные изменения.

Ладно. Много напасал. Бодрости духа вам и здоровья! Остальное добудете сами!


--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- alexxx86   Makefile   Aug 14 2015, 04:32
- - Непомнящий Евгений   На просторах интернета информации о make выше крыш...   Aug 14 2015, 05:10
|- - zltigo   QUOTE (zhevak @ Aug 14 2015, 08:14) В Вид...   Aug 14 2015, 05:34
||- - _Pasha   Цитата(zltigo @ Aug 14 2015, 08:34) Наска...   Aug 14 2015, 06:53
||- - Непомнящий Евгений   Цитата(_Pasha @ Aug 14 2015, 09:53) А до...   Aug 14 2015, 07:30
|||- - _Pasha   Цитата(Непомнящий Евгений @ Aug 14 2015, 10...   Aug 16 2015, 11:39
|||- - zltigo   QUOTE (_Pasha @ Aug 16 2015, 14:39) потом...   Aug 16 2015, 12:17
||- - zltigo   QUOTE (_Pasha @ Aug 14 2015, 09:53) А до...   Aug 14 2015, 14:35
||- - alexxx86   zltigo, Ну если я ни чего не понял, тогда объяснит...   Aug 14 2015, 14:46
||- - zltigo   QUOTE (alexxx86 @ Aug 14 2015, 17:46) zlt...   Aug 14 2015, 15:15
|- - ataradov   QUOTE (alexxx86 @ Aug 13 2015, 22:34) Я р...   Aug 14 2015, 05:37
|- - Непомнящий Евгений   Цитата(alexxx86 @ Aug 14 2015, 08:34) zhe...   Aug 14 2015, 05:52
||- - zltigo   QUOTE (Непомнящий Евгений @ Aug 14 2015, 08...   Aug 14 2015, 06:07
|- - alexxx86   zhevak, Получается что если проект состоит из не ...   Aug 14 2015, 10:14
|- - kolobok0   Цитата(alexxx86 @ Aug 14 2015, 13:14) ......   Aug 14 2015, 15:08
|- - zhevak   Цитата(alexxx86 @ Aug 14 2015, 15:14) zhe...   Aug 14 2015, 16:33
|- - alexxx86   zhevak, Спасибо вам большое, за подробные и развер...   Aug 14 2015, 17:25
|- - zltigo   QUOTE (zhevak @ Aug 14 2015, 19:33) 4) в ...   Aug 14 2015, 19:03
|- - Canis Dirus   Цитата(zltigo @ Aug 15 2015, 00:03) А за ...   Aug 15 2015, 10:09
|- - zltigo   QUOTE (Canis Dirus @ Aug 15 2015, 13:09) ...   Aug 15 2015, 14:03
|- - zhevak   ЦитатаА за такое, как Вы описали, вообще надо бить...   Aug 15 2015, 15:31
|- - zltigo   QUOTE (zhevak @ Aug 15 2015, 18:31) Если ...   Aug 15 2015, 15:48
|- - zhevak   @zltigo Мои извинения. Наверно я не правильно Вас ...   Aug 15 2015, 16:39
|- - zltigo   QUOTE (zhevak @ Aug 15 2015, 19:39) @zlti...   Aug 15 2015, 16:45
- - ataradov   QUOTE (alexxx86 @ Aug 13 2015, 21:32) Я р...   Aug 14 2015, 05:26
- - gerber   Рискну пойти против течения... но в абсолютному бо...   Aug 16 2015, 12:30
- - kolobok0   Цитата(gerber @ Aug 16 2015, 15:30) ...пр...   Aug 16 2015, 12:42
- - zltigo   QUOTE (gerber @ Aug 16 2015, 15:30) ошибо...   Aug 16 2015, 12:52


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 30th July 2025 - 20:05
Рейтинг@Mail.ru


Страница сгенерированна за 0.01444 секунд с 7
ELECTRONIX ©2004-2016