jenya7 0 19 января, 2022 Опубликовано 19 января, 2022 (изменено) · Жалоба Первый раз встречаюсь с такой проблемой void UART_Initialization(UART_MemMapPtr UARTx, unsigned int baud) { #define UART_SBR (unsigned char)(BOOT_BUS_CLOCK / (16*baud)) #define UART_BRFA (unsigned char)((((BOOT_BUS_CLOCK/(16*baud))-UART_SBR)*32.0)+0.5) UART_BDH_REG(UARTx) = ((UART_SBR>>8)&0x1f); UART_BDL_REG(UARTx) = (UART_SBR&0xff); #if IS_Kxx_FAMILY UART_C4_REG(UARTx) = (UART_BRFA&0x1f); #endif UART_C2_REG(UARTx) = UART_C2_TE_MASK | UART_C2_RE_MASK; } получаю Quote Error[Li005]: no definition for "__aeabi_ui2d" Error[Li005]: no definition for "__aeabi_dmul" Error[Li005]: no definition for "__aeabi_dadd" Error[Li005]: no definition for "__aeabi_d2iz" если заменить все float на целые скажем #define UART_BRFA (unsigned char)((((BOOT_BUS_CLOCK/(16*baud))-UART_SBR)*32)+5) то тоже всё нормально. у него что проблема с floating point arithmetic для этого камня? а вот ещё что - если определить с константным значением //constant #define UART_SBR (unsigned char)(BOOT_BUS_CLOCK / (16*BOOT_UART_BAUD_RATE)) //constant #define UART_BRFA (unsigned char)((((BOOT_BUS_CLOCK/(16*BOOT_UART_BAUD_RATE))-UART_SBR)*32.0)+0.5) то компилируется нормально. но если поставить переменную #define UART_SBR (unsigned char)(BOOT_BUS_CLOCK / (16*baud)) #define UART_BRFA (unsigned char)((((BOOT_BUS_CLOCK/(16*baud))-UART_SBR)*32.0)+0.5) выскакивают ошибки. пробую так //void UART_Initialization(UART_MemMapPtr UARTx, float baud) //the same //void UART_Initialization(UART_MemMapPtr UARTx, unsigned long baud) //the same void UART_Initialization(UART_MemMapPtr UARTx, uint32_t baud) { #undef BOOT_UART_BAUD_RATE #define BOOT_UART_BAUD_RATE baud #define UART_SBR (unsigned char)(BOOT_BUS_CLOCK / (16*BOOT_UART_BAUD_RATE)) #define UART_BRFA (unsigned char)((((BOOT_BUS_CLOCK/(16*BOOT_UART_BAUD_RATE))-UART_SBR)*32.0)+0.5) ............................................. } получаю ошибки. Изменено 19 января, 2022 пользователем jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 243 19 января, 2022 Опубликовано 19 января, 2022 · Жалоба 1 час назад, jenya7 сказал: если заменить все float на целые скажем Прочитайте в учебнике по си что такое float, что такое double. В ваших выражениях только double. Где вы там увидели float - непонятно. А ошибки говорят о том, что не хватает каких-то библиотечных функций работы с double. PS: Более того - непонятно на кой там вообще double-вычисления в runtime? Чтобы сделать как можно более громоздкий и тормозной код? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 19 января, 2022 Опубликовано 19 января, 2022 (изменено) · Жалоба 17 minutes ago, jcxz said: Прочитайте в учебнике по си что такое float, что такое double. В ваших выражениях только double. Где вы там увидели float - непонятно. А ошибки говорят о том, что не хватает каких-то библиотечных функций работы с double. PS: Более того - непонятно на кой там вообще double-вычисления в runtime? Чтобы сделать как можно более громоздкий и тормозной код? где вы увиделиу меня хоть один double? в камне нет FPU и я пытался привести к float ( и кстати float ему тоже не нравится Error[Li005]: no definition for "__aeabi_ui2f") void UART_Initialization(UART_MemMapPtr UARTx, float baud) и даже так #define UART_BRFA (unsigned char)((((float)(BOOT_BUS_CLOCK/(16*BOOT_UART_BAUD_RATE))-UART_SBR)*(float)32.0)+(float)0.5) но самое главное - так почему компилируется? #define UART_BRFA (unsigned char)((((BOOT_BUS_CLOCK/(16*115200))-UART_SBR)*32.0)+0.5) Причём отдельно этот файл компилируется без ошибок при любых вариантах (Compile). проблема возникает при Make. Изменено 19 января, 2022 пользователем jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 243 19 января, 2022 Опубликовано 19 января, 2022 · Жалоба 45 минут назад, jenya7 сказал: где вы увиделиу меня хоть один double? в камне нет FPU и я пытался привести к float ( и кстати float ему тоже не нравится Error[Li005]: no definition for "__aeabi_ui2f") Вот: 2 часа назад, jenya7 сказал: #define UART_BRFA (unsigned char)((((BOOT_BUS_CLOCK/(16*baud))-UART_SBR)*32.0)+0.5) Ещё раз советую прочитать учебник по си! Его раздел про типы float и double. 45 минут назад, jenya7 сказал: и даже так Если бы вы открыли учебник, то знали бы, что литералы float записываются как: 32.0f и 0.5f Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 19 января, 2022 Опубликовано 19 января, 2022 · Жалоба 4 minutes ago, jcxz said: Вот: Ещё раз советую прочитать учебник по си! Его раздел про типы float и double. Если бы вы открыли учебник, то знали бы, что литералы float записываются как: 32.0f и 0.5f та же проблема. почему компилируется с константой? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 243 19 января, 2022 Опубликовано 19 января, 2022 · Жалоба 57 минут назад, jenya7 сказал: где вы увиделиу меня хоть один double? в камне нет FPU и я пытался привести к float ( и кстати float ему тоже не нравится Error[Li005]: no definition for "__aeabi_ui2f") Вы мой 1-й пост читали? 1 час назад, jcxz сказал: А ошибки говорят о том, что не хватает каких-то библиотечных функций работы с double. Похоже что нет. __aeabi_ui2d и другие функции (с буквой 'd') из вашего первого поста - это функции стандартной библиотеки для работы c double. __aeabi_ui2f - очевидно то же самое для float. Так как вы как всегда не указали тип МК, а я его угадать не могу, то видимо это МК без аппаратного блока FPU. Иначе - эта функция (конвертирования integer->float) не использовалась бы компилятором, потому как в МК с FPU есть соответствующая команда. Почему в вашем проекте нет всех этих функций из стандартной библиотеки - разбирайтесь, что у вас не так с проектом. Ясновидящих тут нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 19 января, 2022 Опубликовано 19 января, 2022 · Жалоба вот сейчас вставил в main() float f1 = (unsigned char)((((BOOT_BUS_CLOCK/(16*BOOT_UART_BAUD_RATE))- (BOOT_BUS_CLOCK / (16*BOOT_UART_BAUD_RATE)) )*32.0)+0.5); double d1 = (unsigned char)((((BOOT_BUS_CLOCK/(16*BOOT_UART_BAUD_RATE))- (BOOT_BUS_CLOCK / (16*BOOT_UART_BAUD_RATE)) )*32.0)+0.5); и не ругается Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 60 19 января, 2022 Опубликовано 19 января, 2022 · Жалоба 3 hours ago, jenya7 said: вот сейчас Самое время почитать книжку по С и посмотреть текст после препроцессора. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 19 января, 2022 Опубликовано 19 января, 2022 · Жалоба 7 часов назад, jenya7 сказал: и не ругается потому что выражение вычисляется на этапе компиляции. Отключите оптимизацию - начнет ругаться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться