Ошибки среды выполнения (RunTime)



Стадии разработки микропроцессорных систем

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

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

Формализация требований к системе.

Разработка структуры и архитектуры системы.

Разработка и изготовление аппаратных средств и программного обеспечения системы.

Комплексная отладка и приемосдаточные испытания.

 

Этап 1. На этом этапе составляются внешние спецификации, перечисляются функции системы, формализуется техническое задание (ТЗ) на систему, формально излагаются замыслы разработчика в официальной документации.

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

Этап 3. После определения функций, реализуемых аппаратурой, и функций, реализуемых программами, схемотехники и программисты одновременно приступают к разработке и изготовлению соответственно опытного образца и программных средств. Разработка и изготовление аппаратуры состоят из разработки структурных и принципиальных схем, изготовления прототипа, автономной отладки.

Разработка программ состоит из разработки алгоритмов; написания текста исходных программ; трансляции исходных программ в объектные программы; автономной отладки.

Этап 4. см. Комплексная отладка.

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

Существуют пять основных приемов комплексной отладки микропроцессорной системы:

1) останов функционирования системы при возникновении определенного события;

2) чтение (изменение) содержимого памяти или регистров системы;

3) пошаговое отслеживание поведения системы;

4) отслеживание поведения системы в реальном времени;

5) временное согласование программ.

 

Комплексная отладка завершается приемосдаточными испытаниями, показывающими соответствие спроектированной системы техническому заданию. Для проведения комплексной отладки МПС используют логические анализаторы и комплексы: оценочные, отладочные, развития микропроцессоров, диагностирования, средств отладки.

 

На каждом этапе проектирования МПС людьми могут быть внесены неисправности и приняты неверные проектные решения. Кроме того, в аппаратуре могут возникнуть дефекты.

 

2. Внутрисхемные эмуляторы (основные и дополнительные функциональные блоки)

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

Функционально внутрисхемные эмуляторы делятся настыкуемые с внешней ЭВМ и функционирующие автономно.

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

Основные функциональные блоки эмулятора:

· - отладчик;

· - узел эмуляции микроконтроллера;

· - эмуляционная память;

· - подсистема точек останова.

· - Дополнительные блоки:

· - процессор точек останова;

· - трассировщик;

· - профилировщик (анализатор эффективности программного кода);

· - таймер реального времени;

· - программно-аппаратные средства, обеспечивающие возможность чтения и модификации эмулируемого процессора;

· - программно-аппаратные средства, обеспечивающие синхронное управление, необходимое для эмуляции в мультипроцессорных системах.

Отладчик осуществляет:

· - управление процессом эмуляции (моделирования);

· - вывод на монитор состояния и содержимого всех регистров и памяти и, при необходимости, их модификации (изменение их содержимого).

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

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

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

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

Профилировщик позволяет получить по результатам прогона отлаживаемой программы следующую информацию:

· - количество обращений к различным участкам программы;

· - время, затраченное на выполнение различных участков программы.

Анализ статистической информации, поставляемой профилировщиком, позволяет легко выявлять «мертвые» или перенапряженные участки программ и в результате оптимизировать структуру отлаживаемой программы.

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

 

3. Программные симуляторы, мониторы отладки, эмуляторы ПЗУ

Программный симулятор – программное средство, имитирующее работу микроконтроллера и его памяти. В его состав входят отладчик, модель центрального процессора и памяти. Более сложные симуляторы содержат также модели встроенных периферийных устройств (таймеров, АЦП и систем прерываний). Загрузив программу в симулятор, пользователь может запускать ее в пошаговом или непрерывном режимах, задавать условные или безусловные точки останова, контролировать и свободно модифицировать содержимое ячеек памяти и регистров микроконтроллера. С его помощью можно быстро проверить логику выполнения программы и правильность выполнения арифметических операций.

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

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

Отладочный монитор – специальная программа, загружаемая в память отлаживаемой системы и вынуждающая процессор выполнять, кроме прикладной задачи, еще и отладочные функции:

· - загрузку прикладных кодов в свободную от монитора память;

· - установку точек останова;

· - запуск и останов загруженной программы в реальном времени;

· - проход программы пользователя по шагам;

· - просмотр, редактирование содержимого памяти и управляющих регистров.

Программа монитора должна быть связана с внешним компьютером или монитором для визуализации процесса отладки.

Основное достоинство использования монитора – это малые затраты при сохранении возможности вести отладку в реальном времени на микроконтроллере, стоящем на плате. Недостатком является отвлечение ресурсов микроконтроллера на отладочные и связные процедуры (память, прерывания, последовательный канал).

Платы развития, или оценочные платы, являются своеобразными конструкторами для макетирования прикладных систем. Выпуск оценочных плат – это современный подход к продвижению микроконтроллеров на рынке. Обычно на печатной плате устанавливается вся необходимая аппаратура для демонстрации возможностей микроконтроллера, обеспечивается связь с компьютером и предоставляется поле для монтажа прикладных схем пользователя. Такие платы могут быть применены для установки в аппаратуру малой серии (5 – 20 шт.).

Эмуляторы ПЗУ – это программно-аппаратные средства, позволяющие замещать ПЗУ на отлаживаемой плате и подставляющие вместо него ОЗУ, куда загружается программа с компьютера через один из стандартных каналов связи. В данном случае стараются избежать многократных циклов перепрограммирования ПЗУ. Метод пригоден для микроконтроллеров, которые в состоянии обращаться к внешней памяти программ. По сложности и стоимости метод сравним с использованием плат развития, но более универсален, так как может применяться с любыми типами микроконтроллеров.

 

4. Методика разработки ППО микропроцессорных систем. Структура программы

См. В5

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

Предложения ассемблера бывают четырех типов.

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

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

Приведем пример инструкции, которая осуществляет увеличение двоичного числа, хранящегося в регисреeax, на единицу:

inceax

макрокоманды – оформляемые определенным образом предложения текста программы, замещаемые во время трансляции другими предложениями.

Примером макрокоманды может служить следующий макрос конца программы:

exit macro

mov ax,4c00h

int 21h

endm

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

У директив нет аналогов в машинном представлении; В качестве примера приведем директиву TITLE, которая задает заголовок файла листинга: %TITLE «Листинг 1»

строки комментариев, содержащие любые символы, в том числе и буквы русского алфавита. Комментарии игнорируются транслятором. Пример:

; эта строчка является комментарием

 

5. Методика разработки ППО микропроцессорных систем. Директивы, операторы и функции ассемблера

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

· концепций и теоретических основ. В качестве таких основ могут выступать структурный или объектно-ориентированный подход;

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

· процедуры, определяющей практическое применение метода (последовательность и правила построения моделей, критерии, используемые для оценки результатов).

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

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

· количество связей между отдельными подсистемами должно быть минимальным;

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

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

· каждая подсистема должна инкапсулировать свое содержимое (скрывать его от других подсистем);

· каждая подсистема должна иметь четко определенный и интерфейс с другими подсистемами.

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

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

Итак, сущность структурного подхода к разработке ПО ЭИС заключается в его декомпозиции (разбиении) на автоматизируемые функции: система разбивается на функциональные подсистемы, которые, в свою очередь, делятся на подфункции, т.е. – на задачи и так далее до конкретных процедур. При этом автоматизируемая система, сохраняет целостное представление, в котором все составляющие компоненты взаимоувязаны. При разработке системы «снизу вверх», от отдельных задач ко всей системе, целостность теряется, возникают проблемы при описании информационного взаимодействия отдельных компонентов.

Все наиболее распространенные методы структурного подхода базируются на ряде общих принципов. Базовыми принципами являются:

· принцип «разделяй и властвуй»;

· принцип иерархического упорядочения – принцип организации составных частей системы в иерархические древовидные структуры с добавлением новых деталей на каждом уровне.

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

· принцип абстрагирования выделение существенных аспектов системы и отвлечение от несущественных;

· принцип непротиворечивости – обоснованности согласованность элементов системы;

· принцип структурирования данных – данные должны быть структурированы и иерархически организованы.

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

· DFD(DataFlowDiagrams) – диаграммы потоков данных;

· SADT(StructuredAnalysisandDesigntechnique – метод структурного анализа и проектирования), – модели и соответствующие функциональные диаграммы;

