Koncepce programu / sdílená paměť

Ahoj,
potřeboval bych poradit. Mám aplikaci typu master/slave BEZ RTOS. Každý slave má paměť reprezentovanou polem např. 20 bytu (význam jsou např. stavy vstupů,výstupů, naměřená teplota atd). Master má vyhrazenou paměť, která představuje všechny připojené slavy. Komunikace je po RS485.

Měl jsem v plánu, že v hlavní smyčce budu zpracovat příslušné data z paměti (načítaní vstupů, aktualizace teplot atd). Při přerušení při přijmu dat přes UART budu zpracovávat příkaz a následně data odesílat, ale přemýšlím jak vyřešit sdílení přístup k té paměti? Jestli by to náhodou nedělalo problém.Nebo jestli je lepší ty příkazy přes UART načítat do bufferu a zpracovávat je až v hlavní smyčce? Nebo jestli mít tu pamět alokovanou 2x a s jednou pracovat v ISR, s druhou v hlavní smyčce a jenom v určitý okamžik to synchronizovat.

Děkuji za rady

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.

Díky za info

Můžeš jednotlivé bufery/struktury zamykat, nebo mít jeden navíc a tabulku s indexem platneho buferu. Přijímání dat v IRQ do nějakého založního buferu. CRC se dá počítat i během příjmu dat, záleží jakej datarate budeš mít, jinak klasicky až po přijetí celé zprávy a nebo tahat z kruhového buferu mimo přerušení. Atomicita na úrovni cele struktury - některá data spolu můžou souviset a to pak vznikají různé problémy.

Martin: Mohl bys mi ukázat i nějaký příklad? Toto mě docela zaujalo a rád bych se o tom dozvěděl víc. Nebo aspoň nějaké podklady. Díky moc