AVR - struktura v PROGMEM

Jaroslav Buchta jaroslav.buchta@gmail.com
Středa Listopad 11 09:39:21 CET 2009


Diky, jestli to bude nakonec smerovat k finalnimu stavu, aspon nemusim tuto
optimalizaci vymyslet ;-) 
... A ja to tam dam rovnou :-)
... A je to tam, preklad vypada dobre, odpoledne zkusim. Ona ta tabulka bude
podstatne vetsi, tohle je jen na zkousku. Bohuzel mam signaly rozhazene po
vsech portech, ale aspon je to univerzalni.
To GID (#define GID		asm("CLI")) je asi v ISR zbytecne, ze? Uz
ale nevim, proc jsem to tam kdysi daval...

-----Original Message-----
From: hw-list-bounces@list.hw.cz [mailto:hw-list-bounces@list.hw.cz] On
Behalf Of Jan Waclawek
Sent: Wednesday, November 11, 2009 9:17 AM
To: HW-news
Subject: RE: AVR - struktura v PROGMEM


Este raz: prekladac to prelozil dobre. Toto je jedna z dani za to, ze gcc
nie je prekladac urceny pre jednocipy, ale pre "velke" procesory, ktore su
navonok vyhradne von Neumannovske. Proste prekladac nie je pripraveny
rozoznavat rozne druhy pamati, s roznym sposobom pristupu; tie makra a
funkcie z pgmspace.h su vlastne vsetko obchadzanim toho problemu.

Dole je upraveny Vas kusok (doplneny tak aby bol prelozitelny). Rozdiel vo
vyslednom binari je nepatrny: toto je original:\


  24 0012 E091 0000 		lds r30,timIdxSeq
  25 0016 83E0      		ldi r24,lo8(3)
  26 0018 E89F      		mul r30,r24
  27 001a F001      		movw r30,r0
  28 001c 1124      		clr r1
  29 001e E050      		subi r30,lo8(-(OutSeq))
  30 0020 F040      		sbci r31,hi8(-(OutSeq))
  31 0022 88B3      		in r24,56-0x20
  32 0024 897F      		andi r24,lo8(-7)
  33 0026 9081      		ld r25,Z
  34 0028 892B      		or r24,r25
  35 002a 88BB      		out 56-0x20,r24
  36 002c 85B3      		in r24,53-0x20
  37 002e 807C      		andi r24,lo8(-64)
  38 0030 9181      		ldd r25,Z+1
  39 0032 892B      		or r24,r25
  40 0034 85BB      		out 53-0x20,r24
  41 0036 82B3      		in r24,50-0x20
  42 0038 8370      		andi r24,lo8(3)
  43 003a 9281      		ldd r25,Z+2
  44 003c 892B      		or r24,r25
  45 003e 82BB      		out 50-0x20,r24


a toto je upravena verzia

  24 0012 E091 0000 		lds r30,timIdxSeq
  25 0016 83E0      		ldi r24,lo8(3)
  26 0018 E89F      		mul r30,r24
  27 001a F001      		movw r30,r0
  28 001c 1124      		clr r1
  29 001e E050      		subi r30,lo8(-(OutSeq))
  30 0020 F040      		sbci r31,hi8(-(OutSeq))
  31 0022 85B1      		in r24,37-0x20
  32               	/* #APP */
  33 0024 9491      		lpm r25, Z
  34               		
  35               	/* #NOAPP */
  36 0026 897F      		andi r24,lo8(-7)
  37 0028 982B      		or r25,r24
  38 002a 95B9      		out 37-0x20,r25
  39 002c 98B1      		in r25,40-0x20
  40 002e 3196      		adiw r30,1
  41               	/* #APP */
  42 0030 8491      		lpm r24, Z
  43               		
  44               	/* #NOAPP */
  45 0032 907C      		andi r25,lo8(-64)
  46 0034 892B      		or r24,r25
  47 0036 88B9      		out 40-0x20,r24
  48 0038 8BB1      		in r24,43-0x20
  49 003a 3196      		adiw r30,1
  50               	/* #APP */
  51 003c E491      		lpm r30, Z
  52               		
  53               	/* #NOAPP */
  54 003e 8370      		andi r24,lo8(3)
  55 0040 E82B      		or r30,r24
  56 0042 EBB9      		out 43-0x20,r30



wek




#include <stdint.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>

#define BYTE uint8_t
#define WORD uint16_t
#define GID
volatile uint8_t CommRxTimer;


typedef struct _OUTSEQ {
  BYTE pb;
  BYTE pc;
  BYTE pd;
} OUTSEQ;



#define MASKSEQ_B  0x06
#define MASKSEQ_C  0x3f
#define MASKSEQ_D  0xfc


const OUTSEQ PROGMEM OutSeq[] = {   // tady byl attribut PROGMEM
  {0x00, 0x00, 0x04},
  {0x00, 0x00, 0x08},
  {0x00, 0x00, 0x10},
  {0x00, 0x00, 0x20},
  {0x00, 0x00, 0x40},
  {0x00, 0x00, 0x80}
};


volatile WORD ticks1ms=0;
volatile BYTE   ticksIlv=0;

volatile BYTE tim10ms_1 = 0;
volatile BYTE   timIdxSeq = 0;
ISR(TIMER1_CAPT_vect)
{
  GID;
  const OUTSEQ  *ps  = &OutSeq[timIdxSeq];
  PORTB = (PORTB & ~MASKSEQ_B) | pgm_read_byte(&(ps->pb));
  PORTC = (PORTC & ~MASKSEQ_C) | pgm_read_byte(&(ps->pc));
  PORTD = (PORTD & ~MASKSEQ_D) | pgm_read_byte(&(ps->pd));

  if (++timIdxSeq >= sizeof(OutSeq)/sizeof(OutSeq[0])) timIdxSeq = 0;

  ticks1ms++;
  if (ticksIlv-- == 0)
  { // low precision timming counters
    ticksIlv = 9;
    if (tim10ms_1 != 0) tim10ms_1--;
  }
  if (CommRxTimer != 0) CommRxTimer--;  // serial communication Rx timer }


int main(void) {
}

_______________________________________________
HW-list mailing list  -  sponsored by www.HW.cz Hw-list@list.hw.cz
http://list.hw.cz/mailman/listinfo/hw-list



More information about the Hw-list mailing list