Wątek zablokowany 2023-01-23 18:08 przez Riddle.

Nie działa funkcja sprintf.

0

Uruchomiłem FreeRTOS na STM32F4 i wszystko prawie działa, gdyż mam problem z sprint. Mam zadanie, które odczytuje napięcie i natężenie z czujnika, odczyt odbywa się poprawnie, tylko zamiana wartości na tekst by wyświetlić na LCD już nie dział. Wyświetlenie napięcia działa, ale już natężenie nie wyświetla się tylko zawiesza się na sprintf(). Jak widać zmienna current jest float w zakresie -1000.00 mA do 1000.00 mA, natężenia ma mi wyświetlić dwa miejsca po przecinku.
Wygląda to tak:

void INA219_Read_Task(void const * argument)
{
	uint16_t voltage = 0;
	float current = 0.0;
	char buffor_voltage[10];
	char buffor_currnet[12];
	INA219_init();

	for(;;)
	{
		voltage = INA219_bus_voltage();  
		sprintf( buffor_voltage, "%d mV", voltage );
		BSP_LCD_DisplayStringAtLine(15, (uint8_t *)buffor_voltage);
		current = INA219_current();
		sprintf( buffor_currnet, "%.2f mA", current ); //tutaj się uC zawiesza
		BSP_LCD_DisplayStringAtLine(16, (uint8_t *)buffor_currnet);
		osDelay(1000);
	}
}

Nie mam pojęcie co mógłbym jeszcze zmienić by to działało.

0

Nie za bardzo się orientuje ale float to chyba specyficzny typ danych, tutaj może być problem. Widzę w google że jest sporo tematów pod hasłem float stm32. Może zmiana na inny typ pomoże... int, double...

2

Sprawdź flagi kompilatora dotyczące floatów (-mfloat-abi=hard, -mfpu=fpv4-sp-d16), być może to pomoże.

0
goose_ napisał(a):

Nie za bardzo się orientuje ale float to chyba specyficzny typ danych, tutaj może być problem. Widzę w google że jest sporo tematów pod hasłem float stm32. Może zmiana na inny typ pomoże... int, double...

Próbowałem też double, ten sam efekt.

sugar_hiccup napisał(a):

Sprawdź flagi kompilatora dotyczące floatów (-mfloat-abi=hard, -mfpu=fpv4-sp-d16), być może to pomoże.

Mam ustawione tak jak napisałeś, każde inne ustawienie nic nie daje.

1

Zobacz czy dodanie takiej opcji do 'ld' lub 'gcc' nie pomoże:

-u _printf_float
0

Mam tę opcję dodaną, bez tego się nie skompiluje, gdy używam sprintf i float.
Coś FreeRTOS się gryzie z funkcją sprintf. Gdy uruchomię ten kawałek kodu bez systemu to wszystko działa jak powinno. W internecie jest trochę o tym, spróbuje tam poszukać rozwiązania.

0

Ja mam tylko Nucleo-F031K6 z CortexM0, a na tym twoim jest rejestr CPACR i FPCCR . Trzeba go aktywować tutaj jest opis . W sumie to sam się muszę doedukować w temacie floatów an ARM. Widzę że są jakieś rzeczy tupu fixed point, _fract _accum etc Może nie masz tego w ogóle zainicjalizowanego, bo piszą że to jest domyslnie wyłączone.

0

Jeśli możesz pokaż całego Makefile'a, którego używasz, ewentualnie cały log z kompilacji.

0

Witam Nie zakładam nowego tematu U mnie też nie działa sprintf >> visual studio code
W atmel studio pamętam dodawałem jakieś wpisy w konfiguracji W VSC nie bardzo wiem jak ?

sprintf(napiecie, "U =%1.3f [V]", adc_nap);

Pozdrawiam !

1 użytkowników online, w tym zalogowanych: 0, gości: 1