· ERD (Entity-Relationship Diagrams) диаграммы «сущность–связь». Диаграммы потоков данных и диаграммы «сущность–связь» – наиболее часто используемые в САSE-средствах виды моделей.

 

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

Директивы ассемблера.

Директивы ассемблера можно классифицировать следующим образом (рис. 1).

Рис. 1. Классификация директив ассемблера

Директивы режимов трансляции. Директивы определения общего режима трансляции определяют глобальные особенности трансляции, которые должны учитываться при обработке текста программы (рис. 2).

Рис. 2. Директивы определения общего режима трансляции

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

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

Основание системы счисления определяет, как будут интерпретироваться числа по умолчанию.

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

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

Директивы секционирования программы. Директивы секционирования программы предназначены для оформления логически законченных участков программы (рис. 3).

Рис. 3. Директивы секционирования программы

Сегменты программы могут описываться традиционными директивами segment и ends, как показано в приведенном примере, и директивами упрощенной сегментации.

Для описания процедур в ассемблере предусмотрены директивы proc и endp. Схематичное оформление процедуры с именем P:

P              proc

………

………; текст процедуры

……….

P              endp

Директивы макросредств. Директивы макросредств позволяют при написании программы оперировать заранее заготовленными фрагментами текстов. Их классификация (рис. 4).

Рис. 4. Классификация директив макросредств

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

Операнды

Могут быть использованы следующие операнды:

· Метки, определённые пользователем (дают значение своего положения).

· Переменные, определённые директивой SET.

· Константы, определённые директивой EQU.

· Числа, заданные в формате:

o десятичном (принят по умолчанию): 10, 255;

o шестнадцатеричном (два варианта записи): 0x0a, $0a, 0xff, $ff; 16

o двоичном: 0b00001010, 0b11111111;

o восьмеричном (начинаются с нуля): 010, 077.

· Константы с плавающей точкой.

· PC – текущее значение программного счётчика (PC – ProgrammCounter).

Операторы

Ассемблер поддерживает ряд операторов, которые перечислены в табл. 1 (чем выше положение в таблице, тем выше приоритет оператора). Выражения могут заключаться в круглые скобки, такие выражения вычисляются перед выражениями за скобками.

Таблица 1

Прио-ритет Сим- вол Описание Пример
1 2 3 4
14 ! Логическое отрицание возвращает 1, если выражение равно 0, и наоборот ldi r16, !0xf0;В r16 загрузить 0x00
14 ~ Побитное отрицание возвращает выражение, в котором все биты проинвертированы ldi r16, ~0xf0 ; В r16 загрузить 0x0f
14 - Минус возвращает арифметическое отрицание выражения (унитарный минус) ldi r16,-2; Загрузить -2 (0xfe) в r16
13 * Умножение возвращает результат умножениядвух выражений ldi r30, label*2
13 / Деление возвращает целую часть результатаделения левого выражения на правое ldi r30, label/2
13 % Деление по модулю ldi r30,label%2; label делится по модулю 2
12 + Суммирование возвращает сумму двух выражений ldi r30, c1+c2
12 - Вычитание возвращает результат вычи-тания правого выражения из левого ldi r17, c1-c2
11 << Сдвиг влево возвращает левое выраже-ние,сдвинутое влево на число бит, указанное справа ldi r17, 1<<bit; В r17 загрузить 1, сдвину-тую влево bit раз
11 >> Сдвиг вправо возвращает левое выражение, сдвинутое вправо на число бит, указанное справа ldi r17, c1>>c2;В r17 загрузить c1, сдвину-тое вправо c2 раз
10 < Меньше чем возвращает 1, если левое выражение меньше, чем правое (учитывается знак), и 0 в противном случае ori r18, bitmask*(c1<c2)+1
10 <= Меньше или равно: возвращает 1, если левое выражение равно или меньше, чем правое, (учитывается знак), и 0 в противном случае ori r18, bitmask*(c1<=c2)+1
10 > Больше чем возвращает 1, если левое выражение больше, чем правое (учитывается знак), и 0 в противном случае ori r18, bitmask*(c1>c2)+1
10 >= Больше или равно возвращает 1, если левое выражение равно или больше, чем правое (учитывается знак), и 0 в противном случае ori r18, bitmask*(c1>=c2)+1
9 == Равно возвращает 1, если левое выражение равно правому (учитывается знак), и 0 в противном случае andi r19, bitmask*(c1==c2)+1
9 != Не равно возвращает 1, если левое выражение не равно правому (учитывается знак), и 0 в противном случае SET flag = (c1!=c2);Установить flag равным 1 или 0
8 & Побитное И возвращает результат побитового И выражений ldi r18, High(c1&c2)
7 ^ Побитное исключающее ИЛИ возвращает резуль-тат побитового исключающего ИЛИ выражений ldi r18, Low(c1^c2)
6 | Побитное ИЛИ возвращает результат побитового ИЛИ выражений ldi r18, Low(c1|c2)
5 && Логическое И возвращает 1, если оба выражения не равны нулю, и 0 в противном случае ldi r18, Low(c1&&c2)
4 || Логическое ИЛИ возвращает 1, если хотя бы одно выражение не равно нулю, и 0 в противном случае ldi r18, Low(c1||c2)
3 ? Условный оператор Синтаксис: Условие ? выражение1 : выражение 2 ldi r18, > b? a : b ; Загрузка в r18 большегочисла из двух чисел a и b

