Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УП МПУ-13.doc
Скачиваний:
10
Добавлен:
01.04.2025
Размер:
6 Мб
Скачать
☆
    1. Тактирование, процессор и арифметико-логическая группа команд

Тактирование, энергопотребление и сброс

Работа всех цифровых узлов МК начиная с процессора и кончая блоками ввода/вывода, требует тактирования для синхронизации выполняемых действий.

Частота тактирования fclk для каждой конкретной модели имеет предельное верхнее значение fclk_max, значительное превышение которого ведет к перегреву кристалла и увеличивает вероятность сбоев. Работа на частоте равной или близкой к fclk_max обеспечивает максимальную производительность процессора и узлов ввода/вывода.

Значение fclk_max в общем случае зависит от диапазона допустимого напряжения питания МК. Например в диапазоне питания 4.5...5.5 В значение fmax для AT90S8515 составляет 8 МГц, а для ATmega164A – 20 МГц. При снижении нижнего предела напряжения питания до 2.7 В предельная частота должна быть в два раза ниже – 4 и 10 МГц соответственно.

Выбор частоты влияет на энергопотребление МК – с ростом частоты растет ток потребления. Это определяется КМОП технологией МК: статический ток потребления почти отсутствует, присутствует емкостной ток переключения транзисторных ячеек: I = U / Xc = Vcc * 2π fclk * C, где C – эквивалентная емкость МК, зависящая от режима работы и состава работающих периферийных блоков. Это актуально для мобильных приложений с питанием от химических источников (аккумулятор или "батарейка"). Данная формула не учитывает составляющую тока выходов МК, номинальные значения которых может достигать 20 мА на один выход.

В задачах управления некоторые узлы и функции предъявляют повышенные требования к стабильности и точности поддержания заданного значения частоты тактирования fclk. В первую очередь это относится к модулям таймера/счетчика и контроллера асинхронной последовательной связи типа U(S)ART.

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

Как правило, при поставке эти биты обеспечивают выбор тактирования от встроенного RC-генератора. Недостатки такого способа заключаются в невысокой стабильности (влияние напряжения питания и температуры) и точности (разброс параметров R и C). Варианты МК с калиброванными значениями R и C обеспечивают разброс не хуже 1%.

Альтернативой встроенного тактирования являются способы с внешним тактированием, что требует использования одного или двух выводов МК. В МК подсемейства ATtiny с малым числом выводов (8, 20) приходится искать компромисс, так как не используемые для тактирования выводы можно использовать как входы/выходы общего назначения.

Самый распространенный вариант внешнего тактирования - использование кварцевого резонатора, требует двух выводов XTAL1, XTAL2 (см. рис. 2.1).

Варианты с использованием одного входа тактирования XTAL1 сводятся к использованию внешней RC-цепи или внешнего тактового генератора. Стоимость такого генератора сравнима со стоимостью «младших» моделей МК.

Энергопотребление современных МК достаточно мало – мощность P = 5 В * (10...300) мА = 50...1500 мВт при максимальной частоте тактирования. Для работы в мобильных приложениях, а также при реализации функции часов реального времени актуальны режимы пониженного энергопотребления. Они основаны на программном отключении ряда или большинства блоков МК (режим "сна") и последующей активации по внутреннему или внешнему сигналу (прерывания). Это позволяет снизить потребляемый ток на 1...3 порядка и иметь весьма малое время пробуждения.

Не следует забывать и о снижении частоты тактирования для снижения энергопотребления. Современные модели МК кроме выбора способа тактирования битами конфигурации позволяют программно менять коэффициент деления частоты или переключаться на альтернативные источники тактирования – RC- генератор сторожевого таймера (около 1 МГц) или генератор часов реального времени (обычно 32768 Гц).

Сброс МК - это процедура при старте или рестарте (прекращении выполнении программы), состоящая из трех автоматически выполняемых этапов:

1) этап пуска и установления работы тактового генератора; время определяется состоянием специальных Fuse-битов от единиц микросекунд (для внешнего тактового генератора) до десятков миллисекунд (для тактирования с использованием RC или кварцевого резонатора);

2) этап предустановки регистров процессора и РВВ (РСФ) в заданное начальное состояние (несколько машинных тактов); это обеспечивает строго определенное состояние устройств ввода/вывода;

