--и
М И к
U K U M M U J I J I t
ы
it
больш ом у счету дело вкуса автора програм м ы (автор,
ка к видно из приведенного кус ка програм м ы , предпо-
чи тает однострочны е). Н а зн ач е н и е ко м м ен тари ев в
п рограм м е, дум ается, ко м м ентариев не тр еб ует ©
Конструкции язы ка С, начинаю щ иеся символом “# ”
в первой позиции строки, назы ваю тся препроцессор-
ными дир екти в ам и . П роцесс ком пиляции програм м ы
на язы ке С достаточно слож ен. К а к правило, он со-
стоит из следую щ их ш агов:
- вначале те кс т програм м ы о бр аб аты вается т.н .
препроцессором язы ка С (им енно его директивы и н а-
чинаю тся символом “# ” в первой позиции строки). Для
препроцессора про гр ам м а на язы ке С - всего лиш ь
обы чны й текст, ничем не отличаю щ ийся, к прим еру,
от “Войны и мира", н икаки х специф ичны х для язы ка С
обр аб о то к он по больш ом у счету не производит. Р е -
зультатом работы препроцессора является п р о м еж у-
точны й ф айл, которы й вполне м ожно прочесть (при
указан и и ком пилятору специального клю ча ком пиля-
ции он м о ж ет закончить обработку програм м ы на язы -
ке С им енно на стадии препроцессора и просто сохра-
нить полученны й ф айл на диск).
- затем ф айл, полученны й на этапе препроцессор-
ной обработки, обрабаты вается собственно ком пиля-
тором язы ка С, который рассм атривает его уж е как пол-
ноценную програм м у на язы ке С. Результатом обработ-
ки программы на этом ш аге является новый ф айл, в
|
котором вместо программы на язы ке С содерж ится та
ж е сам ая програм м а, но уж е “написанная” ком пилято-
|
ром на язы ке ассем блера для соответствую щ его м и к-
роконтроллера! Э тот ф айл та кж е можно увидеть, если
указать компилятору специальны й ключ компиляции.
Т ако е реш ение (предварительны й перевод текста про-
граммы на язы ке С в текст программы на язы ке ассем -
блера) позволяет, во-первых, на этапе компиляции “под-
совы вать” компилятору как ф айлы програм м на язы ке
С, та к и ф айлы програм м на ассем блере, а, во-вторых,
значительно упростить сам компилятор. Дело в том, что
компиляторы с ассем блера для каж до го м икроконтрол-
л ера пиш утся в первую очередь, и к м ом енту н ап иса-
ния ком пилятора язы ка С они уж е сущ ествую т. “П одсу-
нуть" таком у компилятору текст программы на ассем б-
лере, построенны й из исходной программы на С, н а-
много прощ е, чем проделывать двойную работу по раз-
:
работке кодогенератора непосредственно из язы ка С,
тем более что процесс компиляции программ на ассем -
блере отнюдь не та к прост, как каж ется!
1
- и, наконец, ф айл программы на язы ке ассем блера,
обрабаты вается компилятором с язы ка ассем блера, и
превращ ается в т.н. объектный ф айл, в котором без зн а-
ния его структуры уж е ничего прочесть невозможно.
К ро м е того, после вы полнения собственно ком пи-
ляции, в действие вступает т.н. р едакто р связей, ко -
торы й связы вает с програм м ой дополнительны е про-
гр ам м н ы е м одули (н ап р и м е р , модули стан д ар тн ы х
биб лио тек язы ка С ). Н а выходе р ед акто р а образуется
т.н . загр узо ч н ы й ф айл, которы й у ж е приго ден для
непосредственной загр у зки в м икроконтроллер при
Радиолюбитель - 1
1
/200811
!
п ом ощ и п р о гр ам м а то р а (н ап р и м ер , ф айл ф о р м ата
*.Н Е Х ). И м енно тем , что компиляция програм м на язы -
ке С происходит з а три ш а га , объясняется “зага д о ч -
ное” н азван ие “3-rd P art com piler” ком пилятора язы ка
С в п о п ул яр н о й с и с т е м е п р о гр а м м и р о в а н и я A V R
Studio, ш ироко используем ой при работе с м икр окон -
троллерам и ATM EL.
И так, препроцессорны х директив у нас в приведен-
ном куске программы две: д иректива # in c lu d e и д и р ек-
тива # d e f!n e . С р азу хочется обратить вним ание чита-
теля на одну важную деталь - язы к С регистрочувстви-
телен, т.е. запись #include для него - правильная ди-
р ектива препроцессора, а, наприм ер, запись #iN cLuD e
- ош ибка! Всегда пом ните об этой особенности язы ка!
И так, что ж е делаю т в програм м е эти директивы :
- д иректива #include вклю чает в текст программы
содерж им ое ф айла, указан но е в кавы чках следом за
директивой. Д ействие ее напом инает действие ком би-
нации клавиш C trl+C и C trl+V в обычных текстовы х р е-
дакторах - скопировать содерж им ое ф айла и вставить
его в то место, где была директива. К а к правило, в этих
ф айлах содерж атся описания стандартны х ф ункций
библиотеки язы ка С, которы е будут использоваться в
наш ей програм м е - компилятор должен “знать”, как ус-
троены эти ф ункции, иначе он не см ож ет построить пра-
вильный код для их вы зова. Часто в таки е фдйлы по-
м ещ аю тся и описания элементов, общ их для несколь-
ких програм м проекта. Традиционно таки е ф айлы им е-
ют расш ирение *.h (от “header” - заголовок). Этой тр а-
диции, как и м ногих других, настоятельно реком енду-
ем придерживаться, если не хотите заслуж ить в свой
адрес несколько “теплы х” слов от коллег по ремеслу.
- директива #define - директива зам ены текста, ан а-
логичная ком бинации клавиш C trl+H во м ногих тексто -
вых ред акто рах. В данном случае это у ка за н и е п р е-
процессору зам енить в тексте програм м ы все уп о м и-
нания слова T IM E O U T на циф ру 3, B U T T O N _ O N - на
циф ру 2 и т.д. З ам еняем ы й те кс т носит в л и тер атур е
назван ие препроцессорной перем енной. Н азн ачени е
этой директивы , дум ается, пояснений не тр еб ует. О б -
ратите вним ание на ещ е одну традицию - все препро-
цессорны е перем енны е в язы ке С
всегда
зап исы в а-
ются
только
заглавны м и буквам и. Э то не требование
си нтаксиса язы ка, а неписаны й зако н, нар уш ать кото-
рый не советуем ©
Особенностью препроцессорной обработки являет-
ся ее рекурсивность. Э то значит, что если в тексте,
вставленном директивой #include, в свою очередь, со-
держ атся директивы #include, они та кж е будут обрабо-
таны , и “внутрь” вставляем ого ф айла будет вставлен
е щ е один ф айл. А налогично, если в зам ен ен н ом по
директиве #define тексте содержатся другие препроцес-
сорны е перем енны е, они, в свою очередь, тож е будут
зам енены . О чень злая ш уточка - написать ком пилято-
ру директиву #include “имя ф айла с програм м ой.с”, что-
бы он вставил програм м у “сам у в себя”.
Следую щ ий участок программы будет выглядеть так
(см. следующую страницу):
предыдущая страница 39 Радиолюбитель 2008-11 читать онлайн следующая страница 41 Радиолюбитель 2008-11 читать онлайн Домой Выключить/включить текст