Mereni napeti baterie pomoci AVR
Michal Gregor
a2x1nptda8 na email.cz
Čtvrtek Leden 6 10:13:18 CET 2011
V noci se mi o tom zdalo....
Dokazu si predstavit svuj jednoduchy RTOS i na PIC18Fxx s 8mi jadry. Bude to
fungovat, neni to nic sloziteho:
PIC dve jadra. CPU A ma svoji FLASH 64KB, CPU B ma svoji FLASH 64KB.
Spolecne je pouze SRAM 4KB. U picu je vetsina registru ulozena v RAMce.
Nektere by se musely zdvojit - citac programu, stack, akumulator. (Takze mam
ve vysledku dva procesory v jednom pouzdre.)
Program rozdělím na dva, jen si budu muset pohlídat rozdeleni pameti RAM.
Vymena dat mezi vlakny zadny problem. Je to totez co mezi prerusenim a
hlavnim programem.
Takovy procesor by se hodil. Jadro A - LCD + graficke rozhrani, dotykove
ovladani, USB, LAN... Jadro 2: AD + slozite vypocty, rizeni PWM, a podobne.
Rozdil mezi jednoduchym a slozitym RTOS je v dynamickem rezimu. Ja to musim
vse nachystat a vyzkouset dopredu. Kdezto dospely RTOS pridava aplikace za
behu, (nebo dokonce kompiluje za behu - framework), spravuje pamet a taky
prideluje vykon procesoru podle priorit.
Michal Gregor
----- Original Message -----
From: "Pavel Troller" <patrol na sinus.cz>
To: "HW-news" <hw-list na list.hw.cz>
Sent: Wednesday, January 05, 2011 9:38 PM
Subject: Re: Mereni napeti baterie pomoci AVR
Zdravim sam sebe,
jeste se doplnim, uvedomuji si, ze rozdil "opravdoveho" RTOS a toho
"pseudo" Vaseho neni na prvni pohled zcela patrny, pokud uvazujeme jen jedno
CPU. Plna vyhoda multithreaded reseni nastane az tehdy, je-li k dispozici
vice
CPU, at uz jsou to jen jadra jednoho fyzickeho ci samostatne cipy. Tam uz je
myslim jasne patrne, ze cyklus subrutin je neco uplne jineho nez RTOS s
"opravdovym" schedulerem. Na systemu s pouze jednim CPU je samozrejme tento
rozdil mnohem mene vyrazny a skutecne lze Vase reseni v jednoduchych
situacich
pouzit, ale opravdu bych ho neoznacoval jako "vicevlaknove" :-).
Zdravi Pavel.
> Zdravim,
>
> > Ale vysledek je stejny, bezi vice vlaken najednou.
>
> To prave neni pravda - alespon podle bezne prijimane definice vlakna
> (thread).
> Jsme tu v technicke konferenci a proto bychom se meli vyjadrovat technicky
> presne, jinak to bude prave jako v tomto pripade "jeden o koze a druhy o
> voze".
> Nejzakladnejsi definice threadu je - cituji Wikipedii - "a set of
> instructions that may execute in parallel with other threads", a to Vase
> reseni pri nejlepsi vuli jaksi neni :-).
>
> >
> > Co je lepsi? RTOS, ktery to resi za programatora, ale sezere spoustu
> > prostredku? Nebo program ktery je od pocatku rozdelen a ma malou rezii?
> >
>
> RTOS je universalni. Jednou napsany, muze slouzit vice ucelum, ale
> samozrejme
> za cenu sve rezie. Program, ktery je od pocatku napsan jako
> single-threaded,
> tj. nepouziva zadne vlastnosti "opravdovych" RTOS, samozrejme muze byt pro
> danou aplikaci dostacujici. Ale zkuste takto resit treba i jen ten
> nejzakladnejsi, uplne blby mobilni telefon - to uz by podle mne nebylo
> mozne.
>
> >
> > Michal Gregor
> >
>
> Zdravi Pavel.
>
> >
> > ----- Original Message ----- From: "Milan" <milger na pobox.sk>
> > To: "HW-news" <hw-list na list.hw.cz>
> > Sent: Wednesday, January 05, 2011 7:48 PM
> > Subject: Re: Mereni napeti baterie pomoci AVR
> >
> >
> > Ja o "voze", vy o "koze".
> > Vy ste si rozdelil algoritmus na male casti, ktore vo vami definovanom
> > poradi vykonavate. To je vsetko. Nijako to nesuvisi s RT OS o ktorom
> > hovorim
> > ja.
> > Rozdiel:
> > U mna kazde vlakno dostane definovany cas na riesenie, po nom bez ohladu
> > na
> > stav, mu je odobrany procesor a ide ine vlakno. Vase casti algoritmu sa
> > vykonavaju v definovanom poradi, postupne v naprogramovanom poradi a
> > pokial
> > nejaka neskonci, dalsia sa neriesi.
> >
> > Ja to riesenie nekritizujem, je to idealne pokial nemam RT OS, akurat
> > hovorim o niecom inom....
> >
> >
> > Priklad:
> > /******************************************************************************/
> > /* Task 0 'init': Initialize
> > */
> > /******************************************************************************/
> > void INITIALIZE (void) _task_ INIT
> > { //program execution starts here
> > os_create_task (EVENT_IFF); //start command task for UART1
> > os_create_task (EVENT_TTV); //start command task for UART2
> > os_delete_task (INIT); //stop init task (no longer
> > needed)
> > }
> >
> > /******************************************************************************/
> > /* Task 2 'EVN_S0': event serial channel 0
> > */
> > /******************************************************************************/
> > void EVN_IFF (void) _task_ EVENT_IFF
> > {
> > while (1)
> > {
> > .
> > .
> > .
> > }
> > }
> >
> > /******************************************************************************/
> > /* Task 3 'EVN_S1': event serial channel 1
> > */
> > /******************************************************************************/
> > void EVN_TTV(void) _task_ EVENT_TTV
> > {
> > while (1)
> > {
> > .
> > .
> > .
> > os_wait (K_TMO, 5, 0); //wait interval: 0.025 second
> > }
> > }
> >
> >
> > Milan
> >
> > ----- Original Message ----- From: "Michal Gregor" <a2x1nptda8 na email.cz>
> > To: "HW-news" <hw-list na list.hw.cz>
> > Sent: Wednesday, January 05, 2011 7:01 PM
> > Subject: Re: Mereni napeti baterie pomoci AVR
> >
> >
> > Neberte to doslova! Mam to rozdelene tak aby se nemuselo nic ukladat,
> > zadny
> > zasobnik, zadne nasilne prepnuti. Rekneme za mi to vezme 10 - 20
> > instrukci v
> > asembleru, v Cecku trochu vic je prece jennom dost nenazrane. Na malych
> > procesorech s par byty RAM a ROM to byla fuska, ale na dnesnich
> > "masinach"
> > kdy se clovek nemusi bibrat s kazdym bytem je to docela sranda:
> >
> > S hlavniho programu poustim nekolik vlaken, jedno po druhem:
> >
> > while(1) {
> > G_Vypisy_Uloha();
> > G_LCD_Uloha();
> > G_Edit_Uloha();
> > Uroven_100mS();
> > Reaguj_Na_Zmenu_Vstupu();
> > Vynuluj_WDT();
> > }
> >
> >
> > Jedno vlakno a jeho ulohy:
> >
> > // Ulohy vlakna Vypisy
> > static enum {
> > Uloha_Zacatek,
> > Uloha_Aktivace,
> > Uloha_Over_Bufer,
> > Uloha_Vytiskni_Zpravu,
> > Uloha_Cekej_Konec_Vysilani
> > } Uloha;
> >
> > Rozdeleni vlakna:
> >
> > void G_Vypisy_Uloha(void) {
> >
> > // Úlohy vlákna
> > switch( Uloha ) {
> >
> > case Uloha_Zacatek:
> > Zacatek();
> > break;
> >
> > case Uloha_Aktivace:
> > Aktivace();
> > break;
> >
> > case Uloha_Over_Bufer:
> > Over_Bufer();
> > break;
> >
> > case Uloha_Vytiskni_Zpravu:
> > Vytiskni_Zpravu();
> > break;
> >
> > case Uloha_Cekej_Konec_Vysilani:
> > Cekej_Konec_Vysilani();
> > break;
> >
> > default:
> > Uloha = Uloha_Zacatek;
> > break;
> > }
> > }
> >
> > Treba vypocet CRC, pocita se vzdy jeden byte zpravy:
> >
> > //***********************************************************
> > static void Spust_Vypocet_CRC (void) {
> >
> > CRC = 0;
> >
> > i_Zprava = i_Zacatek_Vypoctu_CRC;
> >
> > Uloha = Uloha_Spocitej_CRC_Zpravy;
> > }
> > //***********************************************************
> > // Vytvoří CRC zprávy.
> > // Výpočet probihá po jednom byte
> >
> > static void Spocitej_CRC_Zpravy (void) {
> >
> > // Výpočet CRC
> > CRC = G_Pre_Pocitej_CRC_Pc ( G_Kpo_Zprava[ i_Zprava ] , CRC );
> > ++i_Zprava;
> >
> > // Konec zprávy?
> >
> > if ( i_Zprava > I_KONEC_ZPRAVY_CRC ) {
> >
> > // Dokončen výpočet CRC zprávy,
> > // připočítat dva nulové byty
> >
> > CRC = G_Pre_Pocitej_CRC_Pc( 0, CRC );
> > CRC = G_Pre_Pocitej_CRC_Pc( 0, CRC );
> >
> > Uloha = Uloha_Uloz_CRC;
> > }
> > else {
> >
> > // Výpočet pokračuje
> > Uloha = Uloha_Spocitej_CRC_Zpravy;
> > }
> > }
> >
> >
> > Staci si dobre rozdelit program na jednotlive ulohy a jde to samo. A
> > neni to
> > tak slozite, spise se program zjednodusuje.
> >
> > Jasne pokud se bude pracovat treba na vetsim matematickem vypoctu, ktery
> > zabere stovky milisekund a nepujde rozdelit, tak bude treba skutecny
> > RTOS.
> >
> > Michal Gregor
> >
> >
> >
> >
> >
> >
> > ----- Original Message ----- From: "Pavel Troller" <patrol na sinus.cz>
> > To: "HW-news" <hw-list na list.hw.cz>
> > Sent: Wednesday, January 05, 2011 5:06 PM
> > Subject: Re: Mereni napeti baterie pomoci AVR
> >
> >
> > Zdravím,
> > rovněž bych to rád věděl. Operačními systémy se zabývám celkem dlouhou
> > dobu
> > a samozřejmě platí, že čím jednodušší RTOS, tím menší režie context
> > switche,
> > ale nulová - to nebylo ani v případě Z80 a jeho systému zdvojených
> > registrů,
> > takže mezi právě dvěma kontexty se dalo přepínat pomocí EXX ; EX
> > AF,AF' -
> > ale
> > i ty byly tuším 6 clocků každá (možná i více), takže ani tam to nebylo
> > "žádný čas". U Motoroly se dá použít MOVEM.L pro rychlé uložení na
> > zásobník,
> > což jsou instrukce právě optimalizované pro podobný případ, ale i ty si
> > svůj
> > čas vezmou. Jednodušší jednočipáky obvykle nemají žádnou hardwarovou
> > podporu
> > multitaskingu, takže tam se to musí poctivě uložit tam a zpátky. A to
> > nemluvíme
> > o realizaci scheduleru jako takového, který, jakmile má být jen trošku
> > chytřejší než ten nejblbější round-robin, si taky to svoje vezme...
> > Zdraví Pavel.
> >
> >> To sa rad necham poucit ako prepnut vlakno bez rezie.
> >> Pre x51 som si to pisal z polovice sam a:
> >> odkladam registre, plnim ich z noveho vlakna, prehadzujem zasobnik
> >> /bohuzial u x51 musim menit cely, 128B je strasne malo + reentrantny
> >> zasobnik pre funkcie, inak ho staci prestavit/ a nastavim novy PC +
> >> nejake
> >> drobnosti /systemove casovace.../. Odhadom niekolko 100-vak instrukcii.
> >> Systemovy timer bezi kazdych 5ms. A nasilne prepnutie /ked vlakno
> >> neodovzda
> >> procesor -Round-robin alebo tak nejako/ je po 2 tikoch t.j. 10ms.
> >> A vy vravite "ziadny cas" ??? Poradte co robim zle.
> >>
> >>
> >> Milan
> >> ----- Original Message ----- From: "Michal Gregor"
> >> <a2x1nptda8 na email.cz>
> >> To: "HW-news" <hw-list na list.hw.cz>
> >> Sent: Wednesday, January 05, 2011 4:11 PM
> >> Subject: Re: Mereni napeti baterie pomoci AVR
> >>
> >>
> >> Kdyz se to dobre napise, tak prepnuti mezi vlakny nezere zadny cas.
> >>
> >> Michal Gregor
> >>
> >> ----- Original Message ----- From: "Milan" <milger na pobox.sk>
> >> To: "HW-news" <hw-list na list.hw.cz>
> >> Sent: Wednesday, January 05, 2011 3:20 PM
> >> Subject: Re: Mereni napeti baterie pomoci AVR
> >>
> >>
> >> To riesenie s casovacom je taka dobra klasika, to bude komentovat hodne
> >> ludi.
> >> Spomeniem ale riesenie s pouzitim nejakeho RT operacneho systemu, kde
> >> sa
> >> daju zlozitejsie veci, ktore sa neopakuju az tak casto, riesit
> >> samostatnym
> >> vlaknom. Vyhodou je ze nespotrebujete ziadny casovac /teda dokopy iba
> >> jeden
> >> na chod OS/ a aj zlozite algoritmy realizujete efektivne, riesite ich
> >> akoby
> >> samostatne. Nevyhodou to, ze zmysel to ma iba u pomalsich opakovani
> >> /nad
> >> 10ms/ inak su naroky na reziu /prepnutie procesora/ znacne.
> >> To len na rozsirenie obzoru, neviem ako AVR ale na x51 a ARM to hodne
> >> pouzivam, pravdu povediac za poslednych 5 rokov som nemal riesenie, kde
> >> by
> >> v
> >> jednocipe nebezali aspon 3 samostatne vlakna...
> >>
> >> Milan
> >>
> >>
> >> ----- Original Message ----- From: "Michal Grunt"
> >> <michal.grunt na vynet.cz>
> >> To: "HW-news" <hw-list na list.hw.cz>
> >> Sent: Wednesday, January 05, 2011 12:43 PM
> >> Subject: RE: Mereni napeti baterie pomoci AVR
> >>
> >>
> >> Jeste se v teto souvislosti zeptam. Kdybych chtel merit (nebo v
> >> podstate
> >> delat cokoliv) jednou za x jednotek casu (radove vteriny ci desitky
> >> vterin),
> >> to se dela pomoci preruseni? Abych nejakou smyckou delay nezablokoval
> >> cely
> >> program. A dela se to tak, ze nastavim ze se bude preruseni generovat
> >> kazdych x jednotek casu (placnu, preruseni jeste nastudovane nemam,
> >> treba
> >> jednou za 100ms) ja budu v hlavni smycce programu testovat zda se
> >> preruseni
> >> neprovedlo xy krat a pokud ano provedu pozadovany ukon?
> >>
> >> ________________________________________
> >> Odesílatel: hw-list-bounces na list.hw.cz [hw-list-bounces na list.hw.cz] za
> >> uživatele Pavel Hudeček [edizon na seznam.cz]
> >> Odesláno: 4. ledna 2011 23:58
> >> Komu: HW-news
> >> Předmět: RE: Mereni napeti baterie pomoci AVR
> >>
> >> Ano, takto. Hodnoty skoro jakékoli od 1k do 1M, rozumná střední cesta
> >> je
> >> něco kolem 100k. Nebo kdybyste chtěl přejít z vypínače na tlačítko, tak
> >> i
> >> nad 1M, ale možná s tím bude víc práce, neb při velkých hodnotách
> >> můžete
> >> na
> >> některých vstupech dojít k různým kalibračním konstantám pro různé
> >> režimy
> >> činnosti MCU.
> >>
> >> Pak je ještě jedna alternativní možnost, zcela bez ext. součástek: Jako
> >> referenci zvolíte napájení (předpokládám, že je natvrdo připojené ke
> >> článku)
> >> a multiplexer přepnete na pomocnou referenci (má asi 1,23 V), změříte
> >> její
> >> napětí v jednotkách odvozených z napájecího. Pak napájecí napětí
> >> vypočítáte
> >> opačným postupem, než obvykle :-)
> >>
> >>> Od: Michal Grunt <michal.grunt na vynet.cz>
> >>> Jake zhruba hodnoty tech odporu?
> >>>
> >>> AD MCU
> >>> ____ | ____
> >>> Bat --|_R1_|--*--|_R2_|---| gnd
> >>>
> >>> Takto?
> >> _______________________________________________
> >> HW-list mailing list - sponsored by www.HW.cz
> >> Hw-list na list.hw.cz
> >> http://list.hw.cz/mailman/listinfo/hw-list
> >> _______________________________________________
> >> HW-list mailing list - sponsored by www.HW.cz
> >> Hw-list na list.hw.cz
> >> http://list.hw.cz/mailman/listinfo/hw-list
> >>
> >> _______________________________________________
> >> HW-list mailing list - sponsored by www.HW.cz
> >> Hw-list na list.hw.cz
> >> http://list.hw.cz/mailman/listinfo/hw-list
> >>
> >> _______________________________________________
> >> HW-list mailing list - sponsored by www.HW.cz
> >> Hw-list na list.hw.cz
> >> http://list.hw.cz/mailman/listinfo/hw-list
> >> _______________________________________________
> >> HW-list mailing list - sponsored by www.HW.cz
> >> Hw-list na list.hw.cz
> >> http://list.hw.cz/mailman/listinfo/hw-list
> > _______________________________________________
> > HW-list mailing list - sponsored by www.HW.cz
> > Hw-list na list.hw.cz
> > http://list.hw.cz/mailman/listinfo/hw-list
> >
> > _______________________________________________
> > HW-list mailing list - sponsored by www.HW.cz
> > Hw-list na list.hw.cz
> > http://list.hw.cz/mailman/listinfo/hw-list
> >
> > _______________________________________________
> > HW-list mailing list - sponsored by www.HW.cz
> > Hw-list na list.hw.cz
> > http://list.hw.cz/mailman/listinfo/hw-list
> > _______________________________________________
> > HW-list mailing list - sponsored by www.HW.cz
> > Hw-list na list.hw.cz
> > http://list.hw.cz/mailman/listinfo/hw-list
> _______________________________________________
> HW-list mailing list - sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
_______________________________________________
HW-list mailing list - sponsored by www.HW.cz
Hw-list na list.hw.cz
http://list.hw.cz/mailman/listinfo/hw-list
Další informace o konferenci Hw-list