[i] Использование FPU в К1986ВЕ8Т в IDE Keil

ID статьи: 61471
Дата последнего изменения: 04.12.2025 16:10:12

Ядро микроконтроллера К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 в ядре микросхемы.


Контактная информация

Сайт:https://support.milandr.ru
E-mail:support@milandr.ru
Телефон: +7 495 221-13-55