Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Уч. пос. МПТ (2.04.12).pdf
Скачиваний:
403
Добавлен:
22.03.2015
Размер:
10.95 Mб
Скачать

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

Для переноса подпрограмм и библиотечных функций в оперативную память придется вручную править сценарий редактора связей (Linker scatter file). Файл имеет расширение *.SCT.

Подключение сценария выполняется в свойствах проекта: Options for Target… Linker. Нужно снять флаг Use Memory Layout from Target Dialog и нажать кнопку Edit… (рисунок 2.3.16).

Приведем пример модифицированного сценария с небольшими комментариями. Добавленные строки выделены светло-серым цветом.

;**********************************************************

;** Scatter-Loading Description File generated by uVision *

;**********************************************************

LR_IROM1 0x00000000 0x00080000 {

 

 

ER_IROM1 0x00000000 0x00080000 {

; Область ПЗУ

 

*.o (RESET, +First)

 

 

*(InRoot$$Sections)

 

 

*armlib/c_* (+RO)

 

; Библиотечные функции

 

.ANY (+RO)

 

}

 

 

 

RW_IRAM1 0x40000000 0x00008000 {

; Область ОЗУ

 

RAM_Func.o (+RO)

; Функция пользователя

 

*armlib* (+RO)

 

; Подпрограммы

 

.ANY (+RW +ZI)

 

}

 

 

}

 

 

 

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

2.4 Методика отладки программ

В этом разделе будут даны рекомендации по диагностике программ и выявлению ошибок. Основным инструментом является среда разработки Keil µVision и один из многочисленных внутрисхемных отладчик с интерфейсом JTAG, например J-Link. Возможна работа и в отсутствии внутрисхемной отладки, но симуляция не гарантирует выявление всех ошибок и не может заменить проверку программы в функционирующей системе. В то же время некоторые возможности доступны только в режиме симуляции.

Для отладки программы в системе инженер должен иметь в своем распоряжении базовый комплект лабораторных электроизмерительных приборов: осциллограф (желательно цифровой), вольтметр или мультиметр, частотомер, а также источник регулируемого постоянного напряжения и функ-

131

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

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

Быстрый поиск не позволяет выявить ошибки в настройках периферийных устройств. Диагностике периферии посвящены разделы 2.4.2–2.4.13.

2.4.1 Быстрый поиск ошибок

Алгоритм процедуры быстрой отладки показан на рисунке 2.4.2. Напомним, что проверка программы выполняется нажатием Ctrl+F5 и F5. Перед началом любой диагностической операции необходимо остановить выполнение программы кнопкой Stop.

Ошибочный режим ядра. После запуска и остановки программы, прежде всего, следует обратить внимание на режим работы ядра (см. рисунок 2.4.1). Если после остановки программы ядро находится в режиме User/System, это нормально. Любой другой режим, чаще всего, следствие грубой ошибки, причины которых перечислены ниже.

Рисунок 2.4.1 – Индикация режима ядра

Зависание в режиме Supervisor. При выполнении программы режим Supervisor, скорее всего, возник, как следствие переполнения счетчика команд, потому что в программе отсутствует вечный цикл. Напомним, что сброс кнопкой на панели инструментов (рисунок 2.3.10, 1) также переведет ядро в режим Supervisor. Ошибкой это не является.

Зависание в режиме Abort всегда говорит об ошибке. Переход в режим Abort возникает в двух исключительных ситуациях: Data Abort и Prefetch Abort (см. раздел 1.6). Распознать возникшее исключение можно по команде, на которой произошло зависание.

Ели программная обработка этих исключений не реализована, то при Prefetch Abort зависание происходит на адресе 0x00000048, где размещена команда вечного цикла (см. файл Startup.s)

PAbt_Handler B PAbt_Handler

Data Abort дает зависание на следующей строке (адрес 0x0000004С)

DAbt_Handler B DAbt_Handler

132

 

 

Начало

 

 

Остановить программу

 

 

User/System

Режим ядра

Supervisor

 

 

1

 

 

 

Да

 

 

Нет вечного цикла

Зависание?

 

 

 

Нет

Abort

 

 

Конец

 

 

2

 

 

Индекс массива вне

 

 

 

 

Нет

Прерывание

допустимого диапазона

 

 

или

 

 

используется?

 

 

 

переполнение стека

 

 

Да

 

 

 

 

Всегда только Interrupt

 

 

Точка останова

3

 

в проц. обраб. прерыв.

 

Не сбрасывается флаг

 

Создать прерывающее

 

прерывания

 

 

событие

 

 

 

 

Да

Остановка?

Нет

 

 

4

 

 

 

 

 

 

Ошибка в настройке

 

Возобновить работу

 

системы прерываний

 

программы и повторить

 

 

 

прерывающее событие

 

5

 

 

 

Да

 

Нет

Не включен запрос

Остановка?

прерывания

 

 

 

 

 

 

 

7

 

Останов на команде

Нет обнуления

