SDS-C: DataFlash: Porovnání verzí

(Založena nová stránka s textem „ Tato stránka popisuje programovací jazyk '''SDS-C''', který je dostupný na vybraných zařízeních SDS. Některá zařízení používají FULL-C,…“)
 
 
Řádek 106: Řádek 106:
  
 
'''Čtení:'''
 
'''Čtení:'''
<c>
+
<syntaxhighlight lang="c">
// přečte z DF stránky 8, do pole ram[200] až ram[200+66-1],  
+
// přečte z DF stránky 8, do pole ram[200] až ram[200+66-1],  
// tj. 66 položek do ram[200] z dataflash stránky 8
+
// tj. 66 položek do ram[200] z dataflash stránky 8
read_dataflash_page_to_ram(8, 200);
+
read_dataflash_page_to_ram(8, 200);
</c>
+
</syntaxhighlight>
  
 
Obě SDS-C funkce mají dva parametry: číslo DF stránky a první index do pole ram[], kam budou položky zapsány.
 
Obě SDS-C funkce mají dva parametry: číslo DF stránky a první index do pole ram[], kam budou položky zapsány.
Řádek 142: Řádek 142:
  
 
[[Soubor:Sds_c_df_access.png]]
 
[[Soubor:Sds_c_df_access.png]]
 +
 +
__NOTOC__

Aktuální verze z 18. 3. 2021, 21:14

Tato stránka popisuje programovací jazyk SDS-C, který je dostupný na vybraných zařízeních SDS. 
Některá zařízení používají FULL-C, pro který máme návody jinde na této WiKi.

Využití paměti DATAFLASH v SDS-C programu

Zapisovat uživatelské údaje do paměti DATAFLASH lze teprve při použití verze SDS-C č. 05 a novější. To znamená, že musíte mít v zařízení nahraný nejnovější firmware.

Další rozšíření firmware přišlo v listopadu 2013, kdy se nabídla možnost číst a psát celé stránky, ne jen jednotlivé položky.

Současný firmware je plně schopný s pamětí DATAFLASH pracovat.


Důležité upozornění

Počet zápisů do paměti typu DATAFLASH je omezen. Omezení je dáno technologií paměti (FLASH paměti). Toto omezení platí jak pro sys[100] až sys[115], tak pro doplněný prostor od verze SDS-C č. 05.

Maximální počet zápisů je těžké přesne číselně určit. Doporučuji nastudovat si dokumentaci od výrobce (firma Atmel - web: serial flash memories, typ. 45DB).

Při každém zápisu dochází k přepsání celé stránky paměti, podle toho, kam konkrétní položka patří (o to se stará firmware v zařízení SDS, pro uživatele SDS-C je to transparentní).

Po určitém počtu zápisů může dojít k poškození obsahu stránky, takže při čtení vrátí jiné hodnoty než tam byly zapsány, nebo do ní už nepůjde vůbec zapsat (změnit hodnotu).

Počet takových zápisů (aby došlo k poškození) je v desítkách až stovkách tisíc zápisů - což je sice na první pohled vysoké číslo, ale pokud např. budete zapisovat údaje každou vteřinu, pak deset tisíc zápisů dosáhnete za skoro 3 hodiny provozu, takže za pár dní s takovým tempem bude pamět zničená a bude potřeba ji vyměnit za novou.

Odsud se odvíjí i doporučení jak paměť DF využívat - např. pro ukládání konfigurace, která se mění jednou za čas atd. Naopak pro ukládání záznamů už se to jeví jako méně vhodné, zejména je-li k dispozici možnost údaje odesílat přes Ethernet na nějaký server a ukládat to tam.


Alternativa k paměti DF

Některé zařízení SDS (např. TTCPRO a MINI) mají i malou oblast bateriově zálohované paměti RAM - kterou je možné využít jako alternativu k paměti DATAFLASH - např. pro položky které jsou často a nebo rychle přepisovány, a které současně mají zůstat zachovány i při výpadku napájení. Přístup do zálohované RAM je přes sys[] proměnné, viz jejich seznam.


Využití paměti DataFlash v SDS-C

Paměť je dostupná, po jednotlivých položkách (signed long), od indexu 0 po index 7259 včetně. Každá položka je samostatná (lze to samostatně číst a zapisovat), má svůj jedinečný index, a všechny položky jsou dále seskupeny do stránek.


1. Čtení po položkách


Čtení a zápis položky, se provádí zavoláním příslušné interní funkce. Hodnota se vždy předává v sys[99].

Zápis:

sys[99] = 1234;
write_dataflash(120);  // tato interní funkce zapíše hodnotu (1234) do DF na pozici 120

Příklad provede zápis na pozici 120, a zapíše se tam hodnota 1234.