3) счетчик команд устанавливается на нулевой адрес памяти программ и процессор переходит к выполнению программы.

Напомним, что содержимое энергозависимой памяти данных (ОЗУ и РОН) при сбросе не инициализируется – это забота программиста.

Процедура сброса в AVR МК выполняется автоматически в следующих случаях:

1) штатное включение питания – по нарастанию напряжения питания выше заданного уровня [Power-On Reset];

2) переход уровня напряжения на входе RESET из ВЫСОКОГО в НИЗКИЙ; ВЫСОКИЙ уровень используется для подключения программатора/отладчика, реже – для кнопки сброса;

3) переполнение сторожевого таймера [WatchDog] – используется для борьбы с зависанием, то есть с непредусмотренным зацикливанием программы, механизм может быть запрещен специальным Fuse-битом или программой;

4) снижение напряжения питания ниже заданного уровня [Brown-Out Detector], данный механизм выбирается Fuse-битом ;

5) сброс по интерфейсу JTAG, данный механизм выбирается соответствующим Fuse-битом.

Процессор с точки зрения программиста представлен рядом явно адресуемых регистров (файл 8-битных регистров общего назначения R0…R31, регистр состояния Status REGister и регистр указатель стека Stack Pointer) и неявно используемого регистра счетчик команд [Program Counter]. Старшие шесть РОН R26…R31 используются как три 16 битных указателя: X = R26:R27, Y = R28:R29, Z = R30:R31, здесь «:» - знак конкатенации, обозначающий для указателя X, что в R26 хранится старшая, а в R27 – младшая часть адреса. Все три указателя используются при адресации памяти данных SRAM, для адресации к памяти программ FlashROM используется только указатель Z.

Регистр состояния SREG содержит битовые флаги, отражающие результаты арифметико-логических операций и влияющие на ход выполнения программ: SREG.0 = C [Carry] – перенос в С из старшего 7-го разряда при сложении или заем из С при вычитании; SREG.1 = Z [Zero] – нулевой результат; SREG.2 = N [Negative] – отрицательный результат; SREG. 3 = V [oVerflow] – переполнение дополнительного кода (для чисел со знаком) и т. д.

Указатель стека SP [Stack pointer] используется в механизме вызова подпрограмм для хранения адреса возврата и, при необходимости, данных. Детально этот механизм будет рассмотрен в следующих разделах.

Содержимое регистра счетчика команд PC служит для адресации очередной команды в ПП. Оно автоматически увеличивается на единицу или двойку при выполнении команд арифметико-логической группы и группы передачи данных (число 1 или 2 определяется по длине самой команды). Если же встречается команда перехода (ветвления), содержимое счетчика команд изменяется в соответствии с указанием самой команды.

На рис. 1.2 приведена структура ядра МК, включающая память программ FlashROM, память данных SRAM, процессор AVR CPU и внутреннюю магистраль адресного пространства памяти данных с 8-разрядной шиной данных ШД8.

Рис. 1.2. Ядро и процессор

В состав процессора кроме перечисленных выше программно доступных элементов входят:

- арифметико-логическое устройство АЛУ - выполняет команды обработки данных, то есть собственно вычисления, поэтому определяет вычислительную производительность;

- регистр команд [Instruction Register] используется для размещения кода исполняемой команды; декодер команды [Instruction Decoder] анализирует формат команды, выделяет из нее код операции (КОП) и группы бит адресации данных или адресации в памяти программ. Адресация данных требует 4 или 5 бит для выбора РОН, 6 бит для области РВВ, от 9 до 16 бит в области SRAM;

- устройство управления (УУ) под управлением тактовых импульсов fclk реализует последовательное выполнение команд, в современных МП - конвейерное выполнение нескольких команд.

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

1. Выборка команды по адресу указателя команды и прибавление 1 или 2 к значению указателя PC + 1/2 PC.

2. Декодирование кода команды.

3. Выполнение команды, включающее возможную выборку данных и/или запись результата в указанную ячейку, а для команд перехода – модификация указателя команды PC.

