Koncepce programu / sdílená paměť

Dá sa to napríklad takto:

  1. zdielaná pamäť

program sa zostaví zo viacerých samostatných súborov (*.C).
Jeden sa stará o teplotu, ďalší o zobrazenie na displeji, ďalší napríklad o spínanie relé, ak ej teplota vysoká. No hlavne jeden z nich sa stará o správu spoločnej pamäte.

Do spoločnej pamäte nie je prístup priamo od hocikadiaľ hocikam, ale jednotlivé programy si volajú funkciu správy pamäti. Môže mať hlavičku napríklad

uint8_t fn_ram(uint8_prikaz, uint16_t index, uint16_t pocet_prenasanych_bajtov, (uint8_t *) *p_data_z_aplikacie)

táto funkcia nerobí nič iné, len spravuje pole bajtov, stráži, či niekto nechce načitať/zapísať data mimo veľkosť tohto poľa.
Vôbec netreba strážiť typ pamäte. Je to jednoducho hromada bajtov do ktorých sa správne zapíšu/načítajú wordy ale aj celé štruktúry.

Akurát si v jednom headrovom súber je dobré viesť presnú evidenciu, že na ktorom indexe toho bajtového poľa je čo uložené.

Výhoda je v tom, že takto môžeš ľahko pridávať uberať rôzne *.c súbory a ak tieto spolupracujú s ostatnými len cez toto pole, zvyšok programu to neovplyvní. Ľahko sa tiež skutočné fyzické údaje nahradia údajmi testovacími. Stačí, aby bola riadiaca funkcia presmerovaná na iný index bajtového poľa kde ju čakajú podhodené dáta napríklad z PC.

Atomickosť prenosu si môžeš zvoliť podľa ľubovôle. Osobne používam atomickosť 64B, čo je pre moje aplikácie s rezervou dostatočné.

Veľkosť tejto pamäte na ATmege používam od 1kB do 12kB, v závislosti od typu ATmegy.

Program starajúci sa o komunikáciu robí nasledovné. Musí prijať správu a skontrolovať, či údaje nie sú poškodené. To sa najčastejšie robí pomocou CHS alebo CRC.

Zvyčajne správa obsahuje informáciu komu je určená (adresa stanice), či sa chce do stanice zapisovať alebo z nej čítať, koľko bajtov a od ktorého indexu tej veľkej spoločnej pamäte.

Až keď je správa skontrolovaná, až potom sa vykonáva jej požiadavka. Veľkosť bufera správy závisí od maximálnej veľkosti prenášaných dát.

Ak je správa v poriadku a jedná sa napríklad o požiadavku načítania zo stanice, program starajúci sa o komunikáciu zavolá funkciu napríklad s parametrami

index = 241;
pocet_bajtov = 20;

vysledok = fn_ram(RD, index, pocet_bajtov, (uint8_t *) ukazatel_na_komunikacny_bufer);

premenna vysledok obsahuje info, ako spracovanie dopadlo, či sa nejednalo o požiadavku na načítanie mimo povolenú oblasť a tak podobne.

Príjem a vysielanie bajtov z komunikačnej časti môže prebehnúť pod prerušením. Vyhodnotenie kvality prijatej správy pod prerušením nie je najvhodnejšie. To sa zvyčajne robí v nejakej hlavnej slučke. Ak je nastavený nejaký príznak, je to info pre druhú časť programu, že nejaká správa bola prijatá. Tá druhá časť správu spracuje, predpripraví výsledok a ten sa následne pod prerušením odvysiela.