Функции

В Ассемблере определены следующие функции:

LOW(выражение) – возвращает младший байт выражения;

HIGH(выражение)       – возвращает второй байт выражения;

BYTE2(выражение)     – то же, что и функция HIGH;

BYTE3(выражение)     – возвращает третий байт выражения;

BYTE4(выражение)     – возвращает четвёртый байт выражения;

LWRD(выражение)      – возвращает биты 0-15 выражения;

HWRD(выражение)     – возвращает биты 16-31 выражения;

PAGE(выражение)       – возвращает биты 16-21 выражения;

EXP2(выражение)        – возвращает 2 в степени (выражение);

LOG2(выражение)       – возвращает целую часть log2(выражение).

Следующие функции определены только в AVRASM2:

INT (выражение)          – преобразовывает выражение с плавающей точкой в целое (т.е. отбрасывает дробную часть);

FRAC(выражение)       – выделяет дробную часть выражения с плавающей точкой (т.е. отбрасывает целую часть);

Q7(выражение)                         – преобразовывает выражение с плавающей точкой в форму пригодную для инструкций FMUL/FMULS/FMULSU (знак + 7-битовая дробная часть);

Q15(выражение)           – преобразовывает выражение с плавающей точкой в форму пригодную для инструкций FMUL/ FMULS/FMULSU (знак + 15-битовая дробная часть);

ABS( )                                        – возвращает абсолютную величину постоян-ного выражения;

DEFINED(символ)       – возвращает «истина», если символ прежде определен директивами .equ, .set или .def. Обычно используется вместе с директивами if (.ifdefined(foo)), но может быть использовано в любом контексте. В отличие от других функций DEFINED(символ) требует наличия круглых скобок вокруг своего аргумента.

Ассемблер AVRASM2 различает регистр символов (AVRASM не

различает).

 

6. Классификация ошибок в ППО МС

Логическая ошибка

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

 Синтаксическая ошибка

 Каждый компьютерный язык, такой как C, Java, Perl и Python имеет специфический синтаксис, в котором будет написан код. Когда программист не придерживаться "грамматики" спецификациями компьютерного языка, возникнет ошибка синтаксиса. Такого рода ошибки легко устраняются на этапе компиляции.

Ошибка компиляции

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

Ошибки среды выполнения (RunTime)

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

Арифметическая ошибка

Многие программы используют числовые переменные, и алгоритм может включать несколько математических вычислений. Арифметические ошибки возникают, когда компьютер не может справиться с проблемами, такими как "Деление на ноль", или ведущие к бесконечному результату. Это снова логическая ошибка, которая может быть исправлена только путем изменения алгоритма.

 Ошибки ресурса

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

 Ошибка взаимодействия

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


 

7. Порты ввода-вывода: настройка выводов, считывание состояние вывода, разрешение цифрового ввода и режимы сна

