Перейти к содержанию
    

Ошибки при определении макроса

Первый раз встречаюсь с такой проблемой

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)

   .............................................
}

получаю ошибки.

Изменено пользователем jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, jenya7 сказал:

если заменить все float на целые скажем

Прочитайте в учебнике по си что такое float, что такое double. В ваших выражениях только double. Где вы там увидели float - непонятно.

А ошибки говорят о том, что не хватает каких-то библиотечных функций работы с double.

 

PS: Более того - непонятно на кой там вообще double-вычисления в runtime? Чтобы сделать как можно более громоздкий и тормозной код?  :unknw:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

17 minutes ago, jcxz said:

Прочитайте в учебнике по си что такое float, что такое double. В ваших выражениях только double. Где вы там увидели float - непонятно.

А ошибки говорят о том, что не хватает каких-то библиотечных функций работы с double.

 

PS: Более того - непонятно на кой там вообще double-вычисления в runtime? Чтобы сделать как можно более громоздкий и тормозной код?  :unknw:

где вы увиделиу меня хоть один 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.

Изменено пользователем jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 minutes ago, jcxz said:

Вот:

Ещё раз советую прочитать учебник по си! Его раздел про типы float и double.

 

Если бы вы открыли учебник, то знали бы, что литералы float записываются как: 32.0f и 0.5f

та же проблема. почему компилируется с константой?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

57 минут назад, jenya7 сказал:

где вы увиделиу меня хоть один double? в камне нет FPU и я пытался привести к float ( и кстати float  ему тоже не нравится Error[Li005]: no definition for "__aeabi_ui2f")

Вы мой 1-й пост читали?

1 час назад, jcxz сказал:

А ошибки говорят о том, что не хватает каких-то библиотечных функций работы с double.

Похоже что нет.  :wink:

__aeabi_ui2d и другие функции (с буквой 'd') из вашего первого поста - это функции стандартной библиотеки для работы c double.

__aeabi_ui2f - очевидно то же самое для float. Так как вы как всегда не указали тип МК, а я его угадать не могу, то видимо это МК без аппаратного блока FPU. Иначе - эта функция (конвертирования integer->float) не использовалась бы компилятором, потому как в МК с FPU есть соответствующая команда. Почему в вашем проекте нет всех этих функций из стандартной библиотеки - разбирайтесь, что у вас не так с проектом. Ясновидящих тут нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вот сейчас вставил в 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);

и не ругается

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 hours ago, jenya7 said:

вот сейчас

Самое время почитать книжку по С и посмотреть текст после препроцессора.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 часов назад, jenya7 сказал:

и не ругается

потому что выражение вычисляется на этапе компиляции. Отключите оптимизацию - начнет ругаться.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...