Советы и лайфхаки

Листинг программы это – Листинг (программирование) — это… Что такое Листинг (программирование)?

Листинг (программирование) - это... Что такое Листинг (программирование)?

Исходный код, написанный на JavaScript

Исхо́дный код (также исхо́дный текст) — текст компьютерной программы на каком-либо языке программирования. В обобщённом смысле — любые входные данные для транслятора.

Исходный код либо транслируется в исполняемый код при помощи компилятора, либо исполняется непосредственно по тексту при помощи интерпретатора.

Назначение

Исходный код либо используется для получения объектного кода, либо выполняется интерпретатором. Изменения никогда не выполняются над объектным кодом, только над исходным, с последующим повторным преобразованием в объектный.

Другое важное назначение исходного кода — в качестве описания программы. По тексту программы можно восстановить логику её поведения. Для облегчения понимания исходного кода используются комментарии. Существуют также инструментальные средства, позволяющие автоматически получать документацию по исходному коду — т. н. генераторы документации.

Кроме того, исходный код имеет много других применений. Он может использоваться как инструмент обучения; начинающим программистам бывает полезно исследовать существующий исходный код для изучения техники и методологии программирования. Он также используется как инструмент общения между опытными программистами, благодаря своей (идеально) лаконичной и недвусмысленной природе. Совместное использование кода разработчиками часто упоминается как фактор, способствующий улучшению опыта программистов.

Программисты часто переносят исходный код из одного проекта в другой, что носит название повторного использования кода (Software reusability).

Исходный код — важнейший компонент для процесса портирования программного обеспечения на другие платформы. Без исходного кода какой-либо части ПО, портирование либо слишком сложно, либо вообще невозможно.

Организация

Исходный код некоторой части ПО (модуля, компонента) может состоять из одного или нескольких файлов. Код программы не обязательно пишется только на одном языке программирования. Например, часто программы, написанные на языке Си, с целью оптимизации, содержат вставки кода на языке ассемблера. Также возможны ситуации, когда некоторые компоненты или части программы пишутся на различных языках, с последующей сборкой в единый исполняемый модуль при помощи технологии известной как компоновка библиотек (

library linking).

Сложное программное обеспечение при сборке требует использования десятков, или даже сотен файлов с исходным кодом. В таких случаях для упрощения сборки обычно используются файлы проектов, содержащие описание зависимостей между файлами с исходным кодом, и описывающие процесс сборки. Эти файлы так же могут содержать и другие параметры компилятора и среды проектирования. Для разных сред проектирования могут применяться разные файлы проекта, причем в некоторых средах эти файлы могут быть в текстовом формате, пригодном для непосредственного редактирования программистом с помощью универсальных текстовых редакторов, в других средах поддерживаются специальные форматы, а создание и изменения файлов производится с помощью специальных инструментальных программ. Файлы проектов обычно включают в понятие «исходный код». В подавляющем большинстве современных языковых сред обязательно используются файлы проектов вне зависимости от сложности прочего исходного кода, входящего в данный проект. Часто под исходным кодом подразумевают и файлы ресурсов, содержащие различные данные, например, графические изображения, нужные для сборки программы.

Для облегчения работы с исходным кодом, для совместной работы над кодом командой программистов, используются системы управления версиями.

Качество

