Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
LabsMilandr.pdf
Скачиваний:
474
Добавлен:
11.05.2015
Размер:
1.3 Mб
Скачать

Часть I. Процессор Cortex-M3. Программирование на ассемблере

42

3.4Заключение

Входе лабораторной работы, мы изучили структуру и алгоритм построения битовых полей в HEX файле и в самом Disassembly. Разобрались в построении битовых полей для заданных команд. Получили навыки в редактировании HEX файлов. Мы молодцы =)

3.5Содержание отчёта по лабораторной работе.

7.Подробное описание (протоколирование) работы с использованием копий экрана (screenshort-ов), ошибочных (неудачных) попыток в том числе.

8.Описание назначения битовых полей исследованной команды.

9.Побайтное описание строки из hex-файла, содержащей исследованную команду.

10.Заключение по проделанной работе

11.Папка с проектом данной лабораторной работы должна быть полностью сохранена в redmine.

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

ТУСУР, Миландр

Каф. ЭСАУ

Недяк С.П., Шаропин Ю.Б

Весна 2013 г.

Часть I. Процессор Cortex-M3. Программирование на ассемблере

43

4Исследование условного исполнения группы команд, одной из особенностей ядра Cortex-M3.

Лабораторная работа № 3

Цель. Освоить реализацию на языке Assembler условного оператора «if – then – else» в традиционном стиле и с использованием возможностей Cortex-M3.

4.1Введение

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

Для начала разберёмся, за счёт чего достигается ускорение работы ЦПУ. Тактовая частота остаётся прежней, а скорость работы, тем не менее, увеличивается.

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

-выборка команды из памяти; -декодирование команды; -генерация адреса операндов;

-выполнение операции с помощью АЛУ; -запись результата.

Вядре ARM Cortex-M3 одновременно исполняются только три операции:

-выборка; -декодирование; -исполнение команды.

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

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

ВIT-блоке (в условном блоке) могут участвовать до 4-х команд. При чтении ITкоманды (первой инструкции блока) информация о выполнении или невыполнении каждой команды блока, а также о количестве команд, принадлежащих данному блоку, записывается в регистр состояния исполнения ESPR. И далее на основании этой информации очередная команда либо выполняется, либо заменяется инструкцией NOP (no operation). Таким образом, мы видим, что ветвления, как такового, нет. Тем не менее, алгоритм работы условного оператора сохраняется и, самое главное, сохраняется конвейерный режим обработки команд. Именно этим и достигается увеличение скорости работы контроллера.

При выполнении лабораторной работы обратите внимание на машинный код команд, участвующих в IT-блоке. Значение суффикса условного исполнения никак не меняет машинный код.

4.2Содержание работы

1.Изучить документацию к контроллеру Миландр серии 1986ВЕ9х

ТУСУР, Миландр

Каф. ЭСАУ

Недяк С.П., Шаропин Ю.Б

Весна 2013 г.

Часть I. Процессор Cortex-M3. Программирование на ассемблере

44

 

spec_seriya_1986BE9x.pdf : стр.59 - программный регистр состояния исполнения

 

EPSR, стр. 75-76 – суффиксы условного исполнения, стр.126 – IT-блок .

 

В разных версиях spec_seriya_1986BE9x.pdf страницы могут быть отличны от здесь

 

указанных, Миландр регулярно обновляет документацию.

 

 

Пункт выполнить до занятий в аудитории.

 

2.

Создать новый проект.

 

3.

Написать функцию на Assembler-e, содержащую условный оператор.

С-

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

4.Написать функцию на Assembler-e, реализующую тот же алгоритм, но с использованием возможностей условного исполнения инструкций.

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

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

4.3Выполнение работы

1.Создайте новый проект и запустите готовый пример.

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

SV2\exchange\_BNK\MCU\Milandr\Library.rar:Library\Examples\ 1986BE91_EVAL\PORT\Joystick_LEDs \main.c

Исходный текст main.c – это разработка фирмы российской фирмы Phyton. Все комментарии на английском, на студентов разработчики явно не рассчитывали...

1.Запустите проект сначала в симуляторе. Он должен успешно откомпилироваться. Если содержатся ошибки – устраните.

2.Внимательно ознакомьтесь с правилами обращения с отладочной платой, детально вспомните содержание лабораторной работы № 0. Помните, что неквалифицированным обращением можно легко вывести отладочный комплект из строя.

3.Подключите отладочный комплект к персональному компьютеру или вашему ноутбуку. Если всё сделано правильно, то светодиод на плате J-Link должен гореть непрерывно. Мигание светодиода свидетельствует об отсутствии связи с компьютером или неверных настройках отладочного комплекта, либо об отсутствии драйвера на J-Link.

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

