[i] Использование FPU в К1986ВЕ8Т в IDE Keil
Ядро микроконтроллера К1986ВЕ8Т содержит блок вычисления с плавающей точкой (FPU) одинарной точности (переменные типа float). Работа с переменными типа double в микроконтроллере аппаратно не поддерживается и реализуется компилятором программно.
Для включения поддержки FPU в проекте нужно включить использование инструкций FPU в компиляторе и в коде включить блок FPU.
В качестве примера работы с FPU можно использовать приведенный ниже фрагмент кода с функцией main().
#include "mdr32f8_config.h"
int main(void)
{
static float a = 1.2f;
static float b = 1.2f;
// Variables with results.
volatile float rMul, rAdd, rSub, rDiv;
while (1) {
// Clear results.
rMul = rAdd = rSub = rDiv = 0;
// Calculate results.
rMul = a * b;
rAdd = a + b;
rSub = a - b;
rDiv = a / b;
}
}
Фрагмент кода 1.
В конце статьи приведен проект, в котором реализованы описанные в статье действия
1. Использование инструкций FPU в компиляторе
В актуальной версии Software Pack для IDE Keil в настройках проекта использование инструкций FPU в компиляторе для микросхем К1986ВЕ8Т включено по умолчанию (рисунок 1).
Рисунок 1 - Настройки проекта, настройка Floating Point Hardware
Однако средствами SPL включение блока FPU не осуществляется, поэтому запуск кода с инструкциями FPU приведет к исключению при исполнении программы.
Возможно отключить генерацию инструкций FPU, изменив настройку Floating Point Hardware с Single Precision на Not Used. В таком случае вся работа с переменными типа float будет реализована программно. На рисунке 1 приведен результат запуска тестовой функции main() без использование инструкций FPU в проекте.
Рисунок 2 - Запуск примера, собранного с опцией Floating Point Hardware: Not UsedВ окне дизассемблера на рисунке 2 видно, что вся работа с переменными типа float реализована программно в целочисленном режиме. Подобная реализация медленная и требует дополнительное место для функций проргаммной работы с float.
После установки настройки Floating Point Hardware: Single Precision для корректной работы с FPU необходимо разрешить работу блок FPU в ядре микросхемы.
2. Включение FPU в ядре микросхемы
По умолчанию блок FPU выключен, для его активации в микроконтроллере следует выставить необходимые биты CP10 и CP10 в регистре SCB -> CPACR.
В текущей версии SPL данное включение не реализовано, поэтому можно добавить самостоятельно в обработчик сброса в файле startup_1986ve8t.s:
; Reset Handler
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT __main
; --- FPU Enable ---
; CPACR is located at address 0xE000ED88
LDR.W R0, =0xE000ED88
; Read CPACR
LDR R1, [R0]
; Set bits 20-23 to enable CP10 and CP11 coprocessors
ORR R1, R1, #(0xF << 20)
; Write back the modified value to the CPACR
STR R1, [R0]; wait for store to complete
DSB
; Reset pipeline now the FPU is enabled
ISB
LDR R0,=__main
BX R0
ENDP
Фрагмент кода 2
3. Запуск проекта
После включения использования инструкций FPU компилятором и включения FPU в ядре микросхемы после запуска тестового проекта в окне дизассемблера под отладкой можно увидеть код, содержащий инструкции FPU (рисунок 3). При исполнении программы используются регистры блока FPU ядра микросхемы, результаты вычисления отображаются в окне Call Stack + Locals.
Рисунок 3 - Запуск примера, собранного с опцией Floating Point Hardware: Single Precision, и с включенным FPU в ядре микросхемы. Сохранить статью в PDF
Файлы для скачивания
Документация
Программное обеспечение