Kviz pri patku, podpasovka v C ?
Miroslav Mraz
mrazik na volny.cz
Sobota Listopad 5 12:05:29 CET 2016
Ale vůbec nežertuji. Ušetřit 3 byte RAM a pak použít standardní
periferní knihovny ? A pořád kontrolovat, zda je to správně přetypováno,
zda nevadí přetečení atd. Do toho bych (možná) šel až opravdu při
kritickém nedostatku RAM.
A jak jste psal jinde, vůbec není od věci alokovat dočasné objekty na
zásobníku. Ono je to na jednočipech dost diskutabilní, musíte vědět co
děláte, ale u normálního programu na větším stroji se pak data lépe drží
v cache (zásobník bývá o něco kompaktnější než halda) a tak to může být
i rychlejší. Extrémně - jednovláknová aplikace psaná v C++ může mít
_všechna_ data na stacku a není to o nic méně přehledné ani pomalejší,
než když použiji statické třídy. Ono když se data do toho zásobníku
nevejdou pak se nevejdou ani staticky. Jen se to staticky líp kontroluje
- zařve to už při linkování.
Mrazík
Dne 5.11.2016 v 10:53 Jan Waclawek napsal(a):
>> 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
>
Další informace o konferenci Hw-list