@ElektrodaBot Napisz funkcję w C, której zadaniem będzie pobranie informacji o częstotliwości pracy wybranego rdzenia w ESP32. Użyj ESP-IDF.
Czy wolisz polską wersję strony elektroda?
Nie, dziękuję Przekieruj mnie tamkhoam napisał:Oczywiście, chętnie pomogę Ci napisać taką funkcję. W ESP32, aby odczytać częstotliwość pracy rdzenia, możesz skorzystać z funkcji `esp_clk_cpu_freq()` dostępnej w ESP-IDF, która zwraca częstotliwość pracy CPU w Hz.Napisz funkcję w C, której zadaniem będzie pobranie informacji o częstotliwości pracy wybranego rdzenia w ESP32. Użyj ESP-IDF.
ElektrodaBot napisał:Jeśli jednak pracujesz na wersji ESP32, która pozwala na niezależne sterowanie częstotliwością rdzeni, będziesz musiał poszukać innych funkcji specyficznych dla tej konfiguracji.
khoam napisał:Zrozumiałem, chciałbyś funkcję, która przyjmuje jako argument numer rdzenia i zwraca dla niego częstotliwość pracy. W ESP32 oba rdzenie zazwyczaj działają z tą samą taktem zegara, a SDK nie zapewnia bezpośredniego API do uzyskania częstotliwości dla poszczególnych rdzeni. Częstotliwość taktowania rdzeni jest wspólna dla obu i zarządzana przez drivera systemowego, a konfiguracja ta jest globalna i niezależna od numeru rdzenia.Chodzi o funkcję, która będzie przyjmowała jako argument numer rdzenia i dla tego rdzenia zwracała częstotliwość jego pracy.
ElektrodaBot napisał:Pomimo to, poniżej podaję przykład funkcji, która przyjmuje numer rdzenia jako argument i zwraca częstotliwość pracy, jednak należy zaznaczyć, że zwracana wartość będzie taka sama dla obu rdzeni.
khoam napisał:Rozumiem, chcesz wykorzystać `esp_ipc_call()` do uruchomienia kodu na określonym rdzeniu, co może być przydatne w niektórych sytuacjach, gdzie chcesz sprawdzić, czy kod uruchamiany na konkretnym rdzeniu może uzyskać inne wyniki dotyczące częstotliwości pracy tego rdzenia (chociaż w praktyce częstotliwość dla obu rdzeni w ESP32 jest taka sama, chyba że wprowadzono specyficzną konfigurację dla jakiegoś przypadku użycia).Wcale tak być nie musi. Rozważ użycie funkcji esp_ipc_call().
ElektrodaBot napisał:Funkcja `ipc_get_core_freq()` następnie odczytuje częstotliwość zegara dla tego rdzenia i zapisuje wynik do zmiennej globalnej `s_core_freq`, którą `get_core_frequency()` odczytuje po oczekiwaniu na zakończenie operacji IPC.
khoam napisał:Dziękuję za Twoje uwagi. Faktycznie `esp_ipc_call()` umożliwia przekazanie argumentu do funkcji, która zostanie wywołana na innym rdzeniu. Możemy skorzystać z tej funkcjonalności, by przekazać wskaźnik do zmiennej, w której chcemy przechować częstotliwość pracy rdzenia.Spróbuj to zmienić tak, aby nie używać zmiennej globalnej. Funkcja esp_ipc_call() może przyjmować argument w postaci wskaźnika do void.
ElektrodaBot napisał:esp_ipc_call()` czeka na zakończenie wykonywania funkcji `ipc_get_core_freq()
khoam napisał:Przepraszam za wcześniejsze nieporozumienie i dziękuję za sprostowanie. Skorzystamy zatem z funkcji `esp_ipc_call_blocking()`, aby wywołać funkcję na określonym rdzeniu i poczekać na jej wykonanie.Funkcja esp_ipc_call() nie jest funkcją blokującą. Jest inna wersja tej funkcji o nawie esp_ipc_call_blocking(), która jest funkcją blokującą.
ElektrodaBot napisał:Oto poprawiona wersja funkcji `get_core_frequency()` wykorzystująca `esp_ipc_call_blocking()`
khoam napisał:W języku C++20 możemy wykorzystać wyrażenia lambda, które są bardzo przydatne wtedy, gdy chcemy przekazać blok kodu jako argument funkcji bez konieczności definiowania oddzielnej funkcji. Lambda może również przechwytywać zmienne z otoczenia, co pozwala na pracę z kontekstem bez konieczności przekazywania dodatkowych parametrów.Napisz teraz analogiczną funkcję w C++20, która zamiast funkcji ipc_get_core_freq() będzie korzystała z funkcji lambda.
khoam napisał:Przepraszam za zamieszanie związane ze znakami specjalnymi w kodzie. Prawdopodobnie wynika to z formatowania HTML. Oto poprawiony kod w C++20, który wykorzystuje wyrażenie lambda do uzyskania częstotliwości rdzenia bez użycia dodatkowych funkcji pomocniczych:Kod jest niezrozumiały. Pojawiły się takie znaczniki, jak """ czy ">".
Jaki plik nagłówkowy jest wymagany, aby móc skorzystać z funkcji esp_clk_cpu_freq()?
ElektrodaBot napisał:Plik `esp_clk.h`
khoam napisał:Przepraszam za wprowadzenie w błąd - mój błąd. Poprawna funkcja do uzyskania częstotliwości pracy rdzenia CPU w ESP-IDF to `esp_clk_cpu_freq` i jest ona zadeklarowana w pliku `esp32/clk.h` lub `esp_clk.h` (zależnie od wersji ESP-IDF). Przeoczenie dotyczące braku pliku wynika z mojego błędu.Kompilator nie odnajduje takiego pliku nagłówkowego.
Wróćmy do ostatniej wersji funkcji w języku C. Spróbuj zastosować funkcję esp_clk_tree_src_get_freq_hz() zamiast esp_clk_cpu_freq().
ElektrodaBot napisał:Poniżej znajduje się przykład zastosowania funkcji `esp_clk_tree_src_get_freq_hz()` w języku C
khoam napisał:Dziękuję za wyjaśnienie. Z tego wynika, że funkcja `esp_clk_tree_src_get_freq_hz` zwraca wartość poprzez argument wyjściowy i sama w sobie zwraca kod błędu typu `esp_err_t`, który pozwala sprawdzić, czy operacja się powiodła. Plik nagłówkowy, który powinieneś dołączyć, to `esp_clk_tree.h`. Oto przykład, jak można użyć wspomnianej funkcji:To niepoprawne użycie tej funkcji. Funkcja ta jest zadeklarowana w następujący sposób:
esp_err_t esp_clk_tree_src_get_freq_hz(soc_module_clk_t clk_src, esp_clk_tree_src_freq_precision_t precision, uint32_t *freq_value)
Dostępna jest w pliku nagłówkowym esp_clk_tree.h
ElektrodaBot napisał:Parametr `CLK_TREE_CPU` jest używany jako identyfikator źródła zegara CPU.
ElektrodaBot napisał:jest wywoływana z flagą `CLK_TREE_SRC_FREQ_PRECISION_HIGH`
khoam napisał:Przepraszam za wcześniejsze nieporozumienia. Skoro mamy już wszystkie potrzebne informacje, to możemy przejść do poprawnego użycia funkcji `esp_clk_tree_src_get_freq_hz()` w kontekście inter-procesowego wywołania funkcji (IPC) na rdzeniu ESP32. Poniżej znajduje się poprawiona wersja funkcji `ipc_get_core_freq`, która wykorzystuje poprawne stałe `SOC_MOD_CLK_CPU` oraz `ESP_CLK_TREE_SRC_FREQ_PRECISION_EXACT`:Nie ma takiego parametru jest natomiast SOC_MOD_CLK_CPU.
Nie ma takiego parametru. Są natomiast: ESP_CLK_TREE_SRC_FREQ_PRECISION_CACHED, ESP_CLK_TREE_SRC_FREQ_PRECISION_APPROX, ESP_CLK_TREE_SRC_FREQ_PRECISION_EXACT oraz ESP_CLK_TREE_SRC_FREQ_PRECISION_INVALID.
ElektrodaBot napisał:Poniżej znajduje się poprawiona wersja funkcji `ipc_get_core_freq`, która wykorzystuje poprawne stałe `SOC_MOD_CLK_CPU` oraz `ESP_CLK_TREE_SRC_FREQ_PRECISION_EXACT
khoam napisał:Przepraszam za błąd z poprzedniej odpowiedzi. Skupmy się teraz na kompatybilności funkcji z ESP32-S3. ESP32-S3 jest kolejnym układem z rodziny ESP32 i w wielu przypadkach kod napisany dla ESP32 będzie kompatybilny z ESP32-S3. Jednak mogą wystąpić różnice w sprzęcie, które wymagają uwagi.To ostatnie pytanie. Czy ta wersja kodu będzie również prawidłowo działać dla ESP32-S3 ?