математика exp (). c i c не работает, если в цикле - PullRequest
2 голосов
/ 28 апреля 2020

В настоящее время я работаю над регулятором pid для школьного проекта. Так как корона закрыла школу, мы не можем получить какое-либо оборудование для тестирования. Поэтому я хочу смоделировать ПИД-регулятор на микропроцессоре (PSoC5LP). Поэтому я реализую функцию, которая возвращает пошаговую характеристику выбранного двигателя d c.

Когда я нахожу выход функции передачи "(-3.47 * exp (-6.36 * s) + 3.47)) «Я получаю правильный результат, если я определю значение« s »вручную в коде. Но когда я устанавливаю s для увеличения в коде "undefined reference to" exp ".

Проблема, похоже, заключается в том, что я не могу запустить exp в al oop при его увеличении. Пробовал в другом проект, в котором происходит только то, что al oop проходит 10 раз и печатает exp () с nr раз, когда l oop запустил (не работает)

float step_respons(){
    double s = 0.1;
        snprintf(outpurBuffer, sizeof(outpurBuffer), "%f \r\n", (-3.47*exp(-6.36*s)+3.47));
        pc_uart_PutString(outpurBuffer);
        snprintf(outpurBuffer, sizeof(outpurBuffer), "%f \r\n", (-3.47*exp(-6.36*1)+3.47));
        pc_uart_PutString(outpurBuffer);
    //These works just fine

    pc_uart_PutString("Loop:\r\n");

    for(s = 0.1; s < 2; s++){
        snprintf(outpurBuffer, sizeof(outpurBuffer), "%f %f \r\n", s,(-3.47*exp(-6.36*s)+3.47));
        pc_uart_PutString(outpurBuffer);
        //this does not work (if "s" is changed with a number it works fine.)

    };

    return 0;
};

Так что это работает, если я выбираю S вручную в l oop, но если его увеличивают, он останавливается. Я пытался использовать другую переменную и увеличивать его, но он все еще не работает

    for(s = 0.1; s < 2; s++){
        snprintf(outpurBuffer, sizeof(outpurBuffer), "%f %f \r\n", s,(-3.47*exp(-6.36*s)+3.47));
        pc_uart_PutString(outpurBuffer);

    };

не работает

    for(s = 0.1; s < 2; s++){
        snprintf(outpurBuffer, sizeof(outpurBuffer), "%f %f \r\n", s,(-3.47*exp(-6.36*1)+3.47));
        pc_uart_PutString(outpurBuffer);

    };

работает, но увеличение результата не выполняется. Как вы можете видеть, единственные изменения, сделанные в l oop, это то, что "s" было определено значение

double temp = 0.5;

    for(s = 0.1; s < 2; s++){
        snprintf(outpurBuffer, sizeof(outpurBuffer), "%f %f \r\n", s,(-3.47*exp(-6.36*temp)+3.47));
        pc_uart_PutString(outpurBuffer);    

    };

это работает

double temp = 0.5;

for(s = 0.1; s < 2; s++){
        snprintf(outpurBuffer, sizeof(outpurBuffer), "%f %f \r\n", s,(-3.47*exp(-6.36*temp)+3.47));
        pc_uart_PutString(outpurBuffer);    
        temp += 0.5;
    };

нет Это ошибка: Build error: undefined reference to 'exp'

Журнал с выходных данных компилятора

