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

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

2.Один или оба бита выбора прерывающего события (3) должны быть установлены. И выбрано, какие именно события будут вызывать запрос прерывания (5).

3.Должны быть заданы маски прерывающих событий (4, 7).

2.5 О программировании ARM7 на ассемблере

Система команд ARM7 (раздел 1.4) включает всего 45 инструкций, которые довольно сложны из-за многообразия методов адресации, условных полей и модификаторов. Программа на ассемблере получается громоздкой и

струдом читается. Поэтому ассемблер редко применяется в программировании для архитектуры ARM7.

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

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

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

2.В ходе поиска ошибок или причин возникновения исключительных ситуаций (раздел 2.4.1).

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

Рассмотрим основные приемы составления программы на ассемблере

сцелью продемонстрировать весь код исполняемый микроконтроллером, как есть, и без посредничества Си-компилятора.

Порядок создания проекта на основе ассемблера почти тот же, что и для Си-программ (разделы 2.3.1–2.3.3). Исключения лишь два:

а) файлу исходного текста присваивается расширение *.S;

б) здесь предполагается, что файл STARTUP.S к программе не подключается.

2.5.1 Основные правила записи программ на ассемблере

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

146

Основными являются поля операций и операндов. Допустимые операции и их синтаксис приведены в таблице (1.4.2)

Метка — это символьное обозначение адреса команды. Везде вместо метки будет выполняться подстановка адреса команды, которой предшествует метка. Чаще всего метки используются в командах передачи управления. Каждая метка должна быть уникальной и при этом является не обязательной. В отличие от многих других версий, в ассемблере RealView метки не заканчиваются двоеточием («:»).

Комментарии по желанию помещаются в конце строки и отделяются точкой с запятой («;»).

Приведем простой пример.

Label ADD

R1, R1, R0,

LSL #2

; R1 = R1 + R0 << 2

...

 

 

 

 

BEQ

Label

;

Перейти по метке, если Z = 0

2.5.2 Псевдокоманды

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

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

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

Рассмотрим часто используемые директивы ассемблера RealView 4.

Имя EQU Константа

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

AREA Имя, Параметры

Определяет область памяти с заданным Именем. С помощью параметров указывается назначение области памяти, например, DATA (данные) или CODE (код). От выбранного назначения зависят адреса определяемой области. Область CODE размещается, начиная с адреса 0x00000000, область DATA — с адреса 0x40000000. В программе обязательно должна существовать область CODE c именем RESET. Константы, размещаемые в памяти программ, следует объявлять в секции с парой параметров CODE, READONLY.

ENTRY

Обозначает точку входа в программу, показывает ее «начало». Одна такая директива всегда должна присутствовать в программе. Обычно помещается непосредственно после директивы AREA RESET, CODE.

147

Таблица 2.5.1 – Псевдокоманды, поддерживаемые ассемблером RealView 4

Мнемоническое обозначение

Операция

 

Фактическая реализация

 

и синтаксис

 

 

 

 

 

 

 

 

ADR{Усл}

,

 

Загрузка адреса

в регистр

Сложение или вычитание константы из PC ко-

 

мандами ADD или SUB

 

 

 

 

 

 

 

 

 

ADRL{Усл}

,

 

Загрузка адреса

в регистр

Дважды ADD или SUB с участием PC

 

 

(расширенный диапазон адресов)

 

 

 

 

 

 

 

 

ASR{Усл}{S}

 

, ,

Арифметический сдвиг вправо

Загрузка регистра командой MOV с использова-

ASR{Усл}{S}

 

, ,

нием сдвигового операнда

 

 

 

 

 

 

 

 

 

 

 

 

 

LDR{Усл}

,

 

Загрузка адреса

в регистр

Загрузка регистра командой LDR с косвенной

 

адресацией (PC + непосредственное смещение)

 

 

 

 

 

 

 

 

Загрузка 32-разрядной константы в

Размещение константы

в памяти программ

LDR{Усл}

, =

 

и загрузка с помощью LDR с индексной адреса-

 

регистр

 

 

 

 

 

цией. Смещением служит PC.

 

 

 

 

 

 

 

LSL{Усл}{S}

 

, ,

Логический сдвиг влево

Загрузка регистра командой MOV с использова-

LSL{Усл}{S}

 

, ,

нием сдвигового операнда

 

 

 

 

 

 

 

 

 

 

 

 

 

LSR{Усл}{S}

 

, ,

Логический сдвиг вправо

Загрузка регистра командой MOV с использова-

LSR{Усл}{S}

 

, ,

нием сдвигового операнда

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

POP{Усл}

 

 

Восстановить регистры из стека

Восстановление

регистров

командой

 

 

LDMIA R13!,{...}

 

 

 

 

 

 

 

 

 

PUSH{Усл}

 

 

Сохранить регистры в стек

Сохранение

регистров

командой

 

 

STMDB R13!,{...}

 

 

 

 

 

 

 

 

 

ROR{Усл}{S}

 

, ,

Циклический сдвиг вправо

Загрузка регистра командой MOV с использова-

ROR{Усл}{S}

 

, ,

нием сдвигового операнда

 

 

 

 

 

 

 

 

 

 

 

 

RRX{Усл}{S}

 

,

Циклический сдвиг вправо через

Загрузка регистра командой MOV с использова-

 

перенос на 1 разряд

 

нием сдвигового операнда

 

 

 

 

 

 

 

 

148

Имя SPACE Размер

Резервирует память для хранения данных заданного Размера. Имя становится синонимом адреса зарезервированного пространства. Единство адресного пространства позволяет применять эту директиву, как для постоянной, так и для оперативной памяти. Основное назначение — создание глобальных переменных в оперативной памяти (в области DATA).

Метка DCB/DCW/DCD Константа

«Прошивают» данные (числовые Константы) в памяти программ. Метка становиться синонимом адреса, по которому будут записаны данные. Разные директивы (DCB, DCW и DCD) служат для данных разного размера: байт, 16-разрядное слово, 32-разрядное слово (соответственно).

END

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

2.5.4 Макросы

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

Для объявления макроса служит следующая конструкция

MACRO

 

Имя

$Параметр1, $Параметр2, ...

...

 

MEND

 

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

Вызов макроса осуществляется так:

Имя Параметр1, Параметр2, ...

Имеется возможность организовать проверку условия и ветвление.

IF "$Параметр" == "Значение"

...

ELSE

...

ENDIF

Обращаем внимание на то, такая конструкция не приводит к программной проверке условия микроконтроллером. Проверку условия осуществляет ассемблер в ходе формирования исполнимого кода.

149