Forum: Mikrocontroller und Digitale Elektronik Mega8 @ 1MHz, Midi IO und Buffer - Performance Probleme


von Chris (Gast)


Lesenswert?

Da ich zu Zeit ein wenig am verzweifeln bin suche ich hier Hilfe um zu 
erfahren, ob ich das ganze einfach falsch angehe oder ob die 
Möglichkeiten eine ATMega 8, laufend mit internem Takt, wirklich schon 
ausgeschöpft sind.

Das Programm ergibt zunächst einmal nicht viel Sinn, da es nur ein Teil 
von dem darstellt, was es mal werden sollte. Im Groben geht es bis jetzt 
darum:

- Midi Daten empfangen
- Schreiben in einen Eingangspuffer
- Sobald mindestens 3 Bytes im Puffer vorhanden sind:
- Schreiben in einen Ausgangspuffer
- Midi Daten wieder versenden

Dabei ist die Art, einen vollen uint8_t als Puffer-Index zu verwenden, 
um sich Abfragen etc. wegen der Rücksprünge auf den Index 0 zu sparen, 
schon mehr als dirty, und das nur, um sich ein paar einfache logische 
Operationen zu sparen ( auskommentiert ).

Anspruchsvollere Midi-Files sind jetzt schon nur mit Compileroptimierung 
auf Geschwindigkeit am Eingang sowie Ausgang identisch, ohne dass es 
merkbare Timingverluste gibt.

Was soll ich noch tun? Hilft wirklich nur eine Erhöhung des Taktes ?
1
/* MIDI RECEIVE AND TRANSMIT WITH BUFFERS */
2
3
#include <avr/io.h>
4
#include <avr/interrupt.h>
5
#include <stdint.h>
6
7
void midi_init(void);
8
void TXbuf_to_UDR(void);
9
void SEND(uint8_t byte1, uint8_t byte2, uint8_t byte3);
10
11
12
/* Transmit Buffer */
13
14
volatile uint8_t TXbuf[256];
15
volatile uint8_t TXbuf_write_pointer=0;
16
volatile uint8_t TXbuf_read_pointer=0;
17
18
/* Receive Buffer */
19
20
volatile uint8_t RXbuf[256];
21
volatile uint8_t RXbuf_write_pointer=0;
22
volatile uint8_t RXbuf_read_pointer=0;
23
24
25
26
int main(void)
27
{
28
    sei();                  // Global Interupt Enable
29
  midi_init();
30
  
31
  uint8_t byte1, byte2, byte3;  
32
33
34
  while (1)
35
  {
36
    if ((abs(RXbuf_write_pointer - RXbuf_read_pointer))>2)
37
    {
38
39
    byte1=RXbuf[RXbuf_read_pointer];  // Read 3 bytes of receive buffer
40
    RXbuf_read_pointer++;
41
    //RXbuf_read_pointer &= 63;
42
43
    byte2=RXbuf[RXbuf_read_pointer];
44
    RXbuf_read_pointer++;
45
    //RXbuf_read_pointer &= 63;
46
47
    byte3=RXbuf[RXbuf_read_pointer];
48
    RXbuf_read_pointer++;
49
    //RXbuf_read_pointer &= 63;
50
    
51
    SEND(byte1,byte2,byte3);  
52
    
53
    }    
54
  }
55
}
56
57
58
void SEND(uint8_t byte1, uint8_t byte2, uint8_t byte3)
59
{
60
  TXbuf[TXbuf_write_pointer]=byte1;    // Write 3 bytes to transmit buffer
61
  TXbuf_write_pointer++;
62
  //TXbuf_write_pointer &= 63;    
63
64
  TXbuf[TXbuf_write_pointer]=byte2;
65
  TXbuf_write_pointer++;
66
  //TXbuf_write_pointer &= 63;  
67
68
  TXbuf[TXbuf_write_pointer]=byte3;
69
  TXbuf_write_pointer++;
70
  //TXbuf_write_pointer &= 63;
71
72
  UCSRB |= (1<<UDRIE);          // UDR Empty Interupt enable
73
}
74
75
76
void midi_init(void)                // settings for MIDI
77
{  
78
  
79
  UCSRC |= (1<<UCSZ1) | (1<<UCSZ0);         // 8 Data Bits
80
81
  UBRRH = 0;
82
  UBRRL=1;                    // 32500 BAUD
83
  
84
  UCSRB |= (1<<RXCIE) | (1<<RXEN) | (1<<TXEN);  // reciever and transmitter enable, receive interupt enable
85
  
86
}
87
88
89
90
ISR (USART_RXC_vect)          // receive interupt
91
{
92
  RXbuf[RXbuf_write_pointer] = UDR;
93
  RXbuf_write_pointer++;
94
  //RXbuf_write_pointer &= 63;
95
}
96
97
98
99
ISR (USART_UDRE_vect)          // UDR emty interupt      
100
{
101
  TXbuf_to_UDR();
102
}
103
104
105
void TXbuf_to_UDR(void)        // write 1 byte of transmit buffer to UDR
106
{
107
  
108
  UCSRB &= (~(1<<UDRIE));      // UDR emty interupt disable
109
  
110
  if (TXbuf_read_pointer ^ TXbuf_write_pointer)    // if size of buffer != 0
111
  {
112
  UDR=TXbuf[TXbuf_read_pointer];
113
  TXbuf_read_pointer++;
114
  //TXbuf_read_pointer &= 127;
115
  
116
  UCSRB |= (1<<UDRIE);      // UDR emty interupt enable
117
  }
118
119
}

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.