AVR - struktura v PROGMEM
Jan Waclawek
konfera@efton.sk
Středa Listopad 11 09:16:41 CET 2009
>Jo sorry, myslel jsem, ze se nic jinego, nez AVR-GCC nepouziva ;-)
>Jen me to trosku prekvapilo, uz jsem s tim dlouho nic nedelal a povazoval
>jsem to za automaticke. No nakonec jsem dal tabulku do SRAM, protoze jde jen
>o nejaky pokus a pameti je dost. Jen me prekvapilo, ze prekladac to v pohode
>prelozil blbe
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) {
}
More information about the Hw-list
mailing list