FULL-C: DataFlash functions

Verze z 27. 6. 2021, 10:58, kterou vytvořil Adamn (diskuse | příspěvky) (Založena nová stránka s textem „ Tato stránka popisuje programovací jazyk '''FULL-C''', který je dostupný na vybraných zařízeních SDS. Některá zařízení používají SDS-C,…“)
(rozdíl) ← Starší verze | zobrazit aktuální verzi (rozdíl) | Novější verze → (rozdíl)
Tato stránka popisuje programovací jazyk FULL-C, který je dostupný na vybraných zařízeních SDS. 
Některá zařízení používají SDS-C, pro který máme návody jinde na této WiKi.

Funkce pro práci s pamětí DataFlash

Zařízení SDS mají k dispozici NVM paměť DataFlash, ve které může mít FULL-C program uložené vlastní data. Tyto uložené informace nejsou ztraceny při výpadku napájení, nebo při resetu zařízení SDS, atd.


Paměť DataFlash je rozdělena na stránky, kde každá stránka má pevnou přesnou velikost 264 bajtů.

Použitím FULL-C funkcí lze přistupovat ke kterékoliv stránce, která je programu FULL-C k dispozici (paměť DataFlash je použita nejenom pro FULL-C, ale i pro další účely, např. pro uchování uživatelské webové stránky).

Program může použít tyto tři funkce:

 unsigned int DF_read_page(unsigned int pageindex, void *pagedata);
 unsigned int DF_write_page(unsigned int pageindex, void *pagedata);
 unsigned int DF_erase_page(unsigned int pageindex);

Všechny funkce vracejí číselnou hodnotu: 0 (nula) v případě neúspěchu, nebo 1 pokud se úkol povedl.


Dostupná paměť

K dispozici jsou stránky od indexu 0 (nula) (včetně) (úplně první stránka) až po index 255 (včetně) (úplně poslední použitelná stránka). To celkem odpovídá 67584 bajtům, které jsou k dispozici pro uložení vlastních uživatelských dat.


Varování - omezte počet zápisů do paměti DataFlash, protože technologie, kterou je tato paměť vyrobena, umožňuje pouze několik desítek (až sto) tisíc zápisů (potom mohou začít vznikat chyby).


DF_read_page

Tato funkce přečte jednu vybranou stránku (264 bajtů) z pozice "pageindex" do připraveného pole (předaného funkci přes ukazatel "pagedata")


 unsigned int page;
 unsigned char buffer[264]; // vzdy minimalne 264 bajtu

 page = cislo_stranky_sem; // zadejte index

 if (DF_read_page(page, buffer) == 0)
 {
   printf("nepovedlo se přečíst stránku %u z DF\n", page);
 } else
 {  
   printf("stránka %u přečtena z DF\n", page);

   // vsech 264 bajtu ze stranky 'page' je k dispozici v buffer[]
 } 


DF_write_page

Tato funkce zapíše (264 bajtů) do vybrané stránku na pozici "pageindex", z připraveného pole (předaného funkci přes ukazatel "pagedata").


 unsigned int page;
 unsigned char buffer[264]; // vzdy minimalne 264 bajtu

 page = cislo_stranky_sem; // zadejte index

 buffer[0] = 10; // atd. - do buffer[] zapiste vse co chcete ulozit do pameti DataFlash

 if (DF_write_page(page, buffer) == 0)
 {
   printf("nepovedlo se zapsat stránku %u do DF\n", page);
 } else
 {  
   printf("stránka %u zapsána do DF\n", page);
 }


DF_erase_page

Tato funkce vymaže jednu vybranou stránku (264 bajtů) na pozici "pageindex" - konkrétní stránka je vyplněna hodnotou 0xFF (výchozí stav paměti DataFlash, když je vymazána). Ostatní stránky nejsou změněny.

Použití vymazání stránky je rychlejší a šetrnější, než mazat stránku pomocí zápisu přes DF_write_page().



 unsigned int page;

 page = cislo_stranky_sem; // zadejte index

 if (DF_erase_page(page) == 0)
 {
   printf("nepovedlo se smazat stránku %u v DF\n", page);
 } else
 {  
   printf("stránka %u smazána v DF\n", page);
 }


Změna jen části obsahu stránky

Protože čtení i zápis (a mazání) pracuje vždy s celou stránkou (264 bajtů), je potřeba umět použít správné postupy, pokud je úkolem změna jen části obsahu stránky.

Následující příklad ukazuje, jak na stránce "123" změnit pouze jeden bajt na této stránce, a to na offsetu [24] na konkrétní hodnotu "99".


 unsigned int page;
 unsigned char buffer[264]; // vzdy minimalne 264 bajtu

 page = 123; // tento priklad pracuje se strankou cislo 123

 if (DF_read_page(page, buffer) == 0)
 {
   printf("nepovedlo se přečíst stránku %u z DF\n", page);

   // takze nepokracujeme . . .
 } else
 {  
   // vsech 264 bajtu ze stranky 'page' je k dispozici v buffer[]

   // provedu zmenu (zmeny atd.)
   buffer[10] = 99;

   // a zapisu
   if (DF_write_page(page, buffer) == 0)
   {
     printf("nepovedlo se zapsat stránku %u do DF\n", page);
   } else
   {  
     printf("stránka %u zapsána do DF\n", page);
 
     // vse hotovo - v pameti DataFlash se na konkretni strance provedla jedina zmena, viz kod tohoto prikladu
   }
 }