Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

масив от указатели към ф-ии в прог. памет
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=12500
Страница 1 от 1

Автор:  vgeorgiev [ Нед Дек 01, 2013 7:48 pm ]
Заглавие:  масив от указатели към ф-ии в прог. памет

Здравейте,

Имам този масив от указатели към функции:
Код:
static void (*optable[256])() = {   
/*        |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  8  |  9  |  A  |  B  |  C  |  D  |  E  |  F  |      */
/* 0 */      brk,  ora,  nop,  slo,  nop,  ora,  asl,  slo,  php,  ora,  asl,  nop,  nop,  ora,  asl,  slo, /* 0 */
/* 1 */      bpl,  ora,  nop,  slo,  nop,  ora,  asl,  slo,  clc,  ora,  nop,  slo,  nop,  ora,  asl,  slo, /* 1 */
/* 2 */      jsr,  and,  nop,  rla,  bit,  and,  rol,  rla,  plp,  and,  rol,  nop,  bit,  and,  rol,  rla, /* 2 */
/* 3 */      bmi,  and,  nop,  rla,  nop,  and,  rol,  rla,  sec,  and,  nop,  rla,  nop,  and,  rol,  rla, /* 3 */
/* 4 */      rti,  eor,  nop,  sre,  nop,  eor,  lsr,  sre,  pha,  eor,  lsr,  nop,  jmp,  eor,  lsr,  sre, /* 4 */
/* 5 */      bvc,  eor,  nop,  sre,  nop,  eor,  lsr,  sre,  cli,  eor,  nop,  sre,  nop,  eor,  lsr,  sre, /* 5 */
/* 6 */      rts,  adc,  nop,  rra,  nop,  adc,  ror,  rra,  pla,  adc,  ror,  nop,  jmp,  adc,  ror,  rra, /* 6 */
/* 7 */      bvs,  adc,  nop,  rra,  nop,  adc,  ror,  rra,  sei,  adc,  nop,  rra,  nop,  adc,  ror,  rra, /* 7 */
/* 8 */      nop,  sta,  nop,  sax,  sty,  sta,  stx,  sax,  dey,  nop,  txa,  nop,  sty,  sta,  stx,  sax, /* 8 */
/* 9 */      bcc,  sta,  nop,  nop,  sty,  sta,  stx,  sax,  tya,  sta,  txs,  nop,  nop,  sta,  nop,  nop, /* 9 */
/* A */      ldy,  lda,  ldx,  lax,  ldy,  lda,  ldx,  lax,  tay,  lda,  tax,  nop,  ldy,  lda,  ldx,  lax, /* A */
/* B */      bcs,  lda,  nop,  lax,  ldy,  lda,  ldx,  lax,  clv,  lda,  tsx,  lax,  ldy,  lda,  ldx,  lax, /* B */
/* C */      cpy,  cmp,  nop,  dcp,  cpy,  cmp,  dec,  dcp,  iny,  cmp,  dex,  nop,  cpy,  cmp,  dec,  dcp, /* C */
/* D */      bne,  cmp,  nop,  dcp,  nop,  cmp,  dec,  dcp,  cld,  cmp,  nop,  dcp,  nop,  cmp,  dec,  dcp, /* D */
/* E */      cpx,  sbc,  nop,  isb,  cpx,  sbc,  inc,  isb,  inx,  sbc,  nop,  sbc,  cpx,  sbc,  inc,  isb, /* E */
/* F */      beq,  sbc,  nop,  isb,  nop,  sbc,  inc,  isb,  sed,  sbc,  nop,  isb,  nop,  sbc,  inc,  isb  /* F */
};


Викам съответната ф-я така:
Код:
        (*optable[opcode])();


Ето и една ф-я:
Код:
static void lda() {
    penaltyop = 1;
    value = getvalue();
    a = (uint8_t)(value & 0x00FF);

    zerocalc(a);
    signcalc(a);
}



Проблема е следния:
правя масива да е в прог.памет
Код:
static const void (*optable[256])() PROGMEM= {   


И имам следната грешка:
Код:
Error   514   invalid type argument of unary '*' (have 'int')   D:\6502\emu\6502_pc\6502_pc\c6502_cpu.c   840   4   6502_pc


плюс уорнинг за всяка стойност от масива
Код:
Warning   3   (near initialization for 'optable[0]') [enabled by default]   D:\6502\emu\6502_pc\6502_pc\c6502_cpu.c   760   14   6502_pc


Някакви идеи ?

Автор:  Vesko [ Нед Дек 01, 2013 9:08 pm ]
Заглавие:  Re: масив от указатели към ф-ии в прог. памет

typedef void (*funcptr_t)(void);

static const funcptr_t optable[256] = {nop};


Така optable е в .rodata сегмента.

Автор:  vgeorgiev [ Нед Дек 01, 2013 11:07 pm ]
Заглавие:  Re: масив от указатели към ф-ии в прог. памет

Бях близо.

Код:
  typedef void (*FPtr)(void); 
  FPtr Key_Protab[] PROGMEM = { keypro1, keypro2, keypro3 };
 
and to call,

  FPtr ptr = (FPtr) pgm_read_word(&Key_Protab[functionID]); 
  ptr();


http://lists.gnu.org/archive/html/avr-gcc-list/2004-02/msg00191.html

Автор:  ike [ Пон Дек 02, 2013 12:42 am ]
Заглавие:  Re: масив от указатели към ф-ии в прог. памет

Малко офф-топик.
Това 6502 емулатор за AVRMEGA ли е?

Автор:  vgeorgiev [ Пон Дек 02, 2013 10:54 am ]
Заглавие:  Re: масив от указатели към ф-ии в прог. памет

ike написа:
Малко офф-топик.
Това 6502 емулатор за AVRMEGA ли е?

Беше на чисто C. Заредих му един ром и тръгна.
Направих го за атмега. Сега ще закача малко SPI рам и SPI eeprom и ще видим какво ще стане.
Снощи го подкарах само с NOP-ове и преброи всичките адреси.

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/