Poznámka - práce s jednotlivými položkami: Paměť poskytuje přístup ke svému obsahu po jednotlivých stránkách. Každá stránka má 264 bajtů, což odpovídá 66 "signed int" položkám na jednu stránku. Při každém zápisu provede program přečtení celé stránky, změní v ní 4 bajtu (na odpovídajícím umístění) a pak celou stránku zapíše zpět do paměti. Stránky jsou uloženy těsně za sebou, takže najít pozici pro konkrétní položku je velmi snadné. Takže při změně jediné položky dojde k přepisu celé stránky (a jinak to s tímto typem DF paměti nelze provést). Takže pokud postupně provedete zápis do jednotlivých 66 položek na stránce, dojde k 66 násobnému přepisu celé stránky v DF. Toto opět výrazně přispívá ke snížení životnosti paměti DF, viz varování výše.


Čtení:

read_dataflash(120);  // tato interní funkce přečte hodnotu z DF z pozice 120
i = sys[99]; // hodnota je uložena v konkrétní sys[99], takže si ji můžeme vyzvednout - zde do proměnné "i"


2. přístup po celých stránkách

Viz text dále.


3. přístup k položkám z webu

Obsah DF lze také číst z webového rozhraní, pomocí get_dfi[] volání, detaily viz zde.


Rychlost

Při zápisu a také i při čtení dochází k zablokování činnosti SDS-C programu. Zdržení je až 250 msec (max), záleží to na paměti DF.

Informace:

Vnitřní způsob práce s jednotlivými položkami (jak to SDS uvnitř dělá):

Čtení využívá cache o velikosti stránky, takže pokud budete přemýšlet a vhodně umístíte jednotlivé položky (tak aby v každé stránce byly u sebe ty, které se častou čtou společně hned po sobě, atd.), tak nebude program tak často provádět nové čtení z DF (a blokace při čtení je pak omezena na minimum). Zápis však vždy trvá delší dobu.


Práce s celou stránkou

SDS-C má dvě další funkce, které umožňují číst a zapsat celou stránku - tj. všech 66 položek v rámci jedné stánky najednou.

Každá stránka má vždy 264 bajtů, což při velikosti jedné položky (signed long) o čtyřech bajtech, dává právě 66 položek pro jednu stránku. Tak jak jsou položky ve stránce za sebou, jsou za sebou i stránky v paměti DF.

STRÁNKA 0: položky 0 až 65
STRÁNKA 1: položky 66 až 131
a tak dále

Celkem je k dispozici 110 stránek - položky 07259 (tj. celkem 7260 položek s indexováním od nuly).

Na rozdíl od přístupu přes sys[99], kde se přistupuje po indexech s krokem "jedna položka" (tj. signed integer, nebo-li ctyři bajty), však v případě přístupu k celé stránce máme k dispozici surové bajty, a musíme si proto ručně položky najít (pokud chceme). Samozřejmě tím že se ke stránce přistupuje na úrovni jednotlivých bytes, můžeme si zde dělat co potřebujeme a nejsme omezeni kromek po čtyřbajtových položkách.

Příklady:

Zápis:

// zapíše na DF stránku 10, pole ram[100] až ram[100+66-1], 
// tj. 66 položek z ram[100] do dataflash stránky 10
write_ram_block_to_dataflash_page(10, 100);

Čtení:

// přečte z DF stránky 8, do pole ram[200] až ram[200+66-1], 
// tj. 66 položek do ram[200] z dataflash stránky 8
read_dataflash_page_to_ram(8, 200);

Obě SDS-C funkce mají dva parametry: číslo DF stránky a první index do pole ram[], kam budou položky zapsány.

Změna několika položek v rámci jedné stránky

// příklad: vzorová změna položek na DF stránce 24
// pozn. využijeme ram[100] až ram[165] jako dočasného prostoru
 
// přečte z DF stránky 24, do pole ram[100] až ram[100+66-1], 
read_dataflash_page_to_ram(24, 100);

// pro příklad provedeme nějaké změny hodnot . . . je to příklad . . .
ram[110] = 23;
ram[120] = 34;
ram[130] = -55;

// zapíše na DF stránku 24, pole ram[100] až ram[100+66-1], 
write_ram_block_to_dataflash_page(24, 100);


// takto jsme na DF stránce (24) změnili tři položky, a všechny ostatní zůstaly nezměněny

Vždy se zapisuje 66 položek do/z pole ram[] - je s tím potřeba počítat při tvorbě programu, ať si nepřepíšete jiné své údaje v ram[].


Grafické znázornění

Každá stránka má 264 bajtů, a tak se do každé stránky vejde právě přesně 66 položek. Vše se čísluje od nuly.

Sds c df access.png