Все порты ввода-вывода (ПВВ) AVR-микроконтроллеров работают по принципу чтение-модификация-запись при использовании их в качестве портов универсального ввода-вывода. Это означает, что изменение направления ввода-вывода одной линии порта командами SBI и CBI будет происходит без ложных изменений направления ввода-вывода других линий порта. Данное распространяется также и на изменение логического уровня (если линия порта настроена на вывод) или на включение/отключение подтягивающих резисторов (если линия настроена на ввод). Каждый выходной буфер имеет симметричную характеристику управления с высоким втекающим и вытекающим выходными токами. Выходной драйвер обладает нагрузочной способностью, которая позволяет непосредственно управлять светодиодными индикаторами. Ко всем линиям портов может быть подключен индивидуальный выборочный подтягивающий к плюсу питания резистор, сопротивление которого не зависит от напряжения питания. На всех линиях ПВВ установлены защитные диоды, которые подключены к VCC и Общему (GND), как показано на рисунке 29. Подробный перечень параметров ПВВ приведен в разделе "Электрические характеристики".


Рисунок 29 – Эквивалентная схема линии ПВВ

 

Ссылки на регистры и биты регистров в данном разделе даны в общей форме. При этом, символ “x” заменяет наименование ПВВ, а символ “n” заменяет номер разряда ПВВ. Однако при составлении программы необходимо использовать точную форму записи. Например, PORTB3, означающий разряд 3 порта B, в данном документе записывается как PORTxn. Адреса физических регистров ввода-вывода и распределение их разрядов приведены в разделе “Описание регистров портов ввода-вывода".

Для каждого порта ввода-вывода в памяти ввода-вывода зарезервировано три ячейки: одна под регистр данных – PORTx, другая под регистр направления данных – DDRx и третья под состояние входов порта – PINx. Ячейка, хранящая состояние на входах портов, доступна только для чтения, а регистры данных и направления данных имеют двунаправленный доступ. Кроме того, установка бита выключения подтягивающих резисторов PUD регистра SFIOR отключает функцию подтягивания на всех выводах всех портов.

Ниже приведено описание порта ввода-вывода для универсального цифрового ввода-вывода. Большинство выводов портов поддерживают альтернативные функции встроенных периферийных устройств микроконтроллера. Описание альтернативных функций приведено далее в подразделе “Альтернативные функции порта” (см. также описание функций соответствующих периферийных модулей).

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

Все порты являются двунаправленными портами ввода-вывода с опциональными подтягивающими резисторами. Рисунок 30 иллюстрирует функциональную схему одной линии порта ввода-вывода, обозначенный как Pxn.

 

 

Рисунок 30 – Организация универсального цифрового ввода-вывода (1)

Прим. 1: Сигналы WPx, WDx, RRx, RPx и RDx являются общими в пределах одного порта. Сигналы clkI/O, SLEEP, и PUD являются общими для всех портов.

Настройка выводов

Режим и состояние для каждого вывода определяется значением соответствующих разрядов трех регистров: DDxn, PORTxn и PINxn. Как показано в “Описании регистров портов ввода-вывода” доступ к битам DDxn возможен по адресу DDRx в пространстве ввода-вывода и, соответственно, к битам PORTxn по адресу PORTx, а к битам PINxn по адресу PINx.

Биты DDxn регистра DDRx определяют направленность линии ввода-вывода. Если DDxn = 1, то Pxn конфигурируется на вывод. Если DDxn=0, то Pxn конфигурируется на ввод.

Если PORTxn = 1 при конфигурации линии порта на ввод, то разрешается подключение подтягивающего резистора. Для выключения данного резистора необходимо записать в PORTxn лог. 0 или настроить линию порта на вывод. Во время сброса все линии портов находятся в третьем (высокоимпедансном) состоянии, даже если не работает синхронизация.

Если PORTxn = 1 при конфигурации линии порта на вывод, то состояние выхода будет определяться значением PORTxn.

