Для улучшения восприятия текста программы, кроме «говорящих» названий подпрограмм широко используются «говорящие» имена переменных. Особенно улучшается читаемость программы в том случае, если имена этих переменных связаны с аппаратурой микроконтроллерного устройства.
Например, для микроконтроллера at89c5l можно назначить флагу завершения приема по последовательному порту R1 имя BytePeredan. Тогда участок программы на языке программирования С-51, соответствующий ожиданию завершения приема байта последовательным портом, будет выглядеть следующим образом:
if (BytePeredan) SBUF = SledujushchiyByte;
При таком выборе имени переменной исходный текст программы практически совпадает с фрагментом алгоритма, который этот участок программы реализует! В этом случае можно даже отказаться от применения комментария для пояснения фрагмента программы.
Применение подпрограмм является не только средством структурирования программы, но и существенно сокращает размер машинного кода, если подпрограммы многократно используются. Однако необходимо отметить, что при использовании подпрограмм несколько уменьшается быстродействие устройства. В случае если для разрабатываемого устройства это недопустимо, вместо подпрограмм можно использовать макросы, в названии которых точно так же будет отображаться выполняемое действие. Макрос, в отличие от подпрограммы, не передает управление в отдельную область памяти с последующим возвратом к следующему за вызовом подпрограммы оператору, а вызывает повторную подстановку одних и тех же команд столько раз, сколько в тексте программы встретилось имя макроса. Для образования макроса в программе на языке программирования С-51 достаточно объявить подпрограмму с префиксом inline.
Основная идея структурного программирования заключаются в том, что существует только четыре структурных оператора. При использовании этих структурных операторов можно построить сколь угодно сложную программу.
Первая управляющая конструкция это линейная цепочка операторов. Она довольно часто используется, поскольку многие задачи могут быть разбиты на несколько более простых последовательно выполняемых подзадач. Однако такой подход достаточно очевиден и применялся с самого начала программирования. Недостаток прямого использования такого подхода — это то, что пока не написана вся программа целиком, ее нельзя отлаживать. В результате отлаживаемая программа получается сложной и в ней трудно найти ошибки.
При использовании линейной цепочки операторов выполнение подзадач может быть поручено подпрограмме, в названии которой можно (и нужно) отразить подзадачу, которую должна решать эта подпрограмма. При этом вместо настоящих программ имеет смысл использовать подпрограммы-заглушки, принцип работы с которыми был рассмотрен ранее.
Блок-схема стандартной структурной конструкции управления «линейная цепочка операторов» приведена на рис. 7.4. Поясним процесс преобразования этой блок-схемы в исходный текст программы.
Рис. 7.4.
На момент написания алгоритма (и программы) верхнего уровня нам не известны детали их реализации, поэтому вместо настоящих подпрограмм, соответствующих элементам блок-схемы «Действие 1» и «Действие 2», поставим подпрограммы-заглушки, которые ничего не делают! Однако в именах подпрограмм отразим те алгоритмические действия, которые они должны осуществлять в дальнейшем. Для отладки программы (и алгоритма) того уровня, который пишется в данный момент, неважно, что подпрограммы ничего не делают. Главное, что мы можем проверить, каков порядок вызовов подпрограмм, и соответствует ли он ожидаемому. На этом же этапе можно отладить взаимодействие между программами.
Для этого мы можем произвести трансляцию программы и на отладчике проследить все действия программы. Возможность производить трансляцию и отладку программы на любом этапе ее написания позволяет находить ошибки сразу же после написания оператора! Ведь если мы написали только один оператор, то и совершить ошибку мы могли только в этом месте! То есть процесс поиска ошибки существенно упрощается. А ведь процесс написания программы на 90 % состоит из поиска ошибок.
После завершения отладки программы (и алгоритма!) текущего уровня можно перейти к написанию и отладке любой из подпрограмм, т. е. к превращению подпрограммы-заглушки в нормальную отлаженную программу. При этом очень важно заметить, что подпрограммы отлаживаются независимо друг от друга, что значительно облегчает написание программы (да и чтение этой программы в дальнейшем).
Пример использования подпрограмм-заглушек для реализации конструкции управления «линейная цепочка операторов» на языке программирования С-51 приведен в листинге 7.7, а на языке программирования ASM-51 — в листинге 7.8.