Kviz pri patku, podpasovka v C ?

Jan Waclawek konfera na efton.sk
Sobota Listopad 5 10:53:14 CET 2016


>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