Разбираюсь с STM32F100RB, а именно с STM32VLDISCOVERY. Воспользовался портом RTOS взятым тут: https://bitbucket.org/KilleRMill/stm32f107vc_freertos_gcc
Использую Eclipse. импортировал проект, к уарту прикрутил 1-wire DS18B20, попробовал сделать несколько задач, синхронизацию между ними - все шикарно, все работает как нужно.
Как только коснулся использования float, встал и не могу третий день сдвинуться с места.
К примеру, хотел сохранить полученное значение температуры следующим образом:
Код
float temp;
uint8_t scratchpad[9];
...
temp = *(int16_t*)(scratchpad) / 16.0;
...
uint8_t scratchpad[9];
...
temp = *(int16_t*)(scratchpad) / 16.0;
...
вроде все просто и понятно. Но при заливке и попытке отладки, программа перестает работать.
однако, если сделать так
Код
float temp,tempmul=16.0;
uint8_t scratchpad[9];
...
temp = *(int16_t*)(scratchpad) / tempmul;
...
uint8_t scratchpad[9];
...
temp = *(int16_t*)(scratchpad) / tempmul;
...
то все работает.
Странно, подумал я, и забил на некоторое время.
Дальше больше - выяснилось, что при попытке сравнить две переменные типа float я получаю практически идентичный эффект:
Код
float f1=2.0,f2=3.0;
...
if (f1>f2) vTaskDelay(100); // либо любое другое действие, не важно
...
...
if (f1>f2) vTaskDelay(100); // либо любое другое действие, не важно
...
просто вставив это в код программы, я получаю "кирпич".
На сколько я понял, иногда перестают работать прерывания (при этом в задачах freeRTOS'a жизнь вертится), иногда все встает непонятным образом.
Перепробовал кучу комбинаций -mfpu=XXXX -msoft-float -mfloat-abi=ХХХХ без видимого эффекта.
Для меня вообще не понятная проблема. Прошу помощи.