time.h na STM32 i strefy czasowe

Kontynuuję przenoszenie na FreeRTOS projektu mojego radia internetowego na STM32F107. Na chwilę obecną urządzenie zaczęło działać jak powinno, a co najważniejsze - działa stabilnie. Przy okazji uruchomiłem jeszcze klienta SNTP do synchronizacji RTC wbudowanego w mikrokontroler.

Generalnie jeśli któryś z moich projektów posiada połączenie z siecią (albo inną formę łączności ze światem zewnętrznym) staram się, żeby pobierał z niej aktualny czas, a w przypadku posiadania wyświetlacza posiadał także funkcję zegara.

Tutaj zawsze pojawia się kwestia obsługi stref czasowych i czasu letniego/zimowego. Pamiętam, że w czasach AVR-ów musiałem to wszystko robić ręcznie. Odpowiednia funkcja sprawdzała czy w danym momencie powinienem dodać godzinę czy dwie, a potem odpowiednią wartość w sekundach dodawałem do timestampu (time_t) aby finalnie przekonwertować do struct tm i wyświetlić.

Trochę lepiej było to zaimplementowane w PIC32 - tam miałem zmienne globalne, w których mogłem ustawić różnicę w stosunku do UTC oraz chyba włączać automatyczne ustawianie czasu zimowego. Dzięki temu mogłem korzystać z funkcji localtime() z time.h.

Jeszcze lepiej było to zrobione w RTOS SDK z ESP8266/ESP32, gdzie po prostu wystarczyło ustawić odpowiednią zmienną środowiskową i to własciwie załatwiało sprawę - biblioteka time.h stawała się świadoma strefy czasowej:

setenv("TZ", "GMT-1GMT-2,M3.5.0/2,M10.5.0/3", 1); tzset();

Jak to się robi w STM32, korzystając z GCC i STM32CubeIDE? Muszę wrócić do rozwiązania z AVR-ów, czy istnieje jakieś bardziej eleganckie rozwiązanie?

Kolejna sprawa: komuś udało się uruchomić serwer HTTP dołączony do lwIP, korzystając z FreeRTOS?

Reply to
Atlantis
Loading thread data ...

Atlantis snipped-for-privacy@wp.pl napisał(a):

Nie musiałeś, były funkcje set_zone() i set_dst().

Tak samo jak na ESP.

Reply to
Grzegorz Niemirowski

Tego spróbowałem na samym początku. Nic nie dało - localtime nadal zwraca czas UTC.

Reply to
Atlantis

Atlantis snipped-for-privacy@wp.pl napisał(a):

Może ten string masz zły? Ja robię tak: setenv("TZ","CET-1CEST,M3.5.0/2,M10.5.0/3",1); i działa.

Reply to
Grzegorz Niemirowski

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.