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