В МП с конвейерными принципом выполнения команд под временем цикла понимают темп выполнения команд. Например, при 4-х этапном конвейере время выполнения короткой команды составляет 4 цикла, но темп выполнения программы составляет одну команду за цикл. Исключение составляют команды перехода, нарушающие последовательное наращивание адреса команды. Темп их выполнения "сбивает" работу конвейера и увеличивает темп выполнения до 4 циклов соответственно.

Арифметико-логическая группа команд

Системы счисления и форматы данных

В 8-разрядных МК основным форматом данных является байт [byte], состоящий из 8 бит [bit] данных. Часть регистров представляют объединение двух байт в одно слово [word], еще реже встречаются адресные указатели из трех байт.

Как известно, один бит (двоичный разряд) может принимать только два значения: 0 (или "НИЗКИЙ", то есть сигнал с напряжением близким к нулю питания GND) и 1 (или "ВЫСОКИЙ", то есть сигнал с напряжением близким к напряжению питания +VCC).

При использовании данных в формате байта диапазон представляемых целых чисел зависит от интерпретации двоичного эквивалента. Если подразумеваются целые числа без знака, то диапазон представлен от 0 до 255 = 28 - 1. Для чисел со знаком диапазон от -128 = -27 до +127 = 27 - 1, старший (7-ой разряд) выступает как знаковый (0 - положительное число, 1 - отрицательное), отрицательные числа представлены в двоично-дополнительном коде. Такой способ представления удобен тем, что для выполнения операций сложения и вычитания как над числами со знаком, так и для чисел без знака подходят одинаковые машинные команды.

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

Трансляторы языка С/С++ используют для работы с байтом тип данных char, со словом - тип int, с двойным словом (4 байта) - тип long. Для обозначения беззнаковых чисел добавляется прилагательное unsigned, для знаковых - signed.

Для представления констант в исходных текстах программ используются как десятичные числа (по умолчанию), так и их двоичные (префикс 0b) или шестнадцатеричные (префиксы 0x или $, или суффикс h) эквиваленты. Например, 12 = 0х0С = 0b00001100. Использование двоичного и шестнадцатеричного форматов удобно при работе с отдельными двоичными разрядами и при работе с адресами.

В Приложении 1 подробно рассмотрены системы счисления и форматы представления чисел.

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

Большинство команд этой группы выполняются за 1 машинный цикл, имеют формат 1 слово (2 байта) и изменяют биты регистра состояния SREG.

Код команды (16 двоичных разрядов – слово [word]) состоит из кода операции и поля адресации одного или двух операндов. Для адресации одного РОН (R0…R31) достаточно 5 двоичных разрядов (25 = 32). В некоторых командах для экономии поля адресации используется только 4 разряда, что позволяет адресовать только 16 старших РОН R16 … R31. Под константу в коде команды отводится 6 (26 = 64) или 8 разрядов (28 = 256).

Арифметико-логические команды выполняют различные операции над знаковыми и беззнаковыми числами форматом 1 байт (8 бит). Исключение составляют команды, в мнемонику которых входит буква W – они оперируют с двухбайтными операндами, размещаемыми в смежных регистрах, например, r25:24. Все операции производятся только над регистрами общего назначения (т. е. используется так называемая регистровая адресация) и/или константой (абсолютная адресация).

Подгруппа арифметических команд.

Подгруппа команд арифметических операций выполняет такие базовые действия, как сложение (ADD, ADC, ADIW), вычитание (SUB, SUBI, SBC, SBCI, SBIW), инкремент (прибавление единицы – INC), и декремент (вычитание единицы – DEC). Важно отметить, что все эти команды с равным успехом применимы как к беззнаковым целым в формате 1 байт с диапазоном от 0 до 255 = 0xFF, так и к знаковым в двоично-дополнительном коде (от –128 = 0x80 до +127 = 0x7F).

Команды сложения и вычитания могут работать как с числами без знака (0...255), так и с числами со знаком в двоично-дополнительном формате (-128...+127) - это одни и теже команды, разница заключается лишь в интерпретации результата, для чего дополнительно используются биты-признаки регистра состояния SREG.