Поскольку одновременная запись в регистры DDRx и PORTx невозможна, то при переключении между третьим состоянием ({DDxn, PORTxn} = 0b00) и выводом лог. 1 ({DDxn, PORTxn} = 0b11) должно возникнуть промежуточное состояние или с подключенным подтягивающим резистором ({DDxn, PORTxn} = 0b01) или с выводом лог. 0 ({DDxn, PORTxn} = 0b10). Как правило, переход через состояние с подключением подтягивающего резистора эквивалентно состоянию вывода лог.1, если вывод микроконтроллера связан с высокоимпедансным входом. В противном случае, необходимо установить бит PUD регистра SFIOR для выключения всех подтягивающих резисторов на всех портах

Переключение между вводом с подтягивающими резисторами и выводом низкого уровня связано с аналогичной проблемой. Поэтому, пользователь вынужден использовать или третье состояние ({DDxn, PORTxn} = 0b00) или вывод лог. 1 ({DDxn, PORTxn} = 0b11) в качестве промежуточного шага.

В таблице 25 подытоживается действие управляющих сигналов на состояние вывода.

Таблица 25 – Настройка вывода порта

DDxn PORTxn PUD (в SFIOR) Ввод-вывод Подтягивающий резистор Комментарий
0 0 X Ввод Нет Третье состояние (Z-состояние)
0 1 0 Ввод Да Pxn будет источником тока при подаче внешнего низкого уровня
0 1 1 Ввод Нет Третье состояние (Z-состояние)
1 0 X Вывод Нет Вывод лог. 0 (втекающий ток)
1 1 X Вывод Нет Вывод лог. 1 (вытекающий ток)

 

Считывание состояние вывода

Независимо от значения бита направления данных DDxn состояние вывода порта может быть опрошено через регистровый бит PINxn. Как показано на рисунке 30 регистровый бит PINxn и предшествующая ему триггерная защелка составляют синхронизатор. Данный подход позволяет избежать метастабильности, если изменение состояния на выводе произошло около фронта внутренней синхронизации. Однако такой подход связан с возникновением задержки. На рисунке 31 представлена временная диаграмма синхронизации во время опроса внешне приложенного к выводу уровня. Длительности минимальной и максимальной задержек на распространение сигнала обозначены как tpd,max и tpd,min, соответственно.

Рисунок 31 – Синхронизация во время опроса приложенного к выводу порта уровня

В следующих примерах показано как установить на линиях 0 и 1 порта В уровень лог. 1, а на линиях 2 и 3 – лог. 0, а также как настроить линии 4…7 на ввод с подключением подтягивающих резисторов на линиях 6 и 7. Результирующее состояние линий считываются обратно, но, с учетом сказанного выше, включена инструкция nop для обеспечения возможности обратного считывания только что назначенного состояния некоторых выводов.

Пример кода на Ассемблере (1)

...

; Разрешаем подтягивание и устанавливаем высокие выходные уровни

; Определяем направления данных линий портов

ldi r16,(1<<PB7)|(1<<PB6)|(1<<PB1)|(1<<PB0)

ldi r17,(1<<DDB3)|(1<<DDB2)|(1<<DDB1)|(1<<DDB0)

out PORTB,r16

out DDRB,r17

; Вставляем инструкцию nop для синхронизации

nop

; Опрос состояния выводов порта

in r16,PINB

...

Пример кода на Си (1)

unsigned char i;

...

/* Разрешаем подтягивание и устанавливаем высокие выходные уровни */

/* Определяем направления данных линий портов */

PORTB = (1<<PB7)|(1<<PB6)|(1<<PB1)|(1<<PB0);

DDRB = (1<<DDB3)|(1<<DDB2)|(1<<DDB1)|(1<<DDB0);

/* Вставляем инструкцию nop для синхронизации */

_NOP();

/* Опрос состояния выводов порта*/

i = PINB;

...

Прим. 1: В программе на Ассемблере используются два временных регистра для минимизации интервала времени от настройки подтягивающих резисторов на разрядах 0, 1, 6 и 7 до корректной установки бит направления, разрешающих вывод лог. 0 на линиях 2 и 3 и заменяющих высокий уровень на разрядах 0 и 1, образованный за счет подключения подтягивающих резисторов, на высокий уровень сильноточного драйвера.


Дата добавления: 2018-05-13; просмотров: 815; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!