Автор работы: Пользователь скрыл имя, 09 Сентября 2014 в 09:42, лекция
В микроконтроллерах семейства STM32L1xx можно организовать отсчет времени по тактам системных часов. По умолчанию в момент запуска системные часы ядра CORTEX – 3M устанавливаются на тактовую частоту f=2000000 гц, обеспечивая длительность одного такта τ=1/f=1/2000000 с =0.0000005 с =0.5 млс. Измерители времени или таймеры способны автономно подсчитывать системные такты до заданной величины.
LIGHT_ON( LIGHT_PORT, BLUE_LIGHT ); // включить синий свет
TIM10_Start;
a = 0.0F; // 8 тактов на константу в 1 байт
// b = 0.0; // 9 тактов на константу в 1 байт
TIM10_Stop;
t = TIM10->CNT - 10; // количество тактов без учета счетчика
DisplayUint32Convertion( DisplayArray, t ); // строка для t
LCD_GLASS_DisplayStrDeci( DisplayArray ); // показать число
while(1); // цикл продолжения в реальном времени
}
Ассемблерный код для копирования четырехбайтного нуля типа float в Си-инструкции a = 0.0F представлен ниже. Суффикс F в константе 0.0F предписывает располагать вещественный 0 в четырех байтах в нормализованном виде мантиссы и порядка.
29: a = 0.0F; // 8 тактов на константу в 4 байта
0x080006E2 2000 MOVS r0,#0x00
0x080006E4 490F LDR r1,[pc,#60] ; @0x08000724
0x080006E6 6008 STR r0,[r1,#0x00]
Из команды MOVS r0,#0x00 видно, что компилятор предпочел не делать различия между целым и вещественным представлением нуля. Поэтому четыре нулевых байта регистра r0 сохраняются в переменной b1 по команде STR r0,[r1,#0x00].
Дисплей показывает 1+1+3+3=8 тактов. Дополнительно потрачено 3 такта на внутреннюю синхронизацию.
Восьмибайтные вещественные константы и переменные используются для повышения точности вычислений за счет увеличенного числа бит в мантиссе и порядке. Но общие регистры – 32 битные. Как они реализуют восьмибайтные преобразования? Копирование восьмибайтного нуля выполняется в Си-инструкции b = 0.0. Соответствующий ассемблерный код представлен ниже.
30: b = 0.0; // 9 тактов на константу в 8 байт
0x080006E2 2100 MOVS r1,#0x00
0x080006E4 4A10 LDR r2,[pc,#64] ; @0x08000728
0x080006E6 6011 STR r1,[r2,#0x00]
0x080006E8 6051 STR r1,[r2,#0x04]
Команда MOVS r1,#0x00 загружает однобайтный 0 в общий регистр r1 – это 1 такт. Следующая команда LDR r2,[pc,#64] загружает в регистр r2 адрес 0x08000728 восьмибайтной переменной b – это 1 такт. Поскольку восьмибайтный 0.0 состоит только из двоичных рулей, то дважды нули по 32 байта копируются в последовательные байты переменной b с шагом в четыре байта: команда STR r1,[r2,#0x00] и команда STR r1,[r2,#0x04] – это 3+3=6 тактов.
Дисплей показывает 1+1+3+3+1=9 тактов. Дополнительно потрачен 1 такт на внутреннюю синхронизацию.
А.Ф. Деон. Учебный курс STM32L-Discavery. 2. Таймеры.