Kviz pri patku, podpasovka v C ?

Pavel Hudecek edizon na seznam.cz
Sobota Listopad 5 16:47:52 CET 2016


Tak samozřejmě blikání s LEDkou je něco jiného a dělá se jinak, obzvláště 
pokud to má být s více najednou, aniž by se jen banálně střídaly.

Ale zas to jde přehledně a hlavně bez přiřazení nekompatibilních proměnných, 
např.:

if (++ledCnt>250) ledCnt=0;
switch (ledCnt) {
    case 0: LED1=1; break;
    case 80: LED1=0; break;
    case 120: LED2=1; break;
    case 200: LED2=0; break;
}

To celé samozřejmě buď v ms přerušení, nebo zas v čekací funkci, v sekci 
začínající
if (msSync==1) { msSync=0; // -----------------

PH

-----Původní zpráva----- 
From: Jiří Nesvačil
Uvedl jsem to na spatnem prikladu pro Vas. Ovsem pokud casujete vice 
udalosti, tak pouhe bitove and-& nestaci. V mem prikladu u scanu klavesnice 
to nevadi, ale jiz jen bliknuti ledkou do rytmu jine ledky Vam udela pulsy 
jinak dlouhe. Nevyhnete se
odecitani. Nebo odecitani promenne do nuly, ale tam zase riskujte pripadne 
vynechani pulsu.

Odecteni dvou promennych Vam a-b tj. kolik nabehano od posledka je asi 
nejrozumnejsi cesta. Jen musite osetrit preteceni uint, aby z toho kompiler 
neudelal signed.

Za me i takova jednoducha vec zjisteni rozdilu casu nemusi byt az tak 
jednoducha, pokud se ma udelat dobre.

Jirka

Dne 5. 11. 2016 v 15:19 Pavel Hudecek napsal(a):
> Osobně používám proměnné různých velikostí a hodně často i 8b. Např. vždy, 
> když tam má být  jen 0 nebo 1 (V CodeVisionu bych použil jednobitový typ 
> bit, ale ten normální C nemá). Někdy je to vyloženě super, např. 8b index 
> pole s 256 položkami dokonale garantuje, že nedojde k zápisu mimo.
>
> Ale udělat to, co je na začátku této diskuse, tedy přiřadit hodnotu, která 
> zjevně může překračovat 255 do 8b proměnné, považuji za prasárnu typu "ale 
> vždyť ono to funguje".
>
> Poznámka: V mých projektech zde probíraná situace běžně nemůže nastat, dal 
> bych to do čekací funkce, do místa, které proběhne ve volném čase, 
> přibližně jednou za ms a tam by pak nejspíš bylo:
> if ((ms & 3)==0) {
> nebo
> if (!(ms & 3)) {
>
> PH
>
> -----Původní zpráva----- From: Jan Waclawek
>> Neuniká, zrovna tahle promìnná mù¾e být klidnì lokální v main(). Spí¹ mì
>> zará¾í proè je 8-bitová. To, ¾e u¹etøí (mo¾ná) 3 byty mu docela
>> zkomplikuje ¾ivot. Asi je to zvyk z 8-bitových èipù.
>
> Skomplikuje zivot??? Zartujete, pan kolega.
>
> Je to velmi dobry zvyk, neplytvat RAM. RAM je cca 6x cennejsia ako FLASH a
> na tomto sa s 32-bitmi nic nezmenilo(*). Je samozrejme treba zvazit
> vykonavaci cas, ale testy tohoto typu (na uplynutie nejakej doby) byvaju v
> UI, kde na tom obvykle az tak nezalezi.
>
> Takze aby sme len tak naprazdno nekecali, v prilohe konkretna 
> implementacia
> a preklad, je to sice akoze pre Cortex-M0+, ale v tomto konkretnom pripade
> tam pre M0 (a asi ani M3/M4/M7) rozdiel nie je. Ako vidite, je tam jedina
> instrukcia naviac, neznamienkove rozsirenie (ktore plni funkciu maskovania
> bytu a zaroven konverzia pre nasledujuce porovnanie). Zhodou okolnosti to
> usetrene miesto v 32-bitovej verzii gcc vyplytvalo na zarovnanie pred
> polom konstant... ;-)
>
> Takze 8-bitova verzia znamena 2 byte FLASH naviac oproti uspore 3 byte 
> RAM,
> co je aj bez toho faktoru uspora. To rozsirenie je v pomerne dlhom
> linearnom kuse kodu takze v drvivej vacsine pripadov bude vdaka prefetchu
> aj pri pomalej FLASH vykonane v 1 cykle, to je asi 12% dlhsie vykonavanie
> (ak berieme do uvahy ze vacsinou dopadne porovnanie false).
>
> wek
>
> (*) Ano je mozne ze pride pamatova revolucia, ale aj napriek prvym
> lastovickam u TI a Fujitsu pre vacsinu sveta este neprisla; a aj kebyze sa
> to v tychto dnoch zlomi, takych zo 10 rokov to este nebude v praxi akutne.
>
> --------
>
> #include <stdint.h>
>
> volatile uint32_t tick;
> volatile uint32_t action;
>
>
> 080000c0 <Ticker8>:
>
> void Ticker8(void) __attribute__((noinline));
> void Ticker8(void) {
>  static uint8_t t8;
>
>  if (((tick - t8) & 0xFF) >= 4) {
> 80000c0: 4906      ldr r1, [pc, #24] ; (80000dc <Ticker8+0x1c>)
> 80000c2: 4a07      ldr r2, [pc, #28] ; (80000e0 <Ticker8+0x20>)
> 80000c4: 680b      ldr r3, [r1, #0]
> 80000c6: 7810      ldrb r0, [r2, #0]
> 80000c8: 1a1b      subs r3, r3, r0
> 80000ca: b2db      uxtb r3, r3
> 80000cc: 2b03      cmp r3, #3
> 80000ce: d904      bls.n 80000da <Ticker8+0x1a>
>    t8 = (uint8_t)tick;
> 80000d0: 680b      ldr r3, [r1, #0]
> 80000d2: 7013      strb r3, [r2, #0]
>    action = 1;
> 80000d4: 2201      movs r2, #1
> 80000d6: 4b03      ldr r3, [pc, #12] ; (80000e4 <Ticker8+0x24>)
> 80000d8: 601a      str r2, [r3, #0]
>  }
> }
> 80000da: 4770      bx lr
> 80000dc: 20000008 .word 0x20000008
> 80000e0: 20000004 .word 0x20000004
> 80000e4: 2000000c .word 0x2000000c
>
> 080000e8 <Ticker32>:
>
> void Ticker32(void) __attribute__((noinline));
> void Ticker32(void) {
>  static uint32_t t32;
>
>  if ((tick - t32) >= 4) {
> 80000e8: 4906      ldr r1, [pc, #24] ; (8000104 <Ticker32+0x1c>)
> 80000ea: 4a07      ldr r2, [pc, #28] ; (8000108 <Ticker32+0x20>)
> 80000ec: 680b      ldr r3, [r1, #0]
> 80000ee: 6810      ldr r0, [r2, #0]
> 80000f0: 1a1b      subs r3, r3, r0
> 80000f2: 2b03      cmp r3, #3
> 80000f4: d904      bls.n 8000100 <Ticker32+0x18>
>    t32 = tick;
> 80000f6: 680b      ldr r3, [r1, #0]
> 80000f8: 6013      str r3, [r2, #0]
>    action = 1;
> 80000fa: 2201      movs r2, #1
> 80000fc: 4b03      ldr r3, [pc, #12] ; (800010c <Ticker32+0x24>)
> 80000fe: 601a      str r2, [r3, #0]
>  }
> }
> 8000100: 4770      bx lr
> 8000102: 46c0      nop ; (mov r8, r8)
> 8000104: 20000008 .word 0x20000008
> 8000108: 20000000 .word 0x20000000
> 800010c: 2000000c .word 0x2000000c
>
>
> _______________________________________________
> 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