Hi,
ich bin auf ein sehr seltsames Problem gestoßen:
In einem Minimal-Test Programm ist der Rückgabewert von sqrtf() immer 1.
Identisch mit sqrt(). Egal was ich der Funktion an Wert übergebe
(Variable oder Festwert).
Folgendes Setup:
GCC 12.3.1, cmake 3.20.3.2, STM32F401CCU6
Projekt erstellt mit VisualGDB und STM32CubeMX
Da der Code der main.c sehr lang ist, nur das was ich hinzugefügt habe
zu der generierten Datei:
1 | /* Private includes ----------------------------------------------------------*/
|
2 | /* USER CODE BEGIN Includes */
|
3 | #include <math.h>
|
4 | /* USER CODE END Includes */
|
1 | int main(void)
|
2 | {
|
3 | // [Gekürzt]
|
4 |
|
5 | /* Initialize all configured peripherals */
|
6 | MX_GPIO_Init();
|
7 | /* USER CODE BEGIN 2 */
|
8 |
|
9 | float x = 125;
|
10 | float y = 125;
|
11 | float xx = powf(x, 2); // Ist korrekt: 15625
|
12 | float yy = powf(y, 2); // Ist korrekt: 15625
|
13 | float xxyy = xx + yy; // Ist korrekt: 31250
|
14 | float r0 = sqrtf(xxyy); // Ist falsch: 1
|
15 |
|
16 | float r1 = r0 - 36;
|
17 |
|
18 | /* USER CODE END 2 */
|
19 |
|
20 | /* Infinite loop */
|
21 | /* USER CODE BEGIN WHILE */
|
22 | while (1)
|
23 | {
|
24 | /* USER CODE END WHILE */
|
25 |
|
26 | /* USER CODE BEGIN 3 */
|
27 | }
|
28 | /* USER CODE END 3 */
|
29 | }
|
Ich habe schon versucht die Math-Library manuell dem Linker mit zu geben
über die cmake. Und auch explizit die FPU deaktiviert. Beides brachte
keinen Erfolg.
1 | cmake_minimum_required(VERSION 3.15)
|
2 |
|
3 | project(MathTest LANGUAGES C CXX ASM)
|
4 |
|
5 | find_bsp(ID com.sysprogs.project_importers.stm32.cubemx SOURCE_PROJECT MathTest.ioc)
|
6 |
|
7 | add_bsp_based_executable(NAME MathTest
|
8 | GENERATE_BIN
|
9 | GENERATE_MAP)
|
10 |
|
11 | target_link_libraries(MathTest PRIVATE m)
|
12 | target_compile_options(MathTest PRIVATE -mfloat-abi=soft)
|
Ich komm hier nicht mehr weiter und hoffe auf eure Hilfe.