В отличие от человека, для компьютера нет «хорошо написанного» или «плохо написанного» кода. Но то, как написан код, может сильно влиять на процесс сопровождения ПО. О качестве исходного кода можно судить по следующим параметрам:

  • читаемость кода (в том числе наличие или отсутствие комментариев к коду;
  • лёгкость в поддержке, тестировании, отладке и устранении ошибок, модификации и портировании;
  • низкая сложность;
  • низкое использование ресурсов — памяти, процессора, дискового пространства;
  • отсутствие замечаний, выводимых компилятором;
  • отсутствие «мусора» — неиспользуемых переменных, недостижимых блоков кода, ненужных устаревших комментариев и т. д.

Неисполняемый исходный код

Копилефтные лицензии для свободного ПО требуют распространения исходного кода. Эти лицензии часто используются также для работ, не являющихся программами — например, документации, изображений, файлов данных для компьютерных игр.

В таких случаях исходным кодом считается форма данной работы, предпочтительная для её редактирования. В лицензиях, предназначенных не только для ПО, она также может называться версией в «прозрачном формате». Это может быть, например:

  • для файла, сжатого с потерей данных — версия без потерь;
  • для рендера векторного изображения или трёхмерной модели — соответственно, векторная версия и модель;
  • для изображения текста — такой же текст в текстовом формате;
  • для музыки — файл во внутреннем формате музыкального редактора;
  • и наконец, сам файл, если он удовлетворяет указанным условиям, либо если более удобной версии просто не существовало.

См. также

Ссылки

Wikimedia Foundation. 2010.

dic.academic.ru

5 Описание программы (листинг 3.1)

Новый вариант программы является полной копией программы, разработанной в лаб. работе №2 (см.

листинг 2.1), в которую добавлены новые элементы, обеспечивающие антидребезговую задержку. Так как задержка нужна в двух разных местах программы, она оформлена в виде подпрограммы. Для формирования задержки используется один дополнительный регистр общего назначения.

Поэтому в начале нашей новой программы (строка 4) добавлена команда описания регистра. Регистру г17 присваивается имя loop. По-английски слово loop означает цикл. Таким именем принято называть переменные, применяемые для организации циклов. Таким образом, регистр loop можно считать переменной с именем loop.

Запись значения в этот регистр эквивалентна присвоению значения переменной. Также можно интерпретировать и другие операции с регистром. Сложение содержимого двух регистров можно считать сложением переменных, вычитание – вычитанием переменных, и так далее.

Подпрограмма задержки расположена в строках 32—37. Первой строке подпрограммы присвоена метка wait. Именно по этой метке и будет вызываться подпрограмма. Опустим пока назначение команд push и pop (

строки 32 и 36). Собственно процедура задержки расположена в строках 33—35. Формирование задержки производится путем многократного выполнения пустого цикла. Сначала в регистр loop записывается некоторое число (строка 33).

Затем начинается цикл, который постепенно уменьшает значение регистра loop до нуля (строки 34 и 35). Происходит это следующим образом. В строке 34 содержимое регистра уменьшается на единицу, а в строке 35 происходит проверка содержимого на нуль. Если содержимое регистра не равно нулю, то управление передается по метке wt l, и цикл повторяется. Когда же содержимое loop окажется равным нулю, очередного перехода не произойдет, и цикл задержки закончится.

Время задержки при этом определяется числом, загруженным в рабочий регистр, и временем выполнения команд, образующих программный цикл.

Предположим, что в управляющей программе необходимо реализовать временную задержку 153 мкс. Для ее получения требуется определить число Х, загружаемое в рабочий регистр. Определение числа Х выполняется на основе расчета времени выполнения команд, образующих данную подпрограмму (см.

листинг 3.1). При этом необходимо учитывать, что команды push и pop, ldi и ret выполняются однократно, а число повторений команд dec и brne равно числу Х. Кроме того, обращение к подпрограмме временной задержки осуществляется по команде rcall wait, время исполнения которой также необходимо

Листинг 3.1

;##############################################

;## Лабораторная работа 3 ##

;## Программа с использованием антидребезга ##

;##############################################

;------------------------- Псевдокоманды управления

1 .include "tn2313def.inc" ; Присоединение файла описаний

2 .list ; Включение листинга

3 .def temp = r16 ; Определение главного рабочего регистра

4 .def loop = r17 ; Определение регистра организации цикла

;------------------------- Начало программного кода

5 .cseg ; Выбор сегмента программного кода

6 .org 0 ; Установка текущего адреса на ноль

;-------------------------- Инициализация стека

7 ldi temp, RAMEND ; Выбор адреса вершины стека

8 out SPL, temp ; Запись его в регистр стека

;-------------------------- Инициализация портов ВВ

9 ldi temp, 0 ; Записываем 0 в регистр temp

10 out DDRD, temp ;Записываем этот 0 в DDRD (порт PD на ввод)

11 ldi temp, 0xFF ;Записываем число $FF в регистр temp

12 out DDRB, temp ; Записываем temp в DDRB (порт PB на вывод)

13 out PORTB, temp ; Записываем temp в PORTB (потушить светодиод)

14 out PORTD, temp ; Записываем temp в PORTD (включ. внутр. резист.)

;--------------------------- Инициализация компаратора

15 ldi temp, 0x80 ; Выключение компаратора

16 out ACSR, temp

;----------------------------Начало основного цикла

;---------------------------- Цикл ожидания замыкания кнопки

17 main:in temp, PIND ; Читаем содержимое порта PD

18 sbrc temp, 0 ; Проверка младшего разряда

19 rjmp main ; Если не ноль, переходим в начало

20 rcall wait ;Вызов подпрограммы задержки

;-----------------------------Переключение светодиода

21 in temp, PINB ;Читаем содержимое порта PB

22 sbrc temp, 0 ;Проверка младшего разряда

23 rjmp m1

24 sbi PORTB, 0 ;Установка выхода PB.0 в единицу

25 rjmp m2

26 m1: cbi PORTB, 0 ;Сброс PB.0 в ноль

;-----------------------------Цикл ожидания отпускания кнопки

27 m2: in temp, PIND ;Читаем содержимое порта PD

28 sbrs temp, 0 ;Проверка младшего разряда

29 rjmp m2 ;Продолжить ожидание отпускания кнопки

30 rcall wait ;Вызов подпрограммы задержки

31 rjmp main ;К началу цикла

;-----------------------------Подпрограмма задержки

32 wait: push loop ;Сохраняем содержимое регистра loop

33 ldi loop, 200 ;Помещаем в loop константу задержки

;Цикл задержки:

34 wt 1: dec loop ;Уменьшаем значение регистра loop

35 brne wt 1 ;Если не ноль, продолжаем цикл

36 pop loop ;Восстанавливаем значение регистра loop

37 ret ;Выход из подпрограммы

учитывать при подсчете временной задержки. В сводной таблице команд Ассемблера микроконтроллеров AVR указывается, за сколько тактов исполняется каждая команда: rcall – 3 такта, push – 2, ldi – 1, dec – 1, brne – 2 (команда brne выполняется за один такт, если не вызывает перехода, и за два такта, если вызывает переход), pop – 2, ret – 4 такта.

Тактовая частота кварцевого резонатора у нас равна 4 МГц. Длительность одного такта равна 0,25 мкс. Таким образом, подпрограмма выполняется за время (3 + 2 + 1 + (1+2)Х +2 +4) 0,25 мкс = (12 +3Х) 0,25 мкс= (3+0,75Х) мкс. . Из уравнения 3+0,75Х = 153 получим Х = 200

В данном случае при загрузке в регистр числа 200 требуемая временная задержка (153 мкс) реализуется точно. Если число Х получается дробным, то временную задержку можно реализовать лишь приблизительно. Для более точной подстройки в подпрограмму могут быть включены команды NOP (нет операции), время выполнения которой равно одному такту (в данном случае – 0,25 мкс).

Минимальная временная задержка, реализуемая подпрограммой, составляет 3,75 мкс (Х = 1). Временную задержку меньшей длительности программным путем можно реализовать, включая в программу цепочки команд NOP.

Максимальная задержка, которую можно сформировать при помощи 8-разрядного регистра и данной подпрограммы, равна (3+0,75*255) = 194,25 мкс.

Для реализации задержки большей длительности можно рекомендовать увеличить тело цикла включением дополнительных команд или использовать метод вложенных циклов. Так, например, если в подпрограмму задержки перед командой dec вставить дополнительно три команды NOP, то максимальная задержка составит (3+1,5*255) = 385,5 мкс (т.е. почти в 2 раза больше).

Задержку большей длительности можно получить также за счет предварительного деления частоты тактового генератора. Тогда длительность выполнения каждой команды нужно было бы умножать на коэффициент деления предварительного делителя.

Рассмотрим команды push и pop работы со стеком. Они предназначены для сохранения в стеке (push) и последующего восстановления (pop) содержимого регистра 1оор. В начале подпрограммы (строка 32) значение 1оор сохраняется, а перед выходом из подпрограммы (строка 36) – восстанавливается.

Подобный прием придает программе одно полезное свойство. После окончания работы подпрограммы значения всех регистров микроконтроллера остаются без изменений. В данном конкретном случае такое свойство ничего не дает, кроме дополнительной задержки. Однако в сложных программах, имеющих не одну, а несколько подпрограмм, одни и те же регистры удобно использовать в разных подпрограммах.

Те же самые регистры может использовать и основная программа. В этом случае описанное выше полезное свойство просто необходимо для правильной работы всей программы. Зная эту особенность, программисты стараются применять подобный прием в каждой подпрограмме, независимо от того, полезен он в данном конкретном случае или нет.

В соответствии с алгоритмом (рис.3.1) подпрограмма задержки в нашей программе вызывается два раза. Первый раз — после окончания цикла ожидания нажатия кнопки (строка 20). Второй раз — после окончания цикла ожидания отпускания кнопки (строка 30).

studfiles.net

Листинг - программа - Большая Энциклопедия Нефти и Газа, статья, страница 1

Листинг - программа

Cтраница 1

Листинги программ каждого модуля являются логической частью его описания. Однако листинги могут быть слишком объемистыми для объединения их в первозданном виде с каким-либо другим документом. Возможно включение в этот раздел листингов на микрофишах или помещение ссылок на них. Если здесь будут приведены не листинги, а ссылки, необходимо особенно тщательно следить за их точностью, сохраняя ее на протяжении всей фазы использования.  [1]

Листинг программы должен иметь удобочитаемый вид. Несколько страниц листинга можно сэкономить за счет уплотнения команд, но при этом теряется существенно больше в смысле удобочитаемости и общего понимания программы. Языки высокого уровня допускают большую свободу в использовании пробелов ддя расширения предложений. Ничего не теряется при неплотном написании факти-ческого кода, поскольку компилятор игнорирует незначащие про белы. Поэтому, убедительно рекомендуется записывать предложения в ясном и логичном формате.  [3]

Изучив листинги программы ПЗР, вычислите среднее число вопросов, задаваемых в обеих версиях для определения животного.  [4]

Кроме листинга программы, выдаваемого на печать на первом шаге, получается ряд выходных наборов данных, которые затем передаются на второй шаг как входные.  [5]

Печать листинга программы будет осуществлена с этой отметки. Директива LIST не будет напечатана, но последующие строки будут выводиться в исходной распечатке.  [6]

Из основного листинга программы FileBox видно, что и первая кнопка-селектор, и кнопка Close использует стиль WS GROUP. Данный стиль информирует Windows о том, что этот и следующие за ним элементы управления должны рассматриваться как группа.  [7]

По листингу программы легко удостовериться, что это правильная ссылка на MEM при относительной адресации. Расчет смещения выполняется в предположении, что счетчик команд указывает на следующую ячейку.  [8]

В листинге программы 3.5 F приведены только оригинальные подпрограммы для интерполяционного метода.  [9]

В листинге программы 7.3 F не приведены подпрограммы метода секущих SECANT и интегратора Рунге-Кутты RK21, взятые без изменения из программ 1.6 F и 6.2 F. Названные подпрограммы записаны в отдельном файле, который подсоединяется к программе 7.3 F на этапе компиляции и редактирования. Предлагаемый способ передачи параметров не нарушает общности подпрограммы SECANT и RK21 и позволяет использовать их без изменения. Синтаксис языка Фортран запрещает включать формальные параметры подпрограмм и функций в COMMON-блоки.  [10]

Ниже приведены листинги программ, реализующих указанные процедуры.  [11]

Ниже представлен листинг программы, используемый в этом параграфе. Программа содержит обучающий алгоритм. Для того чтобы прийти к быстрому решению, в ней используются минимальные и максимальные значения. Вопросы задаются на основе полученных оценок для соответствующих правил с учетом абсолютных разностей максимальных и минимальных значений для оценки степени их важности. Возможные исходы, которые не могут получить достаточно высоких оценок, чтобы заместить лучшие на данный момент предсказания, исключаются из дальнейшего рассмотрения. Запустив программу один раз, постарайтесь изменить ее так, чтобы значения в массиве RULEVALUE вычислялись в виде сумм квадратов отклонений относительно средних, а не абсолютных значений разностей.  [12]

В [4-7] приведен листинг программы на Фортране, реализующей стандартный алгоритм БПФ. В [8] представлена эффективная программа, написанная на Фортране, для действительных последовательностей.  [13]

В противном случае листинг программы будет иметь несколько необычный вид: все используемые буквы кириллицы в комментариях и сообщениях будут преобразованы в соответствующие буквы латинского алфавита.  [14]

Используя отладчик и необходимые листинги программы, можно очень быстро отладить программу, даже если она не располагает встроенными средствами отладки.  [15]

Страницы:      1    2    3    4

www.ngpedia.ru

Составление листинга программы – первая программа на МК

Листинг программы «demol.c» показан на Рис. 6.7. Имя программе придумает программист. Расширение «.с» обязательное. Текст набирается в редакторе «Programmer’s Notepad 2» (сокращённо PN2), который входит в пакет WinAVR вместо графической оболочки. Через него также производится создание проекта, исправление ошибок, компиляция программы и даже программирование MK.

Рис. 6.7. Листинг программы «demol.c».

Рис. 6.8. Внешний вид программы PN2.

Редактор PN2 является самостоятельным проектом со своим интернет-сайтом [6-8]. Внешний вид головного меню PN2 показан на Рис. 6.8.

Порядок действий.

1.3апустить на выполнение файл «WlnAVR-20100110-install.exe» (29 Мбайт), находящийся на прилагаемом компакт-диске. Этот файл при необходимости можно свободно скачать из Интернета [6-1]. Инсталлировать WlnAVR по умолчанию в папку C:\WinAVR-20100110\.

2.               Открыть редактор PN2: «Пуск — Программы — WinAVR-20100110 — Programmers Notepad [WinAVR]». Включить нумерацию строк: «Tools — Options — General — Default — <поставить «галочку» возле «Show Line Numbers»> — ОК».

3.               Создать в редакторе PN2 новый Си-файл: «File — New — С/С++». Ввести с клавиатуры текст программы согласно Рис. 6.7 и сохранить его на жёстком диске: «File — Save As… — <ввести путь и имя файла, например, для однозначности C:\1001\demol.c> — ОК».

Здесь и далее снимки экранов (скриншоты) для экономии места будут показываться только в самых важных точках действий. Остальные скриншоты в пошаговом режиме можно посмотреть на видеоуроках в прилагаемом компакт-диске.

Пояснения к листингу.

Строка 1 начинается с комментариев, которые ограничиваются слева двумя наклонными линиями «прямой слеш». Весь текст после знаков «//» может быть о чём угодно, на любом языке, с любыми вольностями и сокращениями. Это произвольная информация, которую программист пишет для самого себя, любимого, чтобы через месяц-другой вспомнить, о чём, собственно, шла речь. Обычно указывается краткое название программы и авторство.

Пояснения рекомендуется писать подробно, понятно и побольше. Наличие комментариев ни на один байт не увеличивает длину кодов прошивки MK.

Строка 2 тоже содержит комментарии, но уже технического плана. Здесь расписана электрическая схема подключения индикатора HL1 и кнопки SB1 к конкретным линиям портов MK. Названия сигналов соответствуют раскладке из дашита на MHKpocxeMyATmega48A (Рис. 6.9) [6-9].

Рис. 6.9. Раскладка сигналов MKATmega48A.

Практика текстового описания несложных схем в «шапке» программы широко распространена в сообществе программистов, которые ленятся рисовать и прикладывать графические схемы, считая, что «и так всё понятно».

Строка 3 указывает параметры «мэйкфайла» («makefile»). Для справки, нормальная работа компилятора AVR-GCC возможна при наличии двух обязательных файлов. Первый из них — файл листинга с расширением «.с», второй — файл системных указаний «makefile» без расширения. «Makefile» создаётся утилитой «MFile» (Рис. 6.10, автор JoergWunsch, Германия), входящей в WinAVR.

Рис. 6.10. Внешний вид программы MFile.

Порядок действий.

1.               Запустить на выполнение утилиту «MFile»: «Пуск — Программы — WinAVR- 2010010 – MFile [WinAVR]».

2.               Заполнить поля шаблона следующим образом (Рис. 6.11):

• в пункте «Makefile — Main file name… — Main file» ввести имя разрабатываемого проекта «demol» и нажать OK;

•                 в пункте «Makefile — MCU type — ATmega» выбрать MK «atmega48a»;

•                 в пункте «Makefile — Optimization level» задать уровень оптимизации «2». Другие возможности: «0» — без оптимизации, «s» — минимальная длина кодов, цифры «1 »…«3» — это три разных метода оптимизации, причём цифра «3» не означает лучший вариант, всё зависит от конкретной Си-программы.

Остальные пункты шаблона «makefile» корректировать не обязательно, пусть остаются принятыми по умолчанию.

Рис. 6.11. Заполнение полей в программе MFile.

3.              Сохранить файл: «File — Save As… — <выбрать папку C:\1001\> — ОК». Убедиться в том, что на жестком диске появился «makefile» длиной 17509 байтов.

Для каждого нового проекта и нового типа МК  надо составлять свой «makefile», при этом будет изменяться имя проекта и тип MK.

Строка 4 содержит комментарии, определяющие шестнадцатеричные числа младшего (Low), старшего (High) и расширенного (Ext) байтов конфигурации. Эти значения понадобятся в дальнейшем при программировании «фьюзов» MK.

С« ктг5информационно пустая. Она визуально отделяет текст комментариев от остальной части программы. Вместо одной можно вставить две пустые строки, что не принципиально. Главный смысл заключается в улучшении наглядности. На длину кодов прошивки MK это не влияет.

Внешнее оформление листинга придумывает сам программист, исходя из собственных представлений о красоте картинки и удобстве подачи информации. Часто по стилю оформления «шапки», строк листинга и комментариев можно опознать автора программы или составить его психологический портрет. Интересные заметки по этому поводу приведены в монографии Алена Голуба [6-10].

Строка 6 обслуживается препроцессором компилятора. Это не оператор языка Си и не комментарий. Название сложное, а смысл простой. Препроцессор (предварительный ПРОЦЕССОР) ищет в программе строки, начинающиеся с символа «#». Далее, в зависимости от ключевого слова, он выполняет определённое действие, например, «define» — присваивает значения константам, «if defined» — проверяет условие, «inC1ude» — подключает библиотеку функций и т.д.

Для первого знакомства достаточно знать, что библиотека функций представляет собой набор файлов, в которые помещаются тексты стандартных или часто повторяющихся процедур. В данном случае директива «#inC1ude» (в переводе с англ. «включать») активизирует системную библиотеку «avr/io.h», которая отвечает за работу портов ввода/вывода. Эта библиотека в разных компиляторах имеет разное название, но суть неизменна, без неё нельзя управлять ни одной линией портов MK. Следовательно, подключение библиотеки ввода/вывода обязательно для всех микроконтроллерных Си-программ.

Строка 7тоже обрабатывается препроцессором компилятора, но имеет ключевое слово «define» (в переводе с англ. «определять»). Следовательно, она объявляет константу INI и присваивает ей постоянное значение 255. В комментариях указывается перевод числа 255 в шестнадцатиричную 0xFF и двоичную 0bl 1111111 форму счисления. Разница между ними заключается в буквах «х» и «Ь» после обязательной цифры «0». Соответствие чисел в разных системах приведено в Табл. 6.3.

Таблица 6.3. Перевод чисел из шестнадцатиричной формы в двоичную и обратно

Если где-то в «теле» программы встречается константа INI, то компилятор без размышления подставляет вместо неё числовое значение, указанное в строке 7, т.е. 255. Это очень удобно для программистов при коррекции больших по объёму листингов, когда константы разбросаны по всему тексту. Кроме того, само название константы может нести смысловую нагрузку и служить словесной подсказкой. В частности, INI — это сокращение от английского слова «initialization» (инициализация), что означает некоторое начальное значение.

Важность размещения константы именно в «шапке» программы заключается в простоте её поиска и быстроте внесения изменений. Например, один раз откорректировав число «255», можно быть уверенным в том, что везде по тексту оно будет автоматически (и безошибочно!) проставлено через константу lNI.

Имя для константы придумывает программист, исходя из здравого смысла и человеческих предпочтений. По давней традиции названия констант пишутся заглавными символами. Первой в имени обязательно должна идти буква, например, I2CBUS, T34. Употребление кириллицы не допускается.

Объявление константы INI можно было записать ещё двумя равнозначными способами: «#define INI OxFF» или «#define INI Obl 1111111».

Строка 8 содержит оператор описания переменной «а». Переменную можно образно представить в виде шкатулки (ящика, коробки, пенала), где хранится некоторое количество предметов (бусинок, зёрен, спичек). Чтобы «шкатулки» отличались друг от друга, их маркируют разными надписями на корпусе, в данном случае буквой «а». Если в описании переменной не указано начальное число, то считается, что «шкатулка» пустая и она инициализируется нулём (а = 0). По ходу работы программы в «шкатулку» можно добавлять и из неё можно удалять предметы, т.е. увеличивать и уменьшать значение переменной.

Объём «шкатулки» зависит от её исходного объявления. В Табл. 6.4 указаны пределы, принятые в компиляторе AVR-GCC. Как видно, объявление «unsigned char» позволяет положить в «шкатулку» 255 предметов. Вместе с нулевым значением (пустая «шкатулка») всего будет 256 состояний или 256 байтов. Переменная с объявлением «unsigned long» уже больше похожа не на шкатулку, а на целый железнодорожный состав, который рассчитан на 4.2 млрд предметов.

Таблица 6.4. Размерности переменных, принятыевАУК-вСС

Поскольку MK не имеет развитых средств для работы с отрицательными числами, то на первых порах, чтобы не запутаться, лучше в программах использовать только положительные числа, т.е. содержащие объявление «unsigned».

«Отцы-командиры» языка С исдавних времён установили негласный порядок, согласно которому название переменной должно состоять не более, чем из 8 символов. В компиляторе AVR-GCC это правило игнорируется и переменная может содержать столько символов, сколько хочется, но без фанатизма. Единственное, что первой в названии обязательно должна стоять буква латинского алфавита, за ней могут следовать буквы, цифры, символы. Кириллица не допускается.

Переменная, в отличие от константы, содержит некоторое переменное (а не постоянное) число. Чтобы переменные отличались от констант, их записывают малыми буквами. Обычно стараются, чтобы название соответствовало смыслу, например, «count» для счётчика, «data» для данных, «delay» для задержки. Хотя иногда проще, привычнее и компактнее смотрятся однобуквенные переменные, хорошо знакомые со школьной алгебры, — а, b, с, d, i,j, k, x, у, z.

Какую размерность указывать для конкретной переменной, определяет программист. Поскольку переменная «а» в данном листинге является хранилищем для сбора информации с цифрового 8-битного порта «С», значит в неё должно вмещаться «два в восьмой степени» байтов, т.е. от 0 до 255.

Интересно, что компилятор не выдаёт ошибку, если перестраховаться и объявить переменную с запасом как «unsigned long а;». Правда, это приводит к напрасному увеличению объёма кода с 114 до 126 байтов и, соответственно, к небольшому уменьшению скорости выполнения программы.

Другая крайность — недооценка размерности, когда, например, вместо объявления «unsigned int» применяется «unsigned char». Если в такую переменную занести число, большее чем 255, то сохранится лишь остаток от деления на 256, а старшая часть безвозвратно потеряется. Образно говоря, предметы повысыпаются из «шкатулки» наружу. Компилятор не реагирует на подобные ошибки, считая, что программист находится в адекватном состоянии и понимает, что он делает. Правильное и безошибочное определение размерности переменных обычно приходит с опытом.

Строка 9 информационно пустая аналогично строке 5. Вставлять ли её в листинг, зависит от воли программиста.

Строка 10 заполняется комментариями, но для разнообразия они представлены в другом формате. А именно, текст отчёркивается с левой стороны символами «/*», а с правой стороны — символами «*/»• Такой стиль берёт начало с самых древних версий языка Си. Позже в комментариях стали применять символы «//», что характерно для языка С++. В WinAVR оба варианта имеют равное право на существование. «Новое» написание проще и нагляднее, а «старое» кое-где является единственно возможным, если требуется прокомментировать начало оператора.

Строка 11 содержит типовой вызов функции «main» согласно правилам Американского института стандартов ANSI (American National Standards Institute). Допускаются, но не рекомендуются, сокращённые выражения: «int main ()», «main ()», «main (void)». Иногда даже пишут «void main (void)», подчёркивая полное отсутствие принимаемых и передаваемых параметров. Для простых MK, не поддерживающих операционные системы реального времени, отрицательных последствий не будет. Однако, если думать о будущем, то лучше сразу заучить полную форму написания, что облегчит в дальнейшем перенос Си-программ на более современные микроконтроллерные платформы.

Строка 12 целиком отводится под первую открывающую фигурную скобку. Такой чести она удостоена не случайно. Компилятор языка Си при выполнении строки 12 производит начальную инициализацию регистров MK, установку стека, распределение адресного пространства. Механику этого ювелирного процесса изучать не надо (в отличие от программ на Ассемблере!).

Для программиста, главное, правильно усвоить две вещи, которые автоматически производит компилятор, входящий в WinAVR:

•                 при старте программы запрещаются все прерывания;

•                 линии всех портов MK настраиваются как входы без «pull-up» резисторов.

Строка 13. Наконец-таки, появилась первая исполняемая команда программы в виде оператора присваивания. Расшифровка символов:

•                 «DDRB» — условное имя восьмиразрядного регистра DDR порта «В»;

•                 «=» — знак записи данных в регистр DDRB;

•                 «ОЬ» — указание на то, что следующие 8 цифр будут в двоичном коде;

•                 «11111111» — биты записываемого в регистр DDRB двоичного числа, расположенные в порядке 7, 6, 5, 4, 3, 2, 1, 0 (слева старший бит, справа младший бит).

В результате выполнения данного оператора все линии порта «В» устанавливаются в режим выхода, поскольку во всех разрядах указаны единицы.

Оператор в строке 13 имеет отступ в два пробела слева. Это условность форматирования текста, которой придерживаются многие программисты. Компилятор «промолчит», если начать текст в первом или в седьмом столбце слева, кому как нравится. Существует лишь одна рекомендация: «Листинг Си-программы должен быть удобным для просмотра». Следуя ему, в дальнейшем все тексты будут форматироваться так, чтобы фигурные скобки располагались в нечётных столбцах по вертикали (1, 3, 5 и т.д.), причём в каждом столбце будут находиться только одна открывающая вверху и одна закрывающая внизу фигурные скобки.

Указанный порядок не догма, а способ сокращения листинга по ширине и по длине без потери информативности. Программист «у себя дома», в своих листингах, вправе вводить любое число пробелов, пустых строк и т.д.

Строка /4действует совместно со строкой 13, поскольку конкретное состояние линии порта в AVR-контроллерах определяется связкой двух регистров DDRx и PORTx, где «х» — порядковая буква порта, например, В, С или D. Если учесть, что в каждом регистре имеется 8 бит с номерами от 0 до 7 (условно «z»), то общий расклад по линиям портов выглядит следующим образом:

•                 DDRx.z = 1, PORTx.z = 1 — выход с ВЫСОКИМ уровнем;

•                 DDRx.z = 1, PORTx.z = 0 — выход с НИЗКИМ уровнем;

•                 DDRx.z = 0, PORTx.z = 1 — вход с « pull-up» резистором;

•                 DDRx.z = 0, PORTx.z = 0 — вход без « pull-up» резистора.

Обобщение строк 13 и 14: DDRB.0…DDRB.7 = 1, PORTB.O = 0, PORTB.l = 1, PORTB.2…PORTB.7 = 0, следовательно, линии 0, 2…7 порта «В» будут настроены как выходы с НИЗКИМИ уровнями, а линия 1 — как выход с ВЫСОКИМ уровнем. Поскольку к линии PB1 (вывод 15 микросхемы DD1 на Рис. 6.3) подключается индикатор HL1, то он будет погашен. Получается, что начальная часть технического задания выполнена успешно.

Строки 15, 16аналогичны строкам 13, 14, но для порта «С». Для разнообразия применяется подстановка константы lNI. После выполнения строк 15 и 16 все линии порта «С», даже те, которые не участвуют непосредственно в работе, будут настроены как входы с « pull-up» резисторами. Это стандартный приём начальной инициализации портов, чтобы активизировать внутренние подтягивающие резисторы, которые не дают «висеть в воздухе» КМОП-входам линий МК и устраняют пути проникновения всевозможных помех и наводок.

Строка 17 аналогична строкам 13, 14 и 15, 16, но для порта «D». Он в электрической схеме вообще не задействован, однако следует взять себе за правило — инициализировать в начале программы все без исключения порты. Их свободные линии должны быть настроены как входы с « pull-up» резисторами или как выходы с ВЫСОКИМ/НИЗКИМ уровнем. В будущем такой автоматизм позволит избежать коллизий и недоразумений.

Особенностью является присваивание регистру PORTD значения, ранее присвоенного в строке 13 регистру DDRB, т.е. двоичного числа Obl 1111111. Сделано это в учебных целях, ведь можно было бы поступить проще: «PORTD = OxFF;».

Ещё одна деталь заключается в отсутствии записи регистра DDRD. Это не опечатка, а сознательное сокращение листинга на одну строку, поскольку при включении питания согласно даташиту во все регистры DDRx, PORTx автоматически заносятся «нули», т.е. дополнительно обнулять регистр DDRD не обязательно.

Строка 18содержит оператор цикла «while». Для первого знакомства достаточно запомнить, что выражение «while (1)» означает последовательное выполнение операторов в строках 19…21 в бесконечном цикле.

Строка 19 содержит открывающую скобку и оператор присваивания. Такое совмещение допускается правилами языка Си, что позволяет сделать листинг более компактным по высоте.

После выполнения строки 19 в переменной «а» будет храниться байт состояния восьми линий порта «С», который был прочитан из регистра PINC. Если кнопка SB1 не нажата, то «а = OxFF», а если нажата, то «а = OxFE».

Строка 20сдвигает на один разряд влево содержимое переменной «а». Возможны два варианта: если «а» раньше было OxFF, то станет OxFE, а если было OxFE, то станет OxFD. Зачем это делается, подскажет следующая строка программы.

Строка 21 содержит оператор присваивания, но, по сравнению со строкой 19, переменная «а» и регистр порта поменялись местами. В языке Си такая рокировка приводит к замене операции чтения из порта операцией записи в порт. Итого, в порт «В» будет выведен код 0xFE (если кнопка SB1 не нажата) или код 0xFD (если кнопка SB1 нажата). В первом случае индикатор HL1 будет погашен, во втором — будет светиться, чего и требовалось добиться согласно техническому заданию.

Строки 22, 23 содержат закрывающие фигурные скобки. Если мысленно провести от них две вертикальные линии «снизу-вверх», то они укажут прямо на открывающие скобки в строках 19 и 12. Скобка в строке 22 указывает на повтор цикла в строках 19…21. Скобка в строке 23 начинается в первой слева позиции, следовательно, достигнут конец функции «main», а значит и основной программы.

Строка 24 содержит комментарии о номере версии WinAVR и о длине кодов прошивки, что весьма полезно при компиляции программы другими пользователями. Известно, что версии WinAVR совместимы между собой не на 100%, чему имеются наглядные примеры. Следовательно, длина скомпилированного кода одного и того же листинга может отличаться от релиза к релизу. Практический вывод — компилировать программу надо вначале тем пакетом WinAVR, который указан в строке 24, а уже потом на более старой или более новой версии, сверяясь с полученной длиной кодов как с проверочной контрольной суммой.

Внимательный читатель вправе заметить, что на этапе составления листинга Си-программы невозможно было заранее рассчитать, какой объём занимают коды в памяти MK. Честно говоря, надпись «114 байта (2.8%)» была дописана позже, после компиляции программы. Налицо наглядный пример той самой обратной связи, которая в структурной схеме на Рис. 6.1 была обозначена пунктиром между блоками «К» и «Л».

Строка 25 полностью пустая, но в отличие от строк 5 и 9, она означает физическое окончание листинга. Без этой завершающей строки компилятор выдаёт мягкое, но всё-таки предупреждение: «Warning: no newline at end of file» («Внимание: отсутствует новая линия в конце файла»).

Источник: Рюмик, С. М., 1000 и одна микроконтроллерная схема. Вып. 2 / С. М. Рюмик. — М.:ЛР Додэка-ХХ1, 2011. — 400 с.: ил. + CD. — (Серия «Программируемые системы»).

nauchebe.net

Листинг - программа - Большая Энциклопедия Нефти и Газа, статья, страница 4

Листинг - программа

Cтраница 4

Но, как следует из предыдущего материала, такое предположение ошибочно и фактический ассемблерный листинг программы выглядит так, как это показано на рис. 3.3. Из него очевидны два тонких изменения по сравнению с программой, написанной для гипотетической ЭВМ ( см. гл.  [46]

Принтер ( или устройство печати) предназначен для получения копий документов, листингов программ, результатов счета и пр. В базовых конфигурациях микро - ЭВМ широкое распространение нашли печатающие устройства различных типов: УВВПЧ-30-004, СМП-6327, ROBOTRON, D-100 и др. Отличительной особенностью их является наличие в контроллере буфера, который заполняется информацией, поступающей из регистра данных. Емкость буфера обычно больше или равна максимальному числу символов в выводимой данным устройством строке. Запись байта с магистрали в DSR воспринимается контроллером как требование выполнить определенную поспедовательность действий. Если записанный в DSR код больше или равен 40 ( 8) ( в этом случае он является кодом печатного символа, см. приложение 5), то происходит занесение этого кода а буфер. Коды меньше 40 ( 8) воспринимаются как управляющие Так, код FF вызывает переход на новую страницу ( при этг.  [48]

При необходимости транслятор обеспечивает выдачу объектного модуля на перфоленту для дальнейшей его загрузки, а листинг транслированной программы - на печатающее устройство.  [49]

Транслятор Ассемблера контролирует выполнение правил и для неправильно составленных выражений печатает сообщения об ошибках в листинге программы.  [50]

Числовая информация о координатах и топологии соединения вершин проекций вводится в управляющую программу OBRAZ ( см. листинг программы) соответствующими операторами ФОРТРАНа.  [52]

Это может пригодиться во время отладки, потому что при использовании абсолютной адресации легче разбираться в листинге программы.  [53]

Системы, относящиеся к средствам документирования, автоматизируют процесс подготовки технической документации на программы и информационные системы, включающей структурные листинги программ, описание баз данных и индексов, блок-схемы, отражающие взаимодействие отдельных модулей и таблицы перекрестных ссылок, по которым нетрудно проследить за использованием переменных и файлов.  [54]

В ходе отладки программных модулей и версий ( вариантов) программных систем фиксируются ошибки и нерациональные конструктивные решения, имеющиеся в листингах программ, а также назначаются способы их устранения.  [55]

Страницы:      1    2    3    4

www.ngpedia.ru

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *