Wpis z mikrobloga

Siemka,
czy istnieje jakiś sposób, aby w ESP8266 utworzyć zmienną globalną, która będzie zmienną String i po np. 5 sekundach zmienna ta za pomocą polecenia (nie wiem jakiego, czy to możliwe?) będzie usuwana z pamięci RAM i w miejsce niej będzie tworzona zmienna o takiej samej nazwie i typie, jednak w pełni pusta bez zajętej pamięci RAM? Czy taka operacja jest możliwa?
Potrzebuję opracować mechanizm do logowania danych, jednak danych niekiedy w ciągu sekundy jest bardzo dużo i odpada jakiekolwiek wysyłanie danych po HTTP (GET/POST) z racji opóźnień.

#mikrokontrolery #nodemcu #esp8266 #esp #elektronika #programowanie #iot #arduino
  • 33
Zacząłbym od zapoznania się z kolekcjami. Dalej
wrzucasz log do kolekcji że znacznikiem czasowym i przy okazji przeglądasz kolekcje i usuwasz logi dodane dawniej niż wskazany przez Ciebie czas. Dalej optymalizacja, ograniczanie wielkości kolekcji itd..
@MisiekD:

1. podejście ala "c" - dwywymiarowa tablica charów o stałej wielkości (static char log_buffer[MAX_LEN][MAX_LOGS]) Zaleta to szybkość i brak alokacji pamięci w trakcie pracy. Wada, to na stałe zajęty fragment pamięci. Logi zapisujesz do tablicy cyklicznie - nadpisujesz najstarszy wpis.
2. podejście ala c++ - fifo złożone z std::string
3. podejście sieciowe - wysyłaj logi jaki pakiety UDP w sieci lokalnej.
1. podejście ala "c" - dwywymiarowa tablica charów o stałej wielkości (static char logbuffer[MAXLEN][MAX_LOGS]) Zaleta to szybkość i brak alokacji pamięci w trakcie pracy. Wada, to na stałe zajęty fragment pamięci. Logi zapisujesz do tablicy cyklicznie - nadpisujesz najstarszy wpis.

2. podejście ala c++ - fifo złożone z std::string

3. podejście sieciowe - wysyłaj logi jaki pakiety UDP w sieci lokalnej.


@zetisdead: no brzmi to nieźle tylko nie wiem
@63274682374: Znaczy ja już trochę korzystam z C, długo. Ale o tym co piszesz najwyraźniej nie słyszałem. Szkoda, że ESP8266 nie ma dwóch rdzeni to bym na drugim zrobił samo wysyłanie i niech sobie miele.
@veranoo: A jak by tak kolejka działała? W czym ona mi pomoże? Bo mi tu chodzi głównie o kwestię, żeby NodeMCU się nie stopował nawet choćby na 0,2s. Musi ciągle kręcić pętle i sprawdzać stany.
@MisiekD: to już sam musisz rozkminić ile RAMu możesz przeznaczyć na buforowanie logów przed wysyłką.
Twój procek ma jakieś 160 kB RAMu, więc rezerwacja 10kB na bufor (np. 100 logów po max. 100 bajtów każdy) raczej nie jest problem.
@zetisdead: A da się to jakoś sprawdzić ile jest użycia i ile mogę wykorzystać na logi?

Aktualnie wykorzystuję moduł i przy ESP.getFreeCheap pokazuje mi, że mam jeszcze 35KB wolnego RAM-u - rozumiem, że tą przestrzeń mógłbym jeszcze użyć na logi?
MisiekD - @zetisdead: A da się to jakoś sprawdzić ile jest użycia i ile mogę wykorzys...

źródło: 447ede75f6

Pobierz
@zetisdead wiesz co? Olśniło mnie to co napisałeś o statycznej tablicy. To byłby wystarczający sposób na logi moim zdaniem.

A powiedz mi, proszę, jest jakaś gotowa funkcja w C (arduino), która będzie mi automatycznie czyścić i nadpisywać najstarszy log w statycznej tablicy?
Jakaś może metoda, która przesuwałaby wszystkie chary (pozycje tablicy) o jeden w górę (z np. pozycji 5 na 4) - czy to słaby pomysł? Patrzę w przyszłość i rozmyślam jak
@MisiekD: Możesz zadanie dać do innego taska i kolejką przesyłać do innego. Np w niewiele droższym esp32 masz 2 rdzenie i możesz delegować jakieś zasobożerne zadanie na inny rdzeń pocesora.
@veranoo: Tak, wiem, o ESP32 słyszałem, mam nawet jeden z kamerą. Rozmyślałem nad tym czy nie zmienić tego układu, jednak zmiana całego układu to bardzo dużo roboty (zmieniają się piny i to wszystko koliduje), a układ jest bardzo rozbudowany.
Ogólnie rzecz biorąc, układ znajduje się przy bramie i odpowiada także za bezpieczeństwo (ktoś naruszy przestrzeń fotokomórki - brama momentalnie staje), dlatego nie mogę sobie pozwolić na jakiekolwiek opóźnienia (przy wysyłaniu w
To może drugie ESP do komunikacji z WIFI z komunikacją po serialporcie.


@veranoo: A wiesz, że dokładnie to samo mam od 2 dni w głowie i chciałem to przetestować? :) Zastanawiam się jedynie jakiej biblioteki użyć i czego się obawiam - że gdy w ciągu 0,1s otrzymam po serialu od jednego ESP dane, a drugi ESP w tym czasie będzie np. wysyłał dane po WiFi to czy ten drugi odbierze te
@MisiekD: Możesz pewnie coś zrobić na zasadzie jak jest w protokole udp, wysyłasz jakiś pakiet danych i masz w pompce czy ktoś to otrzymał czy nie. Komunikacja działa tylko w jedną stronę master wysyła slave odbiera i później coś z tym robi, czy zapisuje na jakimś flashu czy wysyła wifi to jest nieistotne z poziomu urządzenia które wysyła. A tam już możesz zrobić dwa taski na dwóch rdzeniach i za pomocą
@veranoo: Nie rozumiem, chyba Ty mnie też źle zrozumiałeś :P Ja powyższy przykład pisałem głównie o komunikacji po Serialu, nie WiFi. I mnie zastanawia co się stanie jak jeden ESP będzie po Serialu nadawał, drugi ESP powinien odebrać, ale będzie akuratnie w tym momencie zajęty (np. coś robił z danymi lub wysyłał), zatem czy te dane po Serialu przepadną, czy zostaną zinterpretowane jak drugi ESP będzie już bezczynny? O to mi