Циклические программы обработки элементов массива на языке Си

Задание

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

  До   После
R10
0A023h
R10
0A023h
R11
0FA15h
R11
0A023h
PC
PCold
PC
PCold+2
Примечание: данные в регистрах Данные в регистре могут быть доступны с помощью байтовых команд или команд-слов. Если используются байтовые команды, старший байт всегда будет содержать в результате <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):

Циклические программы обработки элементов массива на языке Си - №1 - открытая онлайн библиотека

Символьный режим

Код ассемблера Содержимое ПЗУ
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

Циклические программы обработки элементов массива на языке Си - №2 - открытая онлайн библиотека

Абсолютный режим

Код ассемблера Содержимое ПЗУ
MOV &EDE,&TONI MOV X(0),Y(0) X=EDE Y=TONI
Длина: Два или три слова
Операция: Пересылка содержимого с исходного адреса EDE по адресу назначения TONI. Слова после команды содержат абсолютные адреса источника и получателя. В абсолютном режиме программный счетчик автоматически инкрементируется так, что выполнение программы продолжается со следующей команды.
Комментарий: Действительно для источника и получателя
Пример: MOV &EDE,&TONI ;Адрес источника EDE=0F016h ;Адрес получателя TONI=01114h

Циклические программы обработки элементов массива на языке Си - №3 - открытая онлайн библиотека

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

Косвенный регистровый режим

Код ассемблера Содержимое ПЗУ
MOV @R10,0(R11) MOV @R10,0(R11)
Длина: Одно или два слова
Операция: Пересылка содержимого с исходного адреса (содержится в R10) по адресу назначения (содержится в R11). Регистры не изменяются.
Комментарий: Действительно только для операнда источника. В качестве операнда получателя подставляется 0(Rd)
Пример: MOV.B @R10,0(R11)

Циклические программы обработки элементов массива на языке Си - №4 - открытая онлайн библиотека

Косвенный автоинкрементный режим

Код ассемблера Содержимое ПЗУ
MOV @R10+,0(R11) MOV @R10+,0(R11)
Длина: Одно или два слова
Операция: Пересылка содержимого с исходного адреса (содержится в R10) по адресу назначения (содержится в R11). Регистр R10 инкрементируется после выборки на 1 для байтовых операций или на 2 для команд-слов, таким образом указывается следующий адрес без дополнительных действий. Это полезно для обработки таблиц.
Комментарий: Действительно только для операнда источника. В качестве операнда получателя подставляется 0(Rd) плюс вторая команда INCD Rd.
Пример: MOV.B @R10+,0(R11)

Циклические программы обработки элементов массива на языке Си - №5 - открытая онлайн библиотека

Автоинкремент содержимого регистра происходит после выборки операнда.

Циклические программы обработки элементов массива на языке Си - №6 - открытая онлайн библиотека

Прямой режим

Код ассемблера Содержимое ПЗУ
MOV #45h,TONI MOV @PC+,X(PC) 45 X=TONI-PC
Длина: Два или три слова. На одно слово меньше, если может использоваться константа генераторов CG1 или CG2.
Операция: Пересылка непосредственной константы 45h, находящейся в слове, следующем за командой, по адресу назначения TONI. Когда происходит выборка источника, программный счетчик указывает на слово, следующее за командой, и выполняется пересылка содержимого по назначению.
Комментарий: Действительно только для операнда источника
Пример: MOV #45h,TONI

Циклические программы обработки элементов массива на языке Си - №7 - открытая онлайн библиотека

Полный набор команд семейства 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)

На рис. показана структура формата команды с двойным операндом.

Циклические программы обработки элементов массива на языке Си - №8 - открытая онлайн библиотека

В таблице 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)

На рис. показана структура формата команды с одним операндом.

Циклические программы обработки элементов массива на языке Си - №9 - открытая онлайн библиотека

В таблице 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 слово должно содержать информацию об адресе.

Команды перехода

На рис. показан формат команды условного перехода.

Циклические программы обработки элементов массива на языке Си - №10 - открытая онлайн библиотека

В таблице 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 * * * *

*Эмулированные команды

Порядок выполнения работы

  1. Запустить программу IAR Kick Start Embedded Workbench IDE
  2. Создать новый проект
  3. Сохранить проект в созданной папке
  4. Настроить в опциях тип микроконтроллера – F2013, FET Debugger, USB
  5. Откомпилировать проект
  6. Запустить Debugger
  7. Выполнить программу и отладку проекта
  8. Выполнить индивидуальное задание.
  9. Показать результаты работы преподавателю.

Содержание отчета

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)