Например, при выполнении операции сложения беззнаковых чисел 250 = 0xfa = 0b1111'1010 и 8 = 0x08 = 0b0000'1000 результат будет 250 + 8 = 257 = 0x0102 = 0b1'0000'0010. Он не помещается в один байт, поэтому в регистре-приемнике будет число 0х02, единица из 8-го бита результата разместится в бите С [Carry] регистра SREG, выполняя роль признака переноса. H-флаг уст-ся.

При выполнении сложения чисел со знаком тому же двоичному числу 0xfa = 0b1111'1010 соответствует отрицательное десятичное -6, результат сложения -6 + 8 = 2, С = 1 означает заем.

2 – 8 = -6: r16=2, r17=8, sub r16,r17, r16=0xfa , 1: H,S,N,C

Сложение и вычитание многобайтных чисел выполняются побайтно начиная с младших байтов.

Команда деления отсутствует во всех МК серии AVR, умножения – в подгруппах Tiny и Classic.

Микроконтроллеры подсемейства MEGA выполняют операции умножения (MUL, MULS, MULSU, FMUL, FMULS, FMULSU) целых и дробных чисел форматом один байт с учетом и без учета знака. Умножение знаковых и беззнаковых чисел требует разных команд, отдельную группу составляют команды умножения дробных чисел.

В отсутствии команд умножения, для умножения многобайтных чисел и для выполнения операций деления используются алгоритмы с командами арифметических сдвигов. Команды сдвига вправо (ASR) или влево (LSL) эквивалентны делению на 2 и умножению на 2 соответственно.

Подгруппа логических команд.

AND, ANDI, OR, ORI, EOR, COM, NEG, SBR, CBR,

Первую подгруппу образуют однооперандные команды, изменяющие содержание указанного РОН:

- COM инвертирует каждый бит, эквивалент операции С “~”, например, из числа 0x01 = 0b00000001 получим 0xfe = 0b11111110;

- NEG меняет знак числа в двично-дополнительном коде, например, из числа 0x01 = 1получим 0xff = - 1.

- CBR обнуляет все биты, например, из числа 0x01 получим 0x00;

- SBR устанавливает в «1» все биты, например из числа 0x01 получим 0xff.

Вторая подгруппа образована двухоперандными командами поразрядной обработки, в командах с суффиксом xxxI второй операнд представлен 8-битной константой в теле команды, в остальных оба операнда находятся в РОН:

- AND и ANDI выполняют операцию «поразрядное логическое И»: результат «1» только если оба бита «1», эквивалент операции С “&”; например, R0 = 0b01101001, R1 = 0b00001111, после команды AND R0, R1 результат R0 = 0b00001001;

- OR и ORI выполняют операцию «поразрядное логическое ИЛИ»: результат «1», если хотя бы один бит «1», эквивалент операции С “|”; например, R0 = 0b01101001, R1 = 0b00001111, после команды OR R0, R1 результат R0 = 0b01101111;

- EOR выполняет операцию «поразрядное логическое исключающее ИЛИ» (иначе «сумма по модулю 2»): результат «1» если оба бита не совпадают, эквивалент операции С “¬”; например, R0 = 0b01101001, R1 = 0b00001111, после команды EOR R0, R1 результат R0 = 0b01100110.

Подгруппа команд сдвига.

ASR, LSL, LSR, ROL, ROR, SWAP

При сдвигах содержимое двоичных разрядов адресуемого РОН сдвигается на один разряд:

- вправо [right], Rd[n+1]  Rd[n], n = 0…6, команды ASR, LSR, ROR,

- или влево [left], Rd[n]  Rd[n+1], n = 6…0, команды LSL, ROL.

По порядку сдвигов 7-го и 0-го битов различают:

- циклический сдвиг [ROx], когда содержимое РОН сдвигается «по кругу» через 9-ый бит C [SREG.Carry], ROL: CRd[0], Rd[7]  C, ROR: CRd[7], Rd[0]  C,

- логический сдвиг [LSx], когда выдвигаемый бит помещается в SREG.C, а вдвигаемый равен нулю, эквивалент операции С “<<”или “>>”;

- арифметический сдвиг вправо ASR, который отличается от LSR тем, что копируется содержимое старшего знакового разряда, что удобно при выполнении деления на 2 чисел со знаком.

Особняком стоит команда SWAP, при выполнении которой меняются местами тетрады (старшие и младшие 4 бита).