------ --------- Сборка начата: 28.04.2020 01:34:42 Проект: Plotterkode, Конфигурация: ARM G CC 5.4-2016-q2-update Отладка - ------------- Шаг генерации кода обновлен. Этап компиляции обновлен, никакой работы не требуется. arm-none-eabi-ar.exe -rs. \ CortexM3 \ ARM_GCC_541 \ Debug \ Plotterkode.a. \ CortexM3 \ ARM_GCC_541 \ Debug \ cy_em_eeprom.o. \ CortexM3 \ ARM_GCC_541 \ Debug \ CyDma c .o. \ ARM_GCC_541 \ Debug \ CyFla sh .o. \ CortexM3 \ ARM_GCC_541 \ Debug \ CyLib.o. \ CortexM3 \ ARM_GCC_541 \ Debug \ cyPm.o. \ CortexM3 \ ARM_GCC_541 \ Debug \ CySp * 1036. \ ARM_GCC_541 \ Debug \ cyutils.o. \ CortexM3 \ ARM_GCC_541 \ Debug \ pc_uart.o. \ CortexM3 \ ARM_GCC_541 \ Debug \ pc_uart_PM.o. \ CortexM3 \ ARM_GCC_541 \ Debug \ pc_u_t_MB .o. \ CortexM3 \ ARM_GCC_541 \ Debug \ pc_uart_IntClock.o. \ CortexM3 \ ARM_GCC_541 \ Debug \ isr_pc_uart.o. \ CortexM3 \ ARM_GCC_541 \ Debug \ Pin_adc_input.o. \ CortexMO \ M \ M \ M \ M \ M \ M \ M \ M \ M \ M \ MX \ M \ M \ M \ M \ MC \ M \ M \ M \ MC3 ARM_GCC_541 \ Debug \ MOSI.o. \ CortexM3 \ ARM_GCC_541 \ Debug \ SCLK.o. \ CortexM3 \ ARM_GCC_541 \ Debug \ pot_adc_sar.o. \ CortexM3 \ ARM_GCC_541 \ Debug \ pot_adc. o. \ CortexM3 \ ARM_GCC_541 \ Debug \ ui_spi.o. \ CortexM3 \ ARM_GCC_541 \ Debug \ ui_spi_PM.o. \ CortexM3 \ ARM_GCC_54 1 \ Debug \ ui_spi_INT.o. \ CortexM3 \ ARM_GCC_541 \ Debug \ pot_adc_sar_IRQ.o. \ CortexM3 \ ARM_GCC_541 \ Debug \ pot_adc_sar_theACLK.o. \ CortexM3 \ ARM_GCC_541 \ \ \ \ \ \ \ \ \ \ _ \\\; О. \ Debug \ pin_enable.o. \ CortexM3 \ ARM_GCC_541 \ Debug \ pin_border.o. \ CortexM3 \ ARM_GCC_541 \ Debug \ isr_border.o. \ CortexM3 \ ARM_GCC_541 \ Debug \ pin_led.o. \ CortexM3 \54_go . \ CortexM3 \ ARM_GCC_541 \ Debug \ pin_goal_right.o. \ CortexM3 \ ARM_GCC_541 \ Debug \ pin_goal_left.o. \ CortexM3 \ ARM_GCC_541 \ Debug \ isr_goal_right.o. \ CortexM3 \ AR__ \ \ \ __1 Debug \ AMux.o. \ CortexM3 \ ARM_GCC_541 \ Debug \ CyBootAsmGnu.o arm-none-eabi-ar.exe: создание. \ CortexM3 \ ARM_GCC_541 \ Debug \ Plotterkode.a arm-none-eabi-g cc .exe -Wl, - start-group -o C: \ Users \ Vikto \ Desktop \ plottercode \ Plotterkode.cydsn \ CortexM3 \ ARM_GCC_541 \ Debug \ Plotterkode.elf. \ CortexM3 \ ARM_GCC_541 \ Debug \ main.o. \ CortexM3 \ ARM_GCC_541 \ Debug \ cyfitter_cfg.o. \ CortexM3 \54 \ cy.GD.CortexM3 \54. ARM_GCC_541 \ Debug \ Cm3Start.o. \ CortexM3 \ ARM_GCC_541 \ Debug \ Plotterkode.a "C: \ Program Files (x86) \ Cypress \ PSo C Creator \ 4. 2 \ PSo C Creator \ psoc \ content \ cycomponentlibrary \ CyComponentLibrary.cylib \ CortexM3 \ ARM_GCC_541 \ Debug \ CyComponentLibrary.a "-mcpu = cortex-m3 -mthumb -L Generated_Source \ PSoCM3,. \ ARM_GCC_541 \ Debug / Plotterkode.map -T Generated_Source \ PSoC5 \ cm3g cc .ld -specs = nano.specs -u _printf_float -Wl, - g c -sections -u_printf_float -g -ffunction-section -Og -ffat-lto-objects -Wl, - end-group. \ CortexM3 \ ARM_GCC_541 \ Debug \ main.o: в функции step_respons': C:\Users\Vikto\Desktop\plottercode\Plotterkode.cydsn/./plotter_position.h:125: undefined reference to exp 'collect2.exe: ошибка: ld вернул 1 состояние выхода Команда' arm-none -eabi-g cc .exe 'завершился неудачно с кодом выхода' 1 '. --------------- Ошибка сборки: 28.04.2020 01:34:42 ---- -----------

1 Ответ

2 голосов
/ 28 апреля 2020

Скорее всего, вы не связываете библиотеку, которая включает функцию exp ().

Это работает в том случае, если вы передаете ему литерал (или значение, которое может вычислить компилятор), потому что компилятор вычисление значения и помещение его в код.

https://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html

Я полагаю, что exp () включен в libm, поэтому добавим -Wl,-lm (или тем не менее, если вы укажете libm в вашей системе сборки), это следует исправить.

И если он уже есть, попробуйте поместить его в конец списка.

...