Skocz do zawartości

Stacja pogodowa z semaforem nie odczytuje danych z partycji NVS.


Pomocna odpowiedź

Napisano (edytowany)

- mam stacje pogodową w zegarku opartym na wyswietlaczu GC9A01 i Esp32 Pico D4.
- korzystam z Arduino IDE 2.3.5 oraz Esp32 board wersja 2.0.17.
- ilośc flasha 4MB, pamieć RAM 340 kB.
- mam dwie partycje NVS, 20 kB oraz 24kB.
- w tej pierwszej są dane pogodowe aktualne, w drugiej dane pogodowe z trzech kolejnych dni.
- program posiada dwa wątki, muteksa, 4 timery, wszystko działa. 
- czasami podczas odczytu z tych partycji dane są przekłamane.
- dlatego chciałem zastosować semafory, podczas odczytu danych z partycji NVS.
- jednak po zastosowaniu semafora, program staje w miejscu gdzie jest semafor.
- coś jest żle tylko gdzie, jak to szukać.
- wartość wolnego stosu oscyluje na poziomie 100 - 150 kB.
- tak jest na dwóch egzemplarzach tych urządzeń.

partycja.thumb.jpg.89cc9f257abe79e22608fa3b21f331cb.jpgxSemafor2.thumb.jpg.b03798ac570d4013705aea301be47af2.jpgNVS1.thumb.jpg.06f42c08ae4c38d2fcb7c451d170a78b.jpgNVS2.thumb.jpg.21c7db898ab1805e942bdc2d39f93558.jpg

	// ---------------------
void odczyt_NVS2()																	// []
{
	Serial.println(" _3765_ odczyt NVS2 --> tablicy F");
		// ----------------------------------- RO_MODE -------------------------------
	
	nvs_open_from_partition("nvs2", "stuff", NVS_READONLY, &handle);	// ### 2
				//nvs_close(handle);	for(;;); 	
		// ----------------------- fIcon[] -odczyt---------------------
	LockPrefs();																			// [880]	
	UnlockPrefs();																		// [990]		
	for (int r = 0; r < max_readings; r++)
	{																																						
		key = "fIkon" + String(r); 
		nvs_get_str(handle, key.c_str(),  NULL, &required_size);			// pobierz rozmiar
		nvs_get_str(handle, key.c_str(), FIcon[r], &required_size);		// char[] String		
					// error: incompatible types in assignment of 'float' to 'char [4]'
	}	
		
			// -------------------
void odczyt_NVS1()																	// [4125]  --> debug_Tablice
{		
	Serial.println(" _3710_ odczyt NVS --> tablicy a");
		// ----------------------------------- RO_MODE -------------------------------
	mySketchPrefs.begin("myprefs", RO_MODE);        		//  reopen it in RO mode.
				//	mySketchPrefs.end(); for(;;);
	mySketchPrefs.getBool("nvsInit", false);  						// read from nvs.	
		// Serial.printf(" err: %d", mySketchPrefs.getBool("nvsaktualne", false));  // zapisano NVS, NVS2								
	aktualneSVN = mySketchPrefs.getBool("nvsaktualne", false);  // zapisano NVS, NVS2
	Serial.printf(" aktualneSVN: %d\n", aktualneSVN);
			
	// --------------------------
	//LockPrefs();																				// [885]
	//UnlockPrefs();																				// [990]
	mySketchPrefs.getFloat("alat", alat);
	
	mySketchPrefs.getFloat("alon", alon);
	mySketchPrefs.getInt("aYy", aYy);
	
	mySketchPrefs.getString("aPeriod", aPeriod);
	mySketchPrefs.getString("aTrend", aTrend);									
	mySketchPrefs.getString("aIcon", aIcon);									  
	mySketchPrefs.getString("aMain0", aMain0);									
	mySketchPrefs.getString("aForecast0", aForecast0);					
	mySketchPrefs.getString("aCountry", aCountry);

 

Edytowano przez 99teki
(edytowany)

A czy semafor ma przypisaną wartość to znaczy czy nie jest null i czy sprawdzasz czy zajęty? Poza tym w dokumentacji freertos piszą że bardzo często lepiej zastosować notyfikacje zamiast semafora

https://www.freertos.org/Documentation/02-Kernel/04-API-references/10-Semaphore-and-Mutexes/00-Semaphores

 

SemaphoreHandle_t xSemaphore = NULL;

/* Repetitive task. */
void vATask( void * pvParameters )
{
    /* We are using the semaphore for synchronisation so we create a binary
       semaphore rather than a mutex. We must make sure that the interrupt
       does not attempt to use the semaphore before it is created! */
    xSemaphore = xSemaphoreCreateBinary();

    for( ;; )
    {
        /* We want this task to run every 10 ticks of a timer. The semaphore
           was created before this task was started.

           Block waiting for the semaphore to become available. */
        if( xSemaphoreTake( xSemaphore, LONG\_TIME ) == pdTRUE )
        {
            /* It is time to execute. */

             ...

            /* We have finished our task. Return to the top of the loop where
               we will block on the semaphore until it is time to execute
               again. Note when using the semaphore for synchronisation with an
               ISR in this manner there is no need to 'give' the semaphore
               back. */
        }
    }
}

 

Edytowano przez _LM_
  • Lubię! 2

Aha i do ochrony zasobów to chyba lepiej użyć mutexów, choć być może błądzę w tej chwili... Dawno z tym nie działałem 🤔 

  • Lubię! 1

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...