SDS-C: SCB

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


Soubor .SCB

Soubor .SCB obsahuje výstup překladu vašeho zdrojového kódu jazyka SDS-C.

Provedení překladu pomocí aplikace SDSC.exe v příkazovém řádku:

C:\SDSC\SDSC.EXE compile test.c

Tento příklad vezme zdrojový kód v jazyce SDS-C v textovém souboru test.c , provede překlad, a vygeneruje binární soubor test.c.SCB .

Soubor SCB lze přímo poslat pomocí HTTP POST do všech zařízení SDS řady ST.


Formát souboru .SCB

Soubor se skládá z datových bloků o typicky pevné velikosti (jen poslední blok může být kratší).

Na začátku každého bloku je hlavička, a následuje datový obsah.

Bloky jsou těsně na sobě, za sebou, uspořádány v SCB souboru. Obsahem SCB souboru není nic jiného než tyto bloky.

Do SDS se soubor SCB přenáší kompletně v původním stavu, tak jak je zapsán na disku, beze změn. Modul SDS provádí interně kontrolu přijatého obsahu souboru SCB, a při jakékoliv odchylce celý soubor odmítne.

Obsah souboru SCB, který obsahuje "n" bloků:

BLOK 0
BLOK 1
...
BLOK n-1

Počet bloků ("n") je určen překladačem, a prakticky (logicky) odpovídá velikosti programu.

Interní datový obsah každého bloku tvoří jednotlivé části přeloženého SDS-C programu, viz dále.

Nejprve je potřeba si popsat hlavičku každého bloku:

OBSAH BLOK x
 offset | length  |  detail
 -------+---------+------------------------------------------
   0    |     2 B |   a general block position ("bpoz")
   2    |     1 B |   reserved (by default set to 0xAA)
   3    |     1 B |   block 8-bit checksum ("c")
   4    |     2 B |   block length ("blen")
 -------+---------+------------------------------------------
   5    |  blen B |   internal data   

Každý blok má svou pozici - číslování začíná na nule. Podmínkou je umístit bloky do souboru SCB přesně za sebou, tak jak se jejich pozice zvyšuje. Stejně tak jsou zasílány do SDS. Pokud SDS detekuje neplatný (očekávaný) údaj pozice, je celé nahrávání SCB přerušeno a zamítnuto.

Délka bloku "blen" musí být v rozmezí 0 až 264 (včetně). Typicky všechny bloky mají délku 264 bajtů, s možnou vyjímkou jen pro úplně poslední blok, který může být jako jediný kratší.

Interní Data bloku jsou už samotným kouskem obsahu výsledku překladu SDS-C. Překladač tedy vytvoří celý binární obsah, který je rozkouskouván do bloků (kterým je přidána hlavička). Po nahrání SDS-C do modulu SDS dojde k zahození hlavičky, úpravy a kontrole interních dat a jejich celkovému opětovnému sloučení (složeny pěkně za sebou bez přerušení). To co si SDS v sobě uchová jsou už vyčištěná interní data, tedy "binární kód SDS-C".

Každý blok má svá Interní Data jednoduše upravena, což má umožnit jejich kontrolu a detekovat chybu při přenosu. Nejedná se o šifrování (to je v plné míře a správným způsobem aplikováno až u FULL-C), ale o jednoduchou logickou operaci zaměřenou na detekci bitových chyb.

Algoritmus úpravy (je už obsažen v SDSC.EXE a jeho výsledek je tedy už obsahem .SCB souboru) je celkově jednoduchý.

uint32_t i;
uint8_t yx, ck;
if (blen > 264)
{
  error: invalid blen -> exit
}
yx = c ^ 0x27;
ck = 0;
for (i = 0; i < blen; i++)
{
  block_internal_data[i] ^= yx;
  ck += block_internal_data[i];
}
if (ck != c)
{
  error - checksum not valid -> exit
} else
{
  checksum for this block IS valid -> continue to next block
}

Tento pseudokód je v principu obousměrný, lze jej použít jak pro vytvoření zabezpečeného bloku, tak pro ověření zabezpečení a odstranění tohoto zabezpečení.

Protože se vždy předpokládá přenos přes IP vrstvu (UDP, nebo TCP pro HTTP POST), není v tomto případě zabezpečení na této úrovni dále zvyšováno (v rámci IP vrstvy jsou pakety kontrolovány pomocí CRC32, což pro takto malou datovou dávku je dostatečné).


Postupy

Postup při překladu:

+-------------+                                                                                                                  +-------------+
| source code |                              +-------------+                                                                     | output file |
|             | ------->  COMPILER  -------> | binary code | --> SPLIT TO BLOCKS -> MODIFY INTERNAL DATA -> WRITE ALL BLOCKS --> |             |
|  test.c     |                              +-------------+                        FOR EACH BLOCK          TO .SCB              |  test.c.SCB |
+-------------+                                                                     + ADD HEADERS                                +-------------+

Postup při nahrávání do SDS:

+---------------+                                                                                                            
| compiled file |                               
|               | ------->  HTTP POST  -------> CHECK BLOCK HEADERS -> STRIP HEADERS -> UNMODIFY INTERNAL DATA -> WRITE INTERNAL DATA TO DATAFLASH --> RUN SDS-C
|  test.c.SCB   |          (authorized)                                                                           (= SDS-C BINARY CODE)
+---------------+                                                                                                            

Lze vidět že proces je přímočarý a z hlediska klienta (ten kdo nahrává do SDS) jednoduchý - pošle se obsah .SCB souboru beze změny, tak jak je na disku 1:1 do SDS.


Binární kód SDS-C

Binární kód je datový blob, který je výstupem překladu zdrojového kódu jazyka SDS-C. Tento binární kód je různým způsobem transportován do SDS, jeden za způsobů (rozklad do bloků a jejich zabezpečení) je popsán výše.

Pokud nás zajímá přímý výstup překladu, tedy ještě před předáním do transportu (tedy např. rozklad na bloky do .SCB), tak je popis zde.

MASTER HEADER
 [ header ]
STRINGS HEADER
 [ OFSLEN0, OFSLEN1, ... OFSLENn ]
STRINGS BLOB
 [ STR0, STR1, ... STRn ]
PROCEDURES (CODE BLOBS)
 [ TYPE, NUMBC, BYTECODE[] ]

Tyto čtyři základní binární části jsou umístěny těsně za sebou, a jako celek tvoří spustitelný přeložený SDS-C program, který spustí a provede kterékoliv SDS První Produktové Řady.

Naprosto všechny prvky jsou zapsány jako 16bit slova (v případě potřeby uložit do bytecode např. konstanty o větší bitové šířce, je to provedeno kombinací více 16bit slov).

Jedná se plně kustomizovaný způsob zápisu binárního kódu programu, který privátně vytvořil vývoj AN-D a který je použit jedině pro moduly SDS (OnlineTechnology).