Циклические программы обработки элементов массива на языке Си
Задание
1. Изучить способы адресации микроконтроллера MSP430
2. Выполнить индивидуальное задание: разработать алгоритм и программу работы с элементами массива
3. Оформить отчет по лабораторной работе.
Введение
Семейство MSP430 имеет фон Ньюмановскую архитектуру с единым адресным пространством для регистров специального назначения (SFR), периферии, ОЗУ и Flash-памяти программ. Конкретное распределение памяти можно узнать из справочных данных на интересующее устройство. Доступ к программному коду выполняется всегда по четным адресам. Данные могут быть доступны как байты или как слова. Общий объем адресуемой памяти составляет 64 кБ, с учетом предполагаемого расширения.
Начальный адрес Flash-памяти зависит от объема имеющейся памяти и различается для разных устройств. Конечный адрес Flash-памяти всегда 0FFFFh. Flash- память может использоваться как для программного кода, так и для данных. Байты или слова таблиц данных могут сохраняться и использоваться непосредственно в Flash-памяти, что исключает необходимость копировать эти таблицы в ОЗУ перед дальнейшим использованием. Таблица векторов прерываний занимает верхние 16 слов адресного пространства Flash-памяти, при этом вектор прерывания с наивысшим приоритетом находится в самом верхнем адресном слове Flash-памяти (0FFFEh).
ОЗУ начинается с адреса 0200h. Конечный адрес ОЗУ зависит от объема представленной памяти и различается для каждого конкретного устройства. ОЗУ может использоваться как для программного кода, так и для данных.
Периферийные модули отображены в адресном пространстве. Адреса с 0100 до 01FFh зарезервированы для 16-разрядных периферийных модулей. Они будут доступны с помощью команд-слов. Если используются однобайтные команды, допустимы только четные адреса, при этом старший байт результата всегда будет содержать «0». Адресное пространство с 010h по 0FFh зарезервировано для 8-разрядных периферийных модулей. Эти модули доступны с помощью однобайтных команд. Чтение байтов модулей с помощью команд-слов приведет к появлению в старшем байте непредсказуемого содержимого. Если в байт модуля будут записываться данные в виде слова, то в регистре периферийного модуля сохранится только младший байт этого слова, старший будет проигнорирован.
Некоторые функции периферии конфигурируются в регистрах специального назначения SFRs. Регистры специального назначения расположены в низших 16-ти байтах адресного пространства и организованы в виде байтов. Обращение к регистрам SFRs производится только с использованием однобайтных команд. Назначение отдельных битов регистров SFRs описано в техническом руководстве на каждое конкретное устройство.
Байты расположены в четных или нечетных адресах. Слова располагаются только в четных адресах. При работе с командами словами должны использоваться только четные адреса. Младший байт слова всегда расположен по четному адресу. Старший байт – в следующем нечетном адресе. Например, если слово данных расположено по адресу xxx4h, то младший байт слова данных будет иметь адрес xxx4h, а старший байт слова адрес xxx5h.
Теоретическая часть
Семь режимов адресации для операнда источника и четыре режима адресации для операнда назначения могут адресовать полное адресное пространство без исключений. В таблице 1 приводится конфигурация битов для режимов As (источник) и Ad (назначение).
Таблица1 – Режимы адресации операндов источника/получателя
As/Ad | Режим адресации | Синтаксис | Описание |
00 / 0 | Регистровый режим | Rn | Содержимое регистра является операндом |
01 / 1 | Индексный режим | X(Rn) | Значение (Rn+X) указывает на операнд. X сохранен в следующем слове |
01 / 1 | Символьный режим | ADDR | Значение (PC+X) указывает на операнд. X сохранен в следующем слове. Использован индексный режим X(PC) |
01 / 1 | Абсолютный (безусловный) режим | &ADDR | Слово, следующее за командой, содержит абсолютный адрес. X сохранен в следующем слове. Использован индексный режим X(SR) |
10 / - | Косвенный регистровый режим | @Rn | Содержимое Rn использовано как указатель на операнд |
11 / - | Косвенный автоинкремент | @Rn+ | Содержимое Rn использовано как указатель на операнд. Содержимое Rn впоследствии увеличивается на 1 для байтовых команд и на 2 для команд-слов. |
11 / - | Прямой (непосредственный) режим | #N | Слово, следующее за командой, содержит непосредственную константу N. Использован косвенный автоинкрементный режим @PC+ |
Семь упомянутых способов адресации подробно рассматриваются в следующих разделах. В большинстве примеров показаны схожие режимы адресации для источника и получателя, но в команде возможны любые правильные комбинации способов адресации источника и получателя.
Примечание: использование меток EDE и TONI Везде в документации по семейству MSP430 используются универсальные метки EDE и TONI. Они являются только метками, не имеющими никакого специального назначения. |
Регистровый режим
Код ассемблера | Содержимое ПЗУ |
MOV R10,R11 | MOV R10, R11 |
Длина: | Одно или два слова | ||||||||||||||||||||||
Операция: | Пересылка содержимого R10 в R11. Содержимое R10 не изменяется. | ||||||||||||||||||||||
Комментарий: | Действительно для источника и получателя. | ||||||||||||||||||||||
Пример: | MOV R10,R11
|
Примечание: данные в регистрах Данные в регистре могут быть доступны с помощью байтовых команд или команд-слов. Если используются байтовые команды, старший байт всегда будет содержать в результате <0>. Биты статуса обрабатываются согласно результату байтовой команды. |
Индексный режим
Код ассемблера | Содержимое ПЗУ |
MOV 2(R5),6(R6) | MOV X(R5),Y(R6) X=2 Y=6 |
Длина: | Два или три слова |
Операция: | Пересылка содержимого с исходного адреса (равного сумме содержимого R5 + 2) по адресу назначения (содержимое R6 + 6). Регистры источника и получателя (R5 и R6) не изменяются. В индексном режиме программный счетчик автоматически инкрементируется таким образом, что выполнение программы продолжается со следующей команды. |
Комментарий: | Действительно для источника и получателя |
Пример: | MOV 2(R5),6(R6): |
Символьный режим
Код ассемблера | Содержимое ПЗУ |
MOV EDE,TONI | MOV X(PC),Y(PC) X=EDE-PC Y=TONI-PC |
Длина: | Два или три слова |
Операция: | Пересылка содержимого с исходного адреса EDE (равного сумме содержимого PC + X) по адресу назначения TONI (содержимое PC + Y). Слова после команды содержат разницу между PC и адресами источника или получателя соответственно. Ассемблер автоматически вычисляет и вставляет смещения X и Y. В символьном режиме программный счетчик автоматически инкрементируется так, что выполнение программы продолжается со следующей команды. |
Комментарий: | действительно для источника и получателя |
Пример: | MOV EDE,TONI ;Адрес источника EDE=0F016h ;Адрес получателя TONI=01114h |
Абсолютный режим
Код ассемблера | Содержимое ПЗУ |
MOV &EDE,&TONI | MOV X(0),Y(0) X=EDE Y=TONI |
Длина: | Два или три слова |
Операция: | Пересылка содержимого с исходного адреса EDE по адресу назначения TONI. Слова после команды содержат абсолютные адреса источника и получателя. В абсолютном режиме программный счетчик автоматически инкрементируется так, что выполнение программы продолжается со следующей команды. |
Комментарий: | Действительно для источника и получателя |
Пример: | MOV &EDE,&TONI ;Адрес источника EDE=0F016h ;Адрес получателя TONI=01114h |
Этот режим адресации предназначен главным образом для аппаратных периферийных модулей, расположенных по абсолютным, фиксированным адресам. Они адресуются в абсолютном режиме, что гарантирует переносимость программы (например, при написании позиционно-независимого, переносимого кода).
Косвенный регистровый режим
Код ассемблера | Содержимое ПЗУ |
MOV @R10,0(R11) | MOV @R10,0(R11) |
Длина: | Одно или два слова |
Операция: | Пересылка содержимого с исходного адреса (содержится в R10) по адресу назначения (содержится в R11). Регистры не изменяются. |
Комментарий: | Действительно только для операнда источника. В качестве операнда получателя подставляется 0(Rd) |
Пример: | MOV.B @R10,0(R11) |
Косвенный автоинкрементный режим
Код ассемблера | Содержимое ПЗУ |
MOV @R10+,0(R11) | MOV @R10+,0(R11) |
Длина: | Одно или два слова |
Операция: | Пересылка содержимого с исходного адреса (содержится в R10) по адресу назначения (содержится в R11). Регистр R10 инкрементируется после выборки на 1 для байтовых операций или на 2 для команд-слов, таким образом указывается следующий адрес без дополнительных действий. Это полезно для обработки таблиц. |
Комментарий: | Действительно только для операнда источника. В качестве операнда получателя подставляется 0(Rd) плюс вторая команда INCD Rd. |
Пример: | MOV.B @R10+,0(R11) |
Автоинкремент содержимого регистра происходит после выборки операнда.
Прямой режим
Код ассемблера | Содержимое ПЗУ |
MOV #45h,TONI | MOV @PC+,X(PC) 45 X=TONI-PC |
Длина: | Два или три слова. На одно слово меньше, если может использоваться константа генераторов CG1 или CG2. |
Операция: | Пересылка непосредственной константы 45h, находящейся в слове, следующем за командой, по адресу назначения TONI. Когда происходит выборка источника, программный счетчик указывает на слово, следующее за командой, и выполняется пересылка содержимого по назначению. |
Комментарий: | Действительно только для операнда источника |
Пример: | MOV #45h,TONI |
Полный набор команд семейства MSP430 содержит 27 команд ядра и 24 эмулированные команды. Команды ядра – это команды, имеющие уникальный код операции, декодируемый ЦПУ. Эмулированные команды представляют собой инструкции, облегчающие чтение и написание кода, но не имеющие собственного кода операции, поэтому ассемблер автоматически меняет их на эквивалентные команды ядра. Использование эмулированных команд не приводит к увеличению объема кода или снижению производительности.
Существует три формата команд ядра: с двойным операндом, с одиночным операндом, команды перехода.
Все команды с одним и двумя операндами могут быть командами для работы с байтами или командами для работы со словами, используя, соответственно, расширения «.B» или «.W». Байтовые команды используются для доступа к данным байта или к байту периферийного устройства. Команды-слова используются для доступа к данным слова или к слову периферийного устройства. Если никакое расширение не используется, команда является командой-словом.
Источник и получатель в команде определяются следующими полями:
src | Операнд источника определяется As и S-reg |
dst | Операнд получателя определяется Ad D-reg |
As | Адресные биты, задающие режим адресации, используемые для источника (src) |
S-reg | Рабочий регистр, используемый в качестве источника (src) |
Ad | Адресные биты, задающие режим адресации, используемые для получателя (dst) |
D-reg | Рабочий регистр, используемый в качестве получателя (dst) |
B/W | Операция с байтом или словом: 0: операция со словом 1: операция с байтом |
Примечание: адрес получателя Адрес получателя действителен в любом месте карты распределения памяти. Однако, при использовании команды, изменяющей содержимое получателя, пользователь должен быть уверен, что по адресу назначения можно производить запись. К примеру, маскированное ПЗУ имеет правильный адрес назначения, но его содержимое не может модифицироваться, поэтому команда изменения его содержимого не будет правильно выполнена. |
Примечание: использование меток EDE и TONI Везде в документации по семейству MSP430 используются универсальные метки EDE и TONI. Они являются только метками, не имеющими никакого специального назначения. |
Команды с двойным операндом (Формат I)
На рис. показана структура формата команды с двойным операндом.
В таблице 2 приведено описание и перечень команд с двойным операндом.
Таблица 2 – Команды с двойным операндом
Мнемоника | S-Reg, D-Reg | Операция | Биты статуса | |||
V | N | Z | C | |||
MOV(.B) | src,dst | src --> dst | - | - | - | - |
ADD(.B) | src,dst | src + dst --> dst | * | * | * | * |
ADDC(.B) | src,dst | src + dst + C --> dst | * | * | * | * |
SUB(.B) | src,dst | dst + .not.src + 1 --> dst | * | * | * | * |
SUBC(.B) | src,dst | dst + .not.src + C --> dst | * | * | * | * |
CMP(.B) | src,dst | dst – src | * | * | * | * |
DADD(.B) | src,dst | src + dst + C --> dst (десятичное) | * | * | * | * |
BIT(.B) | src,dst | src .and. dst | * | * | * | |
BIC(.B) | src,dst | .not.src .and. dst --> dst | - | - | - | - |
BIS(.B) | src,dst | src .or. dst --> dst | - | - | - | - |
XOR(.B) | src,dst | src .xor. dst --> dst | * | * | * | * |
AND(.B) | src,dst | src .and. dst --> dst | * | * | * |
* - Влияет на бит статуса
- - Не влияет на бит статуса
0 - Бит статуса очищается
1 - Бит статуса устанавливается
Примечание: Команды CMP и SUB Команды CMP и SUB идентичны, за исключением сохранения результата. Это также справедливо для команд BIT и AND. |
Команды с одним операндом (Формат II)
На рис. показана структура формата команды с одним операндом.
В таблице 3 приведено описание и перечень команд с одним операндом.
Таблица 3 – Команды с одним операндом
Мнемоника | S-Reg, D-Reg | Операция | Биты статуса | |||
V | N | Z | C | |||
RRC(.B) | dst | C --> MSB --> … LSB --> C | * | * | * | * |
RRA(.A) | dst | MSB --> MSB --> … LSB --> C | * | * | * | |
PUSH(.B) | src | SP-2 --> SP, src --> @SP | - | - | - | - |
SWPB | dst | Обмен байтами | - | - | - | - |
CALL | dst | SP-2 ? SP, PC+2 --> @SP dst --> PC | - | - | - | - |
RETI | TOS --> SR, SP+2 --> SP TOS --> PC, SP+2 --> SP | * | * | * | * | |
SXT | dst | Бит7 --> Бит8 … … Бит15 | * | * | * |
* - Влияет на бит статуса
- - Не влияет на бит статуса
0 - Бит статуса очищается
1 - Бит статуса устанавливается
Для команды CALL возможны все способы адресации. Если используется символический режим (Адрес), прямой режим (#N), абсолютный режим (&EDE) или индексный режим x(RN), следующее за командой CALL слово должно содержать информацию об адресе.
Команды перехода
На рис. показан формат команды условного перехода.
В таблице 4 приведено описание и перечень команд переходов.
Таблица 4 – Команды переходов
Мнемоника | S-Reg, D-Reg | Операция |
JEQ/JZ | Метка | Переход к метке, если бит нуля (Z) установлен |
JNE/JNZ | Метка | Переход к метке, если бит нуля (Z) сброшен |
JC | Метка | Переход к метке, если бит переноса (C) установлен |
JNC | Метка | Переход к метке, если бит переноса (C) сброшен |
JN | Метка | Переход к метке, если бит отрицательного результата (N) установлен |
JGE | Метка | Переход к метке, если (N.XOR.V)=0 |
JL | Метка | Переход к метке, если (N.XOR.V)=1 |
JMP | Метка | Безусловный переход к метке |
Условные переходы обеспечивают ветвление программы относительно программного счетчика PC и не оказывают влияния на биты статуса. Возможный диапазон переходов с помощью команды перехода составляет от -511 до +512 слов относительно текущего значения PC. 10-разряное смещение программного счетчика обрабатывается как 10-разрядное значение со знаком: удваивается и складывается с содержимым программного счетчика:
PCnew=PCold + 2 + PCoffset x 2 | |
где: | PCnew – новое содержимое программного счетчика; PCold – исходное содержимое программного счетчика; PCoffset – 10-разрядная величина смещения программного счетчика. |
Таблица 5 – Набор команд MSP430
Мнемоника | Описание | V | N | Z | C | ||
ADC(.B)* | dst | Сложение бита С с получателем | dst + C -> dst | * | * | * | * |
ADD(.B) | src,dst | Сложение источника с получателем | src + dst -> dst | * | * | * | * |
ADDC(.B) | src,dst | Сложение источника и бита С с получателем | src + dst + C -> dst | * | * | * | * |
AND(.B) | src,dst | Операция «И» источника и получателя | src .and. dst -> dst | * | * | * | |
BIC(.B) | src,dst | Очистка битов в получателе | .not.src .and. dst -> dst | - | - | - | - |
BIS(.B) | src,dst | Установка битов в получателе | src .or. dst -> dst | - | - | - | - |
BIT(.B) | src,dst | Проверка битов в получателе | src .and. dst | * | * | * | |
BR* | dst | Переход по назначению | dst -> PC | - | - | - | - |
CALL | dst | Вызов получателя | PC + 2 -> stack, dst -> PC | - | - | - | - |
CLR(.B)* | dst | Очистка получателя | 0 -> dst | - | - | - | - |
CLRC* | Очистка бита С | 0 -> C | - | - | - | ||
CLRN* | Очистка бита N | 0 -> N | - | - | - | ||
CLRZ* | Очистка бита Z | 0 -> Z | - | - | - | ||
CMP(.B) | src,dst | Сравнение источника и получателя | dst – src | * | * | * | * |
DADC(.B)* | dst | Десятичное сложение бита С с получателем | dst + c -> dst (десятичное) | * | * | * | * |
DADD(.B) | src,dst | Десятичное сложение источника и бита С с получателем | src + dst + C -> dst (десятичное) | * | * | * | * |
DEC(.B)* | dst | Декремент получателя | dst - 1 -> dst | * | * | * | * |
DECD(.B)* | dst | Двойной декремент получателя | dst - 2 -> dst | * | * | * | * |
DINT* | Запрещение прерываний | 0 -> GIE | - | - | - | - | |
EINT* | Разрешение прерываний | 1 -> GIE | - | - | - | - | |
INC(.B)* | dst | Инкремент получателя | dst + 1 -> dst | * | * | * | * |
INCD(.B)* | dst | Двойной инкремент получателя | dst + 2 -> dst | * | * | * | * |
INV(.B)* | dst | Инвертирование получателя | .not.dst -> dst | * | * | * | * |
JC/JHS | label | Переход, если С установлен / переход если наивысший или такой же | - | - | - | - | |
JEQ/JZ | label | Переход, если равно / переход если Z установлен | - | - | - | - | |
JGE | label | Переход, если больше или равно | - | - | - | - | |
JL | label | Переход, если меньше | - | - | - | - | |
JMP | label | Переход | PC + 2 * смещение -> PC | - | - | - | - |
JN | label | Переход, если N установлен | - | - | - | - | |
JNC/JLO | label | Переход, если С не установлен / переод если низший | - | - | - | - | |
JNE/JNZ | label | Переход, если не равно, переход если Z не установлен | - | - | - | - | |
MOV(.B) | src,dst | Пересылка источника в получатель | src -> dst | - | - | - | - |
NOP* | Нет операции | - | - | - | - | ||
POP(.B)* | dst | Снятие элемента со стека в получатель | @SP -> dst, SP + 2 -> SP | - | - | - | - |
PUSH(.B) | src | Помещение источника в стек | SP - 2 -> SP, src -> @SP | - | - | - | - |
RET* | Возврат из подпрограммы | @SP -> PC, SP + 2 -> SP | - | - | - | - | |
RETI | Возврат из прерывания | * | * | * | * | ||
RLA(.B)* | dst | Арифметическая ротация влево | * | * | * | * | |
RLC(.B)* | dst | Ротация влево через С | * | * | * | * | |
RRA(.B) | dst | Арифметическая ротация вправо | * | * | * | ||
RRC(.B) | dst | Ротация вправо через С | * | * | * | * | |
SBC(.B)* | dst | Вычитание not(C) из получателя | dst + 0FFFFh + C -> dst | * | * | * | * |
SETC* | Установка С | 1 -> C | - | - | - | ||
SETN* | Установка N | 1 -> N | - | - | - | ||
SETZ* | Установка Z | 1 -> Z | - | - | - | ||
SUB(.B) | src,dst | Вычитание источника из получателя | dst + .not.src + 1 -> dst | * | * | * | * |
SUBC(.B) | src,dst | Вычитание источника и not(C) из получателя | dst + .not.src + C -> dst | * | * | * | * |
SWPB | dst | Обмен байтов | - | - | - | - | |
SXT | dst | Распространение знака | * | * | * | ||
TST(.B)* | dst | Проверка получателя | dst + 0FFFFh + 1 | * | * | ||
XOR(.B) | src,dst | Исключающее «ИЛИ» источника и получателя | src .xor. dst -> dst | * | * | * | * |
*Эмулированные команды
Порядок выполнения работы
- Запустить программу IAR Kick Start Embedded Workbench IDE
- Создать новый проект
- Сохранить проект в созданной папке
- Настроить в опциях тип микроконтроллера – F2013, FET Debugger, USB
- Откомпилировать проект
- Запустить Debugger
- Выполнить программу и отладку проекта
- Выполнить индивидуальное задание.
- Показать результаты работы преподавателю.
Содержание отчета
1. Титульный лист
2. Задание на лабораторную работу
3. Введение
4. Разработка схемы алгоритма решения задачи.
5. Разработка программы.
6. Результаты вычислительного эксперимента
7. Выводы
8. Список литературы
9. Приложения
Приложение А
(обязательное)
Варианты индивидуальных заданий
1. Найти максимальный элемент в массиве из 16 байт.
2. Найти сумму элементов в массиве из 10 байт.
3. Найти количество нечетных чисел в массиве из 8 байт.
4. Найти сумму отрицательных чисел в массиве из 15 байт.
5. Найти количество отрицательных чисел в массиве из 20 байт.
6. Найти сумму четных чисел в массиве из 10 байт.
7. Найти количество четных чисел в массиве из 15 байт.
8. Найти сумму нечетных чисел в массиве из 8 байт.
9. Найти количество нулей в массиве из 16 байт.
10. Преобразовать массив чисел по следующей формуле: Ci=2Ai+128, i=0..9.
11. Преобразовать массив чисел по следующей формуле: Ci=2Ai+Bi/2, i=0..15.
12. Преобразовать массив чисел по следующей формуле: Ci=Ai/4+16, i=0..19.
13. Переставить элементы массива из 8 байт в обратной последовательности.
14. Найти максимальный и минимальный элементы в массиве из 10 байт и поменять их местами.
15. Найти сумму трех наибольших чисел в массиве из 16 байт.
16. Отрицательные числа в массиве из 16 байт заменить нулями.
17. Минимальное число в массиве из 10 байт заменить нулем.
18. Четные числа в массиве из 20 байт заменить нулями.
Контрольные вопросы
Для успешной защиты лабораторной работы необходимо ответить на следующие контрольные вопросы преподавателя по теме выполненной работы:
- состав и назначение отладочной платы;
- общие сведения о микроконтроллере MSP430;
- центральный процессор;
- система тактирования;
- энергосберегающие режимы;
- память;
- периферийные устройства;
- модуль 16-битного АЦП SD16_A;
- порты ввода-вывода;
- модуль USI;
- сторожевой таймер WDT+;
- таймеры;
- создание проекта, компиляция и отладка программы в среде разработкиIAR Embedded Workbench.
Литература
1. Семейство микроконтроллеров MSP430x2xx. Архитектура, программирование, разработка приложений / пер. с англ. Евстифеева А.В. – М.: Додэка-XXI, 2010. – 544 с. ISBN 978-5-94120-221-9
2. Analog, Embedded Processing, Semiconductor Company, Texas Instruments. URL: http://www.ti.com (дата обращения: 21.03.2013)
3. MSP430x2xx Family User’s Guide (SLAU144F) – руководство пользователя на англ.яз., 2010. URL: http://ti.com (дата обращения: 21.03.2013)
4. MSP430x20x1, MSP430x20x2, MSP430x20x3 MIXED SIGNAL MICROCONTROLLER (SLAS491F) – техническое описание микроконтроллеров на англ. яз., исправл. 2011. URL: http://focus.ti.com/lit/ds/slas491f/slas491f.pdf (дата обращения: 21.03.2013)