і
МИ
Р
К
НТРОЛЛЕРЫ
1}
void TURN0FF_LED_START_2OMSEC(unsigned char buttonNo)
/ / Отключение светодиода и запуск таймера на 20 мсек
{
TURNFF_LED(buttonNo);
START_2OMSEC(buttonNo);
}
void START_20MSEC_CHANGE_BRIGHT(unsigned char buttonNo)
/ / Запуск таймера на 20 мсек и изменение яркости
{
START_2OMSEC(buttonNo);
CHANGE_BRIGHT(buttonNo);
}
void START_20MSEC_CHANGE_SIGN (unsigned char buttonNo)
/ / Запуск таймера на 20 мсех и изменение
{
START_2OMSEC(buttonNo);
CHANGE_SIGN(buttonNo);
}
Текст этого участка программы сравнительно не-
сложен, но он потребует достаточно обширных ком-
ментариев. Здесь мы, наконец, встретились с соб-
ственно конструкциями языка С. Сначала - короткие
комментарии (как обычно, комментируемые строки
отмечены в тексте программы номерами в угловых
скобках):
1. Это - описание переменной, которая будет
использоваться в нашей программе.
2. Это - описание массивов данных, которые
будут использоваться в нашей программе.
3. Это - функция, реализующая программу
выхода нашего будущего автомата.
4. Это - функция, реализующая программу
выхода нашего будущего автомата.
5. Это - функция, реализующая програмКлу
выхода нашего будущего автомата.
6. Это - функция, реализующая программу
выхода нашего будущего автомата.
А вот теперь - развернутые объяснения. Н. Вирт,
автор языка программирования Pascal, в заглавии сво-
ей известной книги вывел чеканную формулировку
“Алгоритмы + структуры данных = программы” (напо-
минает что-то ленинское про электрификацию ©). Ал-
горитмы в программах представлены в виде “актив-
ной части” - функций и процедур, структуры же дан-
ных (“пассивная часть") хранятся в программе в виде
переменных.
Аналог переменной языка С в ассембле-
ре - это ячейка памяти (или несколько подряд распо-
ложенных ячеек памяти) в ОЗУ. В программе на язы-
ке ассемблера каждая ячейка памяти легко отличает-
ся от другой, потому что у каждой ячейки памяти есть
свой адрес в памяти, который не совпадает ни с ка-
ким другим адресом - двух разных ячеек ОЗУ с од-
ним и тем же адресом не бывает. В программе на языке
С для того, чтобы отличить одну переменную от дру-
гой, используется понятие
имени,
т.е. каждая перемен-
ная имеет в программе свое собственное имя, не со-
впадающее ни с каким другим именем (за одним редким
знака изменения яркости
исключением, которое мы разберем немного позднее).
Двух
разных
переменных с
одним и тем же
именем не
бывает. Компилятор языка С распределяет перемен-
ные по ячейкам ОЗУ автоматически, что, во-первых,
значительно облегчает процесс программирования
(имя переменной может быть вполне осмысленным,
например, currentTime, а адрес ячейки ОЗУ никакой
осмысленной информации для человека не несет -
что, скажите, может храниться в ячейке с адресом
0x0060, если программист не позаботился написать
комментарий по этому поводу), и, во-вторых, позво-
ляет переносить программы, написанные на языке С,
с микроконтроллера на микроконтроллер (а при соблю-
дении некоторых правил - с любой платформы на
любую платформу). На новой платформе компилятор
просто перераспределит расположение переменных в
ОЗУ другим способом - лишь бы места хватило, - и
программа безо всяких изменений и “доработки на-
пильником” заработает “на новом месте”. Автор мо-
жет сослаться на собственный опыт - программатор,
описание которого было опубликовано в [1], первона-
чально был написан на языке С для PC АТ под управ-
лением ОС Windows, а потом был просто перенесен в
микроконтроллер АТМедав, при этом потребовалось
переписать всего только две функции на работу с пор-
тами (которых в Windows просто не существовало).
Литература
1.
А. Черномырдин. “Интеллектуальный” програм-
матор. - Радиолюбитель, №3/2008, стр. 32-34.
Радиолюбитель - 1 Г/2 00 8 [Г
Продолжение в №12/2008
41
предыдущая страница 41 Радиолюбитель 2008-11 читать онлайн следующая страница 43 Радиолюбитель 2008-11 читать онлайн Домой Выключить/включить текст