Nie działa funkcja sprintf.

Nie działa funkcja sprintf.

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

GR
  • Rejestracja:prawie 14 lat
  • Ostatnio:prawie 5 lat
  • Postów:29
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:

Kopiuj
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.

edytowany 1x, ostatnio: flowCRANE
GO
  • Rejestracja:prawie 6 lat
  • Ostatnio:około 5 lat
  • Postów:97
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...


sugar_hiccup
  • Rejestracja:prawie 11 lat
  • Ostatnio:około 2 lata
  • Postów:176
2

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


My to na arm napiszemy wszystko i zrobimy co chcemy tyle że 90% kodu to biblioteki z netu albo robota kompilatora Zdajesz sobie sprawę że tak na prawdę wyższy poziom języka może świadczyć jedynie o tym jak niskim poziomem wiedzy może dysponować bałwan,który nazwie się w rezultacie programistą i napisze działający program wciskając zleceniodawcy że tam to akurat musi być 100MHz ARM z 1M pamięci bo tak na prawdę jego pusta łepetyna nie potrafi zrealizować czegoś na innym słabszym mikrokontrolerze
GR
  • Rejestracja:prawie 14 lat
  • Ostatnio:prawie 5 lat
  • Postów:29
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.

VT
  • Rejestracja:ponad 5 lat
  • Ostatnio:prawie 2 lata
1

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

Kopiuj
-u _printf_float
edytowany 2x, ostatnio: flowCRANE
GR
  • Rejestracja:prawie 14 lat
  • Ostatnio:prawie 5 lat
  • Postów:29
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.

edytowany 1x, ostatnio: flowCRANE
GO
  • Rejestracja:prawie 6 lat
  • Ostatnio:około 5 lat
  • Postów:97
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.


edytowany 5x, ostatnio: goose_
VT
  • Rejestracja:ponad 5 lat
  • Ostatnio:prawie 2 lata
0

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

R1
  • Rejestracja:około 6 lat
  • Ostatnio:około 2 lata
  • Postów:18
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 !

edytowany 2x, ostatnio: robo1973

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.