c + pic
Miroslav Draxal
evik na volny.cz
Středa Únor 29 21:41:41 CET 2012
Jak jsem koukal do přeloženého asm, tak prostě melou vše přes FSRx, samo
sebou že to je správný postup. Ale na druhou stranu 12:3 bytum, to je nějak
moc. Hledám zápisy, jak navést kompiler, aby to přeložil co nejkradšeji.
V tomto případě je
MOVF 0x0e,W,ACCESS
ANDLW 0Xea
BNZ 0x82e
Podstatně kratší, než inicializovat rutinu pro načtení adresy přes pointery
(FSRx) a funkce je stejná. Nechce se mi věřit, že by to do kompilátoru
nezapasovali.
Taky jsem si všiml, ze odhadem tak každá 10. instrukce je MOVLB 0, což
samozřejmě vím proč, ale taky by se to dalo hodně optimalizovat. Chtěl jsem
to psát v čistým C, ale jak tak koukám, tak tam bude víc ASM než C.
Ps. Kouknu na ten UNION a dam vědět.
From: hw-list-bounces na list.hw.cz [mailto:hw-list-bounces na list.hw.cz] On
Behalf Of Hynek Sladky
Sent: Wednesday, February 29, 2012 1:35 PM
To: HW-news
Subject: Re: c + pic
Mozna by se struktura musela dat jeste do union, ktera by umoznila bytovy
pristup...
typedef union {
unsigned char b;
struct {
unsigned left:1;
....
Nize uvedeny assembler je IMHO spravne: mam ukazatel a z adresy, kam
ukazuje, se precte byte.
Jeste je otazka, zda toto je spravne reseni. Jestli by nebylo lepsi misto
bitoveho pole pouzit jen bytovou promennou a sadu bitovych masek:
unsigned char keyPress;
#define KEY_LEFT 0x01
#define KEY_RIGHT 0x02
#define KEY_UP 0x04
#define KEY_DOWN 0x08
...
if (keyPress & keyMap) ...
Hynek Sladky
Dne 29.2.2012 13:05, Miroslav Draxal napsal(a):
Dobrý den,
Mejme strukturu o délce 1bytu
----------------------------------------------------------------------------
-------
typedef struct _keyPress_flag
{ unsigned left
:1;
unsigned right
:1;
unsigned up
:1;
unsigned down
:1;
unsigned ok
:1;
unsigned nc1
:1;
unsigned nc2
:1;
unsigned Press
:1;
}_keyPress;
_keyPress keyPress;
uchar* pkeyPress = &keyPress; // bylo typedef unsigned char uchar
if (!(*pkeyPress & keyMap)) // o toto se jedná
c to přeloží jako
uchar* pkeyPress = &keyPress;
0802 0E0E MOVLW 0xe
0804 0100 MOVLB 0
0806 6F1A MOVWF 0x1a, BANKED
0808 0E00 MOVLW 0
080A 6B1B CLRF 0x1b, BANKED
if (!(*pkeyPress & keyMap))
0810 C01A MOVFF 0x1a, 0xfe9
0812 FFE9 NOP
0814 C01B MOVFF 0x1b, 0xfea
0816 FFEA NOP
0818 50EF MOVF 0xfef, W, ACCESS
081A 0BEA ANDLW 0xea
081C E108 BNZ 0x82e
Chodí to to je. Optimalizace podle mě zapnuté všechny. Jak to napsat v C,
pokud to jde, a vyhnout se asm, aby si to přeložilo jako
MOVF 0x0e,W,ACCESS
ANDLW 0Xea
BNZ 0x82e
Je to přeložený v HI-TECH C PRO for the PIC18 MCU Family V9.63PL3 PRO
Díky Míra
__________ Informace od ESET NOD32 Antivirus, verze databaze 6925 (20120229)
__________
Tuto zpravu proveril ESET NOD32 Antivirus.
http://www.eset.cz
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20120229/9e80149c/attachment.htm>
Další informace o konferenci Hw-list