Материал: 6798

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

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

77

6Исследование условного исполнения группы команд. Лабораторная работа № 5

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

6.1Введение

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

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

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

•выборка команды из памяти;

•декодирование команды;

•генерация адреса операндов;

•выполнение операции с помощью АЛУ;

•запись результата.

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

•выборка;

•декодирование;

•исполнение команды.

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

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

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

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

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

Каф. ЭСАУ

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

Февраль 2017 г.

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

78

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

1.Изучить разделы документации к контроллеру "Миландр" серии 1986ВЕ9х spec_seriya_1986BE9x.pdf: стр.59 - программный регистр состояния исполнения EPSR, стр. 75-76 – суффиксы условного исполнения, стр.126 – IT-блок22. Пункт выполнить до занятий в аудитории.

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

3.Написать функцию на Assembler-e, содержащую условный оператор. Си-компилятор среды IAR использует традиционный стиль, без использования расширенных возможностей Cortex-M3.

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

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

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

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

1.Запускаем готовый пример. Сейчас мы воспользуемся исходным файлом, поставляемым с документацией фирмы "Миландр" для работы с портами вводавывода. Для этого нужно либо с сайтa фирмы, либо с кафедрального сервера скачать следующий пример исходного файла на языке Си: архив _BKN\MCU\Milandr\Library.rar и откройте файл Library\Examples\1986BE91_EVAL\PORT\Joystick_LEDs\main.c

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

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

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

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

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

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

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

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

22 - В разных версиях документации номера страниц могут быть отличны от здесь указанных, "Миландр" регулярно обновляет документацию. Здесь использовалась Версия 3.2.0 от 20.09.2012.

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

Каф. ЭСАУ

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

Февраль 2017 г.

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

79

Рисунок 44 Выбор устройства JTAG

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

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

5.Переключите отладчик (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;

 

MOVS

R1, #5

; r = 5;

 

MOVS

R0, R1

 

 

B.N

Func_1

; goto Func_1;

 

Func_0:

 

 

 

 

 

 

 

 

 

 

 

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

Каф. ЭСАУ

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

Февраль 2017 г.

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

80

 

 

 

 

 

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;

 

MOVGE

 

; else

 

R0, #6

;

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

 

BX

LR

;

return r;

 

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

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

условным оператором.

 

6. Теперь наша задача сравнить скорость работы функции без

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);

 

}

 

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

8.Подбирая должным образом времена задержки при зажигании светодиодов, попытайтесь определить длительность работы функций Func() и FuncА().

9.Измените настройки проекта Options->C/C++Compiler->Optimizations с None на High и повторите пп. 2.1 – 2.4. Убедились, что компиляторы пишут грамотные люди? Преимущества IT-блока почти сошли на нет. К сожалению, в практике встречаются случаи, когда программа без оптимизации работает устойчиво, а с оптимизацией начинает зависать. Так что с этой опцией обращаться следует осторожно. Если речь идёт о большой программе, то менять степень оптимизации на завершающей стадии проекта нежелательно, поскольку, избавившись от одной

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

Каф. ЭСАУ

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

Февраль 2017 г.

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

81

проблемы, можно запросто приобрести другую, ещё большую. На тестирование тоже сильно полагаться не стоит. Здесь нельзя не согласиться с Юровым В.И.[7]:

« надёжность программы достигается, в первую очередь, благодаря её правильному проектированию, а не бесконечному тестированию». Т.е. в программировании лучше всего, надёжнее всего, полагаться на свою собственную голову. Именно таким программированием мы немедленно и займёмся.

10.Разработайте (придумайте) функцию с условным оператором, чтобы преимущества использования IT-блока проявлялись в полной мере. Каким требованиям эта функция должна отвечать? Снова повторите пп. 2.1 – 2.4.

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

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

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

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

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

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

6.5Вопросы для самопроверки

1.Как работает конвейер в микропроцессорах?

2.Как в ARM Cortex-M3 работает условное исполнение команд? Для чего оно служит?

3.Как передаются параметры в функцию на ассемблере? Как возвращается результат вычислений?

6.6Требования к содержанию отчёта

1.Краткое изложение теории. Назначение EPSR. С какой целью в Cortex-M3 сделана возможность условного исполнения команд?

2.Описание последовательности работы, ошибочных (неудачных) действий в том числе.

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

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

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

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

Каф. ЭСАУ

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

Февраль 2017 г.

Источник: https://studfile.net/preview/16438538/