5.В категории Linker следует отметить галочкой Override default и указать следующий файл: $PROJ_DIR$\_Config\MDR32F1.icf. Следует убедиться, что этот файл действительно находится по указанному адресу.

6.В категории Debugger =>Download отметить галочкой Use flash loader(s) и отметить галочкой Override default board file $TOOLKIT_DIR$\config\flashloader\Milandr\FlashMDR32F1x.board.

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

ТУСУР, Миландр

Каф. ЭСАУ

Недяк С.П., Шаропин Ю.Б

Весна 2013 г.

Часть I. Процессор Cortex-M3. Программирование на ассемблере

45

Рисунок 1.21

7.Запустите проект на отладку. Если все предыдущие действия были выполнены правильно, то светодиоды на отладочной плате должны начать поочерёдно периодически мигать. Итак, вы только что «залили» программу в контроллер. С чем мы вас и поздравляем!

2.Программирование контроллера.

Сегодня, возможно, первый раз в жизни вы начнёте (уже начали) программировать контроллеры. Первое, что вы должны сделать, меняя (редактируя) программу в контроллере , это подумать, каким способом вы можете вывести электронные приборы из строя. В некоторых случаях сделать это на удивление легко. Поэтому, если такое событие возможно, нужно предпринять все меры, чтобы оно не произошло. Доскональное изучение документации и текста программ может избавить от многих неприятных проблем.

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

функция должна работать по алгоритму компилятора с языка С. Как пример приведём исходный текст на С:

int Func(int r){

if( r<20 ) r = 5; else r = 6;

return r; }//Func

Эквивалент Func() на ассемблере по алгоритму С-компилятора:

PUBLIC

Func

 

 

SECTION SSS : CODE (2)

 

Func:

 

 

 

CMP

R0,#20

; if( r<20 ) ~ if( r - 20 <=> 0)

 

BGE.N

Func_0

; if( r – 20 >= 0) goto Func_0;

 

 

 

 

 

 

 

 

 

ТУСУР, Миландр

Каф. ЭСАУ

Недяк С.П., Шаропин Ю.Б

Весна 2013 г.

Часть I. Процессор Cortex-M3. Программирование на ассемблере

46

MOVS

 

R1,#5

;

r = 5;

 

MOVS

 

R0,R1

 

 

 

B.N

 

Func_1

; goto Func_1;

 

Func_0:

 

 

 

 

 

MOVS

 

R1,#6

;

r = 6;

 

MOVS

 

R0,R1

 

 

 

Func_1:

 

 

 

 

 

BX

 

LR

;

return r;

 

И тот же алгоритм с использованием IT-блока:

 

PUBLIC

 

FuncA

 

 

 

SECTION SSS : CODE (2)

 

 

FuncA:

 

 

 

 

 

CMP

R0,#20

; if( r<20 ) ~ if( r - 20 <=>0)

 

ITE

 

LT

; ------------------ IT-block begin

MOVLT

R0,#5

;

r = 5;

 

 

 

 

; else

 

MOVGE

R0,#6

;

r = 6; ------- IT-block

end

BX

 

LR

; return r;

 

Обратите внимание, что в теле функции FuncA отсутствуют метки, код адаптирован для безостановочной работы на конвейере.

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

2. Теперь наша задача сравнить скорость работы функции без IT-блока и с таковым. Для оценки времени работы мы будем использовать светодиоды на отладочной плате. Длительность горения светодиода будет характеризовать время работы функции. От студентов 539гр. поступало предложение организовать вызов наших функций в модуле main.c из функции delay(). Т.е. эту функцию предлагалось отредактировать следующим образом:

extern int Func(int);

// Func.c | Func.asm

extern int FuncA(int);

// asm - file

void delay( uint32_t time )

 

{

 

for (;time; time--) //;

 

Func(22);

 

//FuncA(22);

 

}

 

3.Окончательно соберите проект и ещё раз прогоните его в симуляторе. Если ошибки отсутствуют, то переключите отладчик для внутрисхемной отладки и вновь запустите проект.

4.Подбирая должным образом времена задержки при зажигании светодиодов,

попытайтесь определить длительность работы функций Func() и FuncА().

5.

Измените

настройки

проекта

Options->C/C++Compiler

->Optimizations с

None на

High

и повторите пп. 2.1 – 2.4. Убедились, что

 

 

 

 

 

 

 

 

 

ТУСУР, Миландр

Каф. ЭСАУ

Недяк С.П., Шаропин Ю.Б

Весна 2013 г.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]