forum.mcontrollers.com - hlavní stránka forum.mcontrollers.com - fórum

 

.: fórum - hlavní stránka :.
Technology Stronghold by Rudolf Vesely
How to build Microsoft System Center hosted cloud series
FAQFAQ HledatHledat Seznam uživatelůSeznam uživatelů Uživatelské skupinyUživatelské skupiny RegistraceRegistrace
ProfilProfil StatistikaStatistika Soukromé zprávySoukromé zprávy PřihlášeníPřihlášení

 
Koncepce programu / sdílená paměť

 
Přidat nové téma   Zaslat odpověď    Obsah fóra mcontrollers.com -> ARM
 
ccccdddd
Přispěvatel
Přispěvatel


Založen: 24.6.2009
Příspěvky: 25

PříspěvekZaslal: 29 listopad 2017, 20:07    Předmět: Koncepce programu / sdílená paměť Citovat

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
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
Martin
ATmega pouzivatel
ATmega pouzivatel


Založen: 5.1.2008
Příspěvky: 1472

PříspěvekZaslal: 29 listopad 2017, 21:59    Předmět: Citovat

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.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
ccccdddd
Přispěvatel
Přispěvatel


Založen: 24.6.2009
Příspěvky: 25

PříspěvekZaslal: 30 listopad 2017, 12:44    Předmět: Citovat

Díky za info
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
Radius
Profesionál
Profesionál


Založen: 22.2.2013
Příspěvky: 486

PříspěvekZaslal: 01 prosinec 2017, 19:15    Předmět: Citovat

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.
_________________
x51 , ARM , XILINX
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail Zobrazit autorovy WWW stránky
 

 
jirka.jirka.
Profesionál
Profesionál


Založen: 10.9.2007
Příspěvky: 48

PříspěvekZaslal: 06 prosinec 2017, 11:02    Předmět: Citovat

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
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

Zobrazit příspěvky z předchozích:   
Zobrazit předchozí téma :: Zobrazit následující téma  
Přidat nové téma   Zaslat odpověď    Obsah fóra mcontrollers.com -> ARM Časy uváděny v GMT + 2 hodiny
 
Strana 1 z 1
Přejdi na:  
Můžete přidat nové téma do tohoto fóra.
Můžete odpovídat na témata v tomto fóru.
Nemůžete upravovat své příspěvky v tomto fóru.
Nemůžete mazat své příspěvky v tomto fóru.
Nemůžete hlasovat v tomto fóru.
Můžete k příspěvkům připojovat soubory
Můžete stahovat a prohlížet přiložené soubory
 



Num Lock Holder - app to hold Numlock
Copyright © 2018 Rudolf Veselý, mcontrollers.com.
Je zakázáno používat části tohoto webu bez souhlasu autora. || Powered by phpBB © 2001, 2002 phpBB Group - with RedSquare DoubleJ(Jan Jaap)