6

 

ввода-вывода,

 

VICVectAddr

Нет прерывающего

выполнение команды

 

события (ошибка в

ввода-вывода

 

 

настройки периферии)

Ввод-вывод

Да

 

 

 

 

 

верный?

 

8

 

Нет

Неверный режим

 

портовой линии

 

 

 

Проверка настроек

 

 

 

9

 

 

периферии.

 

 

 

 

 

Ошибка направления

Пошаговая проверка

 

 

 

 

портовой линии

алгоритма

 

 

 

 

 

 

 

 

 

 

 

 

 

 

10

Конец

Не выбрана

скорость порта

 

Рисунок 2.4.2 – Схема алгоритма диагностирования наиболее распространенных ошибок в программах для микроконтроллера LPC2148

133

4

3

2

1

Рисунок 2.4.3 – Переход ядра в режим Data Abort при обращении к недопустимому адресу памяти (смещение 0x60000000)

Режим Abort (Data Abort) чаще всего возникает из-за выхода за допустимые границы индекса массива, которому ошибочно не присваивается начальное значение или не контролируется принадлежность диапазону.

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

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

а) считать адрес ошибочной команды из регистра R14; на рисун-

ке 2.4.3 это адрес 0x00000244 (2);

б) найти в окне дизассемблера этот адрес (3), уменьшенный на 8

(0x0000023C);

в) щелчок в окне дизассемблера подсветит строку желтым цветом и выделит синей стрелкой искомую Си-команду, приводящую к ошибке (4).

Исключения Prefetch Abort возникает при передаче управления команде по недопустимому адресу. Частая причина исключения — переполнение стека. Проблема решается уменьшением числа вложенных функций или увеличением области памяти, выделяемой под стек. Настройки стека доступны через инструмент Configuration Wizard Stack Configuration (Stack Size in Bytes). Объем стека задается для каждого режима ядра в отдельности. Скорее всего, переполнение возникает в режиме Interrupt или Fast Interrupt. Для этих режимов, прежде всего, и следует менять объем стека.

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

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

Зависание в режиме User/System. Программа всегда содержит вечный цикл. Если по прошествии нескольких секунд после запуска остановка

134

произошла в точке выше вечного цикла, это говорит о зависании программы. Чаще всего такое зависание возникает в случае неудачной инициализации внешних устройств. Например, когда ЖК модуль не отвечает на команды.

Ошибки, связанные с системой прерываний. Если прерывания не используются, этот этап поиска ошибок следует пропустить.

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

Ошибка в настройке системы прерываний. Открыть окно настройки прерываний с помощью меню Peripherals Vectored Interrupt Controller

(рисунок 2.4.4). Основную часть окна занимает таблица, в которой перечислены все источники прерываний (1–2). Требуется убедиться, что:

а) прерывание от интересующего источника (1) разрешено (6); б) обычно, классифицировано как IRQ (3);

в) ассоциировано с нужным слотом (3) (только для IRQ); г) адрес обработчика задан (4), то есть не равен нулю.

Отключен запрос прерывания. Запрос прерывания от каждого источника включается через управляющие регистры соответствующего периферийного устройства. Для проверки разрешено ли формирование запроса требуется открыть окно периферийного устройства. О проверке этих битов сказано ниже в разделах 2.4.2–2.4.13.

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

 

4

 

5

1

6

 

 

2

 

3

1

– прерывания от таймеров;

4

– адрес обработчика прерывания;

2

– вид прерывания (IRQ или FIQ);

5

– флаг разрешения прерывания;

3

– номер слота;

6

– флаг запроса прерывания

Рисунок 2.4.4 – Окно настройки системы прерываний

135

Инициализация системы прерываний. Если оказывается, что прерывание возникает с появлением прерывающего события, но лишь однажды, скорее всего, пропущена команда обнуления регистра VICVectAddr. Лучше сделать эту команда в процедуре обработки прерываний последней. По невнимательности нередко обнуляют VICVectAddr0 вместо VICVectAddr.

Ошибки в настройке портовых линий. Возможно, программа рабо-

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

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

Для выявления ошибки следует воспользоваться окном Peripherals Pin Connection Block (рисунок 2.4.5). Окно представляет собой перечень линий порта 0 (1), напротив которых указан их текущий режим (2). По умолчанию установлен режим «GPIO Port 0.x» — это режим дискретного вводавывода. В меню (3) выбирается один из четырех возможных режимов каждой портовой линии. Нужно убедиться, что все необходимые альтернативные функции есть в списке (2), и назначены они верным портовым линиям (1).

1 – обозначения линий;

2 – режимы линий;

3 – меню выбора режима

2

1

3

Рисунок 2.4.5 – Окно настройки режимов портовых линий

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

Проверить настройку можно в окне Peripherals GPIO Slow / Fast Interface Port 0/1 (рисунок 2.4.6). Верхний ряд флажков отвечает за направление. Установленный флажок соответствует режиму вывода.

136