Forum: Mikrocontroller und Digitale Elektronik MCU (ds30F6012A) defekt?


von Patrick B. (p51d)


Lesenswert?

Hallo miteinander

Heute hatte ich eine neue, wirklich interessante Eigenschaft des MCUs 
entdekt:
1
static unsigned int16 NUM = 0;                           // Anzahl zu übertragenden Werte
2
static unsigned int1 num_teil = 0;                       // 16Bit Anzahl zusammensetzen
3
static int8 index_rxBuf_R = 0;                           // Index of last write RX-Buffer 
4
static int8 index_rxBuf_W = 0;                           // Index of last read RX-Buffer
5
static unsigned int8 rxBuf[rxBuf_max + 1];               // RX-Buffer
6
7
void usart_rx(void){                                     // read function (polling)
8
   if(input_state(RX) == 0){                             // if new data in the FTDI buffer 
9
      if(index_rxBuf_W == rxBuf_max){                    // ringbuffer
10
         index_rxBuf_W = 0;
11
      }
12
      else{
13
         index_rxBuf_W ++;
14
      }
15
16
// take datas and set it dynamic in the buffer
17
      DDR_in;
18
      output_low(RD);                                    // read data
19
      rxBuf[index_rxBuf_W] = DATA_in;                    // store data
20
      output_high(RD);                                   // read finished
21
      DDR_out;
22
   }
23
}
24
25
switch (num_teil){                                 // 2 8Bit Werte zu 16 Bit Wert zusammensetzen
26
   case 0:
27
      NUM = (rxBuf[index_rxBuf_R] << 8);
28
      num_teil = 1;
29
      break;
30
   
31
   case 1:
32
      NUM |= rxBuf[index_rxBuf_R];
33
      RS232_state = waitPAR;
34
      num_teil = 0;
35
printf(txBuf_Write,"%d\n",rxBuf[index_rxBuf_R]);
36
printf(txBuf_Write,"%d\n",NUM);
37
      break;
38
}
39
break;

Die erste Ausgabe des Printfs ist 126, der Wert (007E) den ich sende.
NUM ist im case0 auch noch 0, beim "betreten" des case1 immer noch 0 und 
bei der Ausgabe dann 9086.
Selbst wenn ich ie Oder-Verknüpfung so mache:
1
NUM = ((NUM & 0xFF00) | rxBuf[index_rxBuf_R]);
Der Ausgegebene Wert für NUM ist immer 9086 anstelle 126.
Habe ich irgendwo einen Fehler oder kann der MCU keine Solche 
Operationen mehr richtig machen. Bis jetzt ist das der einzige 
Problempunkt, der Rest des Kommunikations-Switches macht er normal (bis 
zu der NUM-Stelle)

besten Dank für die Hilfe
Patrick

von holger (Gast)


Lesenswert?

>static unsigned int1 num_teil = 0;                       // 16Bit Anzahl

Was ist ein int1 ?

>      NUM = (rxBuf[index_rxBuf_R] << 8);

      NUM = ((unsigned int16)rxBuf[index_rxBuf_R] << 8);

>      NUM |= rxBuf[index_rxBuf_R];

Versuchs so
      NUM += rxBuf[index_rxBuf_R];

Die Compiler von Mchip haben immer irgendwo Macken;)

von Patrick B. (p51d)


Lesenswert?

holger schrieb:
>>static unsigned int1 num_teil = 0;                       // 16Bit Anzahl
>
> Was ist ein int1 ?
ist eine Bool-Variable mit nur einem Bit


>>      NUM = (rxBuf[index_rxBuf_R] << 8);
>
>       NUM = ((unsigned int16)rxBuf[index_rxBuf_R] << 8);
>
>>      NUM |= rxBuf[index_rxBuf_R];
>
> Versuchs so
>       NUM += rxBuf[index_rxBuf_R];
>
> Die Compiler von Mchip haben immer irgendwo Macken;)
Da ist nicht Microchip schuld, sonder CCS. Das sind 2 Verschiedene 
Firmen..

Was ist der Unterschied in diesem Fall zwischen |= und +=? Bis anhin hat 
diese Zeile auch funktioniert.

MFG
Patrick

von Michael H. (morph1)


Lesenswert?

Will ich wohl meinen, der aktuelle dsPIC Compiler von microchip ist ein 
GCC ;) Wer da den CCS nutzt, dem kann man nicht helfen :D

Ne im ernst, ist das echt der ganze Quelltext?

von Patrick B. (p51d)


Lesenswert?

Michael H. schrieb:
> Will ich wohl meinen, der aktuelle dsPIC Compiler von microchip ist ein
> GCC ;) Wer da den CCS nutzt, dem kann man nicht helfen :D

?? Microchip hat einen GCC für die dsPIC?
Wie sieht bei dem die Code-Optimierung aus? generiert er aus einem 
Switch MIT defualt-cases und beliebigen Case eine Jump-Tabelle?

> Ne im ernst, ist das echt der ganze Quelltext?

Nein, ich hatte nur gerade die betreffende Stelle gepostet, da wie du 
sehen kannst, nur die RS232 Funktion recht gross ist.
Ich arbeite mit einem FT245 zur USB-Wandlung. Daher alles Parallel und 
mit maximaler Geschwindigkeit. Habe nirgends irgendwo mühsame Delays, 
aber beim CCS wird momentan der Switch mit if-else if interpretiert, was 
sehr viel wertvolle Zeit kostet: 660us für 126 Bytes @ 120MHz von 
benötigten <=450us.
Hier sind mal die Kommunikations-Funktionen:
1
#define  DDR_in               set_tris_b(0xFFFF)
2
#define  DDR_out              set_tris_b(0xF000)
3
#define  DATA_in              input_b()
4
#define  DATA_out(value)      output_b(value)
5
6
// ASCII control commands
7
#define  SOH                  0x01
8
#define  ENQ                  0x05                          // Enq
9
#define  ACK                  0x06                          // ACK
10
#define  NACK                 0x15                          // NACK
11
#define  BEL                  0x07                          // "Warnglocke"
12
#define  EOT                  0x04
13
#define  temp                 0xAA                          // Überhizung
14
15
// RS232 steps
16
#define  waitENQ              0
17
#define  waitSOH              1
18
#define  waitCMD              2
19
#define  waitNUM              3
20
#define  waitPAR              4
21
   #define  waitRED              0
22
   #define  waitGREEN            1
23
   #define  waitBLUE             2
24
   #define  waitAX1              3
25
   #define  waitAX2              4
26
   #define  waitAX3              5
27
#define  waitACK              5
28
#define  waitEOT              6
29
30
// Programm-defines
31
#define  STREAM               0x11
32
#define  STOP                 0x22
33
#define  Stream_buf_max       1000                          // Maximale Buffer-Grösse
34
35
unsigned int8 command = STOP;
36
unsigned int16 x_achse_buf[Stream_buf_max];                                       // X-Achsen Werte
37
unsigned int16 y_achse_buf[Stream_buf_max];                                       // Y-Achsen Werte
38
unsigned int8 red_buf[Stream_buf_max];                                      // RGB Werte
39
unsigned int8 green_buf[Stream_buf_max];
40
unsigned int8 blue_buf[Stream_buf_max];
41
42
//*****************************************************************************
43
// Definitionen
44
#define TXE                PIN_F6                        // Transmitt-enabmle pin
45
#define WR                 PIN_F4                        // Write pin (high peak)
46
#define RX                 PIN_D11                       // Receive data Pin
47
#define RD                 PIN_F3                        // Read pin (during read low)
48
#define PWREN              PIN_F5                        // configurations-status
49
50
#define rxBuf_max          50                            // buffer size
51
static int8 index_rxBuf_R = 0;                           // Index of last write RX-Buffer 
52
static int8 index_rxBuf_W = 0;                           // Index of last read RX-Buffer
53
static unsigned int8 rxBuf[rxBuf_max + 1];               // RX-Buffer
54
#define txBuf_max          50                            // buffer size
55
static int8 index_txBuf_R = 0;                           // Index to write TX-Buffer 
56
static int8 index_txBuf_W = 0;                           // Index to read TX-Buffer
57
static unsigned int8 txBuf[txBuf_max + 1];               // TX-Buffer
58
//*****************************************************************************
59
// Functions
60
//=========== INIT ====================================
61
void ft245_init(void){
62
   int8 i = 0;
63
   unsigned int8 blink_cnt = 0;
64
   
65
   output_high(RD);                                      // set control-pins
66
   output_low(WR);
67
   
68
   for(i=0;i<=txBuf_max;i++){                            // clear buffers
69
      txBuf[i] = 0;
70
   }
71
   i = 0;
72
   for(i=0;i<=rxBuf_max;i++){
73
      rxBuf[i] = 0;
74
   }
75
   
76
   while(input_state(PWREN) == 1){                       // wait until the USB FTDI-configuration
77
      if(blink_cnt >= 250){                              // Blaue LED mit 4Hz blinken
78
         output_toggle(LED_blue);
79
         blink_cnt = 0;
80
      }
81
      blink_cnt ++;
82
      delay_ms(1);
83
   }
84
}
85
//=========== TX ====================================
86
// if no new data, return / need to calls in the main
87
void usart_tx(void){                                     // send-function
88
   if(input_state(TXE) == 0){                            // if sending possible
89
   
90
      if(index_txBuf_R == index_txBuf_W){                // no new data => return
91
         return;
92
      }
93
      if(index_txBuf_R == txBuf_max){                    // ringbuffer
94
         index_txBuf_R = 0;
95
      }
96
      else{
97
         index_txBuf_R ++;
98
      }
99
    
100
      DATA_out(txBuf[index_txBuf_R]);                    // write datas to the ftdi
101
      output_high(WR);                                   // new data available
102
      output_low(WR);
103
   }
104
}
105
void txBuf_write(int8 parameter){                        // TX buffer handling
106
   if(index_txBuf_W == txBuf_max){                       // ringbuffer
107
      index_txBuf_W = 0;
108
   }
109
   else{
110
      index_txBuf_W ++;
111
   }
112
   txBuf[index_txBuf_W] = parameter;
113
}
114
//=========== RX ====================================
115
// need to calls in the main
116
void usart_rx(void){                                     // read function (polling)
117
   if(input_state(RX) == 0){                             // if new data in the FTDI buffer 
118
      if(index_rxBuf_W == rxBuf_max){                    // ringbuffer
119
         index_rxBuf_W = 0;
120
      }
121
      else{
122
         index_rxBuf_W ++;
123
      }
124
125
// take datas and set it dynamic in the buffer
126
      DDR_in;
127
      output_low(RD);                                    // read data
128
      rxBuf[index_rxBuf_W] = DATA_in;                    // store data
129
      output_high(RD);                                   // read finished
130
      DDR_out;
131
   }
132
}
133
134
void RS232(void){
135
   static unsigned int8 RS232_state = 0;                    // Protokollstatus
136
   static unsigned int16 index_par = 0;                     // Array-Variable für Parameters
137
   static unsigned int16 NUM = 0;                           // Anzahl zu übertragenden Werte
138
   static unsigned int1 num_teil = 0;                       // 16Bit Anzahl zusammensetzen
139
   static unsigned int16 k = 0;                             // Speichervariable für Steuerung
140
   static unsigned int8 PAR_state = 0;
141
   static unsigned int8 temp_cmd = 0;
142
unsigned int16 a,i;   
143
   usart_tx();                                              // Wenn Daten im TX-Buffer, senden       
144
   usart_rx();                                              // Wenn Daten im FTDI-Buffer, entgegennehmen
145
146
   if(index_rxBuf_W == index_rxBuf_R){                      // Buffer Error abgleichen
147
      return;                                               // Wenn keine neuen Daten => aus Funktion heraus springen
148
   }
149
   if(index_rxBuf_R == rxBuf_max){                          // Erhöhen
150
      index_rxBuf_R = 0;
151
   }
152
   else{
153
      index_rxBuf_R ++;
154
   }
155
   
156
   switch (RS232_state){       
157
      case waitENQ:
158
         switch (rxBuf[index_rxBuf_R]){
159
            case '?':                                       // Suche der LCU
160
               printf(txBuf_Write,"USB LCU");
161
               output_high(LED_green);
162
               break;
163
               
164
            case ENQ:
165
               RS232_state = waitSOH;                       // In nächsten State wechselnd
166
               txBuf_Write(ACK);
167
               break;
168
               
169
            default:
170
               txBuf_Write(rxBuf[index_rxBuf_R]);           // Unbekanter Befehl zurückgeben
171
               break;
172
         }
173
         break;
174
         
175
      case waitSOH:                                         // Header der Übertragung
176
         switch (rxBuf[index_rxBuf_R]){
177
            case SOH:
178
               RS232_state = waitCMD;
179
               break;
180
         
181
            default:
182
               RS232_state = waitENQ;
183
               txBuf_Write(NACK);
184
               break;
185
         }
186
         break;
187
         
188
      case waitCMD:                                         // Kommando
189
         switch (rxBuf[index_rxBuf_R]){
190
            case STREAM:                                    // Werte streamen
191
               RS232_state = waitNUM;
192
               temp_cmd = rxBuf[index_rxBuf_R];
193
               break;
194
               
195
            case STOP:                                      // Projektor aus
196
               command = rxBuf[index_rxBuf_R];
197
               txBuf_Write(ACK);
198
               RS232_state = waitACK;
199
               break;
200
               
201
            case 0x01:                                      // Show 1
202
               command = rxBuf[index_rxBuf_R];
203
               txBuf_Write(ACK);
204
               RS232_state = waitACK;
205
               break;
206
case 0x02:
207
   for(i=0;i<1000;i++){
208
      printf(txBuf_Write,"%d\n",x_achse_buf[i]);
209
      printf(txBuf_Write,"%d\n",y_achse_buf[i]);
210
      printf(txBuf_Write,"%d\n",red_buf[i]);
211
      printf(txBuf_Write,"%d\n",green_buf[i]);
212
      printf(txBuf_Write,"%d\n\n",blue_buf[i]);
213
      for(a=0;a<10;a++) usart_tx();
214
   }
215
   txBuf_Write(ACK);
216
   RS232_state = waitACK;
217
   break;
218
            default:
219
               RS232_state = waitENQ;
220
               txBuf_Write(NACK);
221
               command = 0;
222
               break;
223
         }
224
         break;
225
         
226
      case waitNUM:                                         // Anzahl zu empfangender Werte in 16 Bit
227
         switch (num_teil){                                 // 2 8Bit Werte zu 16 Bit Wert zusammensetzen
228
            case 0:
229
               NUM = (rxBuf[index_rxBuf_R] << 8);
230
               num_teil = 1;
231
               break;
232
            
233
            case 1:
234
               NUM |= rxBuf[index_rxBuf_R];
235
               RS232_state = waitPAR;
236
               num_teil = 0;
237
         printf(txBuf_Write,"%d\n",rxBuf[index_rxBuf_R]);
238
         printf(txBuf_Write,"%d\n",NUM);
239
               break;
240
         }
241
         break;
242
243
      case waitPAR:
244
         index_par ++;
245
         switch(PAR_state){                                 // Werte in Ausgabe-Arrays speichern
246
            case waitRED:
247
               red_buf[k] = rxBuf[index_rxBuf_R];
248
               PAR_state = waitGREEN;
249
output_high(LED_red);
250
               break;
251
               
252
            case waitGREEN:
253
               green_buf[k] = rxBuf[index_rxBuf_R];
254
               PAR_state = waitBLUE;
255
               break;
256
               
257
            case waitBLUE:
258
               blue_buf[k] = rxBuf[index_rxBuf_R];
259
               PAR_state = waitAX1;
260
               break;
261
               
262
            case waitAX1:
263
               x_achse_buf[k] = (rxBuf[index_rxBuf_R] << 4);
264
               PAR_state = waitAX2;
265
               break;
266
               
267
            case waitAX2:
268
               x_achse_buf[k] |= (rxBuf[index_rxBuf_R] >> 4);               
269
               y_achse_buf[k] = ((rxBuf[index_rxBuf_R] & 0x0F) << 8);
270
               PAR_state = waitAX3;
271
               break;
272
               
273
            case waitAX3:   
274
               y_achse_buf[k] |= rxBuf[index_rxBuf_R];
275
               if(k == (Stream_buf_max - 1))                // Ringbuffer Steuerung
276
                  k = 0;
277
               else
278
                  k ++;
279
               PAR_state = waitRED;             
280
               if(index_par == NUM){
281
                  RS232_state = waitACK;
282
                  txBuf_Write(ACK);
283
                  index_par = 0;
284
output_low(LED_red);
285
               }
286
               break;
287
         }
288
         break; 
289
         
290
      case waitACK:
291
         if(rxBuf[index_rxBuf_R] == ACK){                   // ACK empfangen, 
292
            RS232_state = waitEOT;
293
         }
294
         break; 
295
         
296
      case waitEOT:                                         // Übertragung beendet
297
         if(rxBuf[index_rxBuf_R] == EOT){
298
            RS232_state = waitENQ;
299
            if(temp_cmd == STREAM){
300
//              command = temp_cmd;
301
               temp_cmd = 0;
302
            }
303
         }
304
         break;
305
         
306
      default:                                              // Default
307
         RS232_state = waitENQ;
308
         txBuf_Write(NACK);
309
         break;
310
   }
311
}

Variablen-mix ist mir nicht aufgefallen, daher meine Verwirrniss.

MFG
P51D

von holger (Gast)


Lesenswert?

>> Was ist ein int1 ?
>ist eine Bool-Variable mit nur einem Bit

Danke, man lernt nie aus;)

>Was ist der Unterschied in diesem Fall zwischen |= und +=? Bis anhin hat
>diese Zeile auch funktioniert.

Ein ODER macht nicht unbedingt das gleiche wie ein Plus.
Ist aber wohl nicht das Problem.

>NUM beim "betreten" des case1 immer noch 0 und
>bei der Ausgabe dann 9086.
>Selbst wenn ich ie Oder-Verknüpfung so mache:

>NUM = ((NUM & 0xFF00) | rxBuf[index_rxBuf_R]);

Das ODER ist das Problem.
9086 = 0x237E

Das Lowbyte stimmt also. Aber wo kommt die 0x23 her?
Da macht der CCS wohl den Fehler. Er betrachtet rxBuf[index_rxBuf_R]
an der Stelle wohl nicht als int8.

Einfach mal casten:

     NUM |= (int8)rxBuf[index_rxBuf_R];

vieleicht gehts ja dann?

von holger (Gast)


Lesenswert?

>Einfach mal casten:

>     NUM |= (int8)rxBuf[index_rxBuf_R];

So natürlich:(

     NUM |= (unsigned int8)rxBuf[index_rxBuf_R];

von Patrick B. (p51d)


Lesenswert?

holger schrieb:
> Da macht der CCS wohl den Fehler. Er betrachtet rxBuf[index_rxBuf_R]
> an der Stelle wohl nicht als int8.

Compiler verursacht einen Fehler? Das solls ja geben, aber kann ich mir 
irgendwie nicht vorstellen.

Ich werde morgen die neue Version mit dem Cast testen, da ich leider den 
Print nicht zuhause habe.

Gegen den MCU-Defekt spricht vor allem, dass sonst keine Fehler 
aufgetreten sind, oder kann so etwas nur teilweise vorkommen?

MFG
Patrick

von holger (Gast)


Lesenswert?

>Compiler verursacht einen Fehler? Das solls ja geben, aber kann ich mir
>irgendwie nicht vorstellen.

Buhahaha!

von Patrick B. (p51d)


Lesenswert?

holger schrieb:
>>Compiler verursacht einen Fehler? Das solls ja geben, aber kann ich mir
>>irgendwie nicht vorstellen.
>
> Buhahaha!

?? wie darf ich dieses belustigende lachen jetzt interpretieren? Wenn 
man nicht gleich alles mit Windows gleich setzt muss es nicht heissen, 
dass etwas, wofür man zahlt auch gleich schlecht und voller Fehler ist.

Ich kenne diese Compiler (für PIC):
- Microchip... C18, C32
- CCS Versionen (PCWHD...)
- HI-Tech Versionen
und seit heute auch die GCC Versionen.

Wie wäre es mit eine fachlichen Meinung über die Performance, die 
Codierung, das Handling und den Support dieser Compilers?

MFG
P51D

von holger (Gast)


Lesenswert?

>>>Compiler verursacht einen Fehler? Das solls ja geben, aber kann ich mir
>>>irgendwie nicht vorstellen.
>>
>> Buhahaha!

>?? wie darf ich dieses belustigende lachen jetzt interpretieren?

Fehler liegen eher in der Software als in der Hardware.
Ausnahmen gibt es natürlich auch.

- Microchip... C18

Frühe Versionen vom C18 hatten ähnliche Fehler wie deinen.
Und auch mit GCC hat man schon mal ne Menge Spaß. Das Netz
ist voll von Compiler Fehlern.

von Michael H. (morph1)


Lesenswert?

Aja um das von vorher zu beantworten:

C32 und C30 sind die GCC-Derivate. Ist für mich persönlich der beste 
Compiler, wenn man sich mit den Eigenheiten mal vertraut gemacht hat :)

von Patrick B. (p51d)


Lesenswert?

Michael H. schrieb:
> Aja um das von vorher zu beantworten:
>
> C32 und C30 sind die GCC-Derivate. Ist für mich persönlich der beste
> Compiler, wenn man sich mit den Eigenheiten mal vertraut gemacht hat :)

Ich habe bis jetzt nur Erfahrungen mit dem AVR GCC Compiler, aber der 
Umstieg sollte daher nicht sehr schwer fallen.

holger schrieb:
> So natürlich:(
>
>      NUM |= (unsigned int8)rxBuf[index_rxBuf_R];

Hat keine Besserung gebracht....

Ich werde einmal versuchen mit dem GCC Compiler zu arbeiten und sehen, 
wie sich die Performance verhält:
Ein Switch muss zwingend eine Jump-Tabelle haben, sonst verliere ich wie 
gesagt benötigte Zeit.

Melde mich wieder sobald die ich die neuesten Ergebnisse habe.

MFG
P51D

von Patrick B. (p51d)


Lesenswert?

Michael H. schrieb:
> C32 und C30 sind die GCC-Derivate. Ist für mich persönlich der beste
> Compiler, wenn man sich mit den Eigenheiten mal vertraut gemacht hat :)

Tja das "vertraut" machen ist etwas mühsehlig:
Praktisch keine Beispiele (im vergleich zum CCS sehr viele), praktisch 
alles ander von den definitionen her....

Gibts da eine interessante Seite mit nützlichen und brauchbaren 
Code-Beispielen damit das Einarbeiten etwas humaner vorangeht?

MFG
Patrick

von Andreas F. (aferber)


Lesenswert?

Patrick B. schrieb:
> Ein Switch muss zwingend eine Jump-Tabelle haben, sonst verliere ich wie
> gesagt benötigte Zeit.

Wenn du unbedingt ganz bestimmten Code haben willst/musst, benutzt du 
mit C die falsche Sprache, das geht prinzipiell nur in Assembler.

Das gesagt: der GCC benutzt für switch() beide Varianten, je nach 
Optimierungseinstellungen und konkretem Code (bei einem switch() mit 
einem int und nur zwei cases plus default wird er z.B. mit ziemlicher 
Sicherheit zwei Vergleiche statt einer Sprungtabelle generieren).

Allerdings gibt es eine GCC-Extension, mit der man ohne viel Aufwand 
explizit die Benutzung einer Sprungtabelle als Code hinschreiben kann. 
Konkret kann der GCC die Adressen von Sprungmarken in Variablen 
speichern, und diese können dann für goto verwendet werden. Das sieht 
dann so aus:
1
static void *jumptable[] = { &&case1, &&case2, &&case3 };
2
3
goto *jumptable[i];
4
5
case1:
6
    /* ... */
7
    goto end_switch;
8
9
case2:
10
    /* ... */
11
    goto end_switch;
12
13
case3:
14
    /* ... */
15
    goto end_switch;
16
17
end_switch:

Und ja, es müssen doppelte '&&' sein.

Doku dazu: 
http://gcc.gnu.org/onlinedocs/gcc-4.5.0/gcc/Labels-as-Values.html

Andreas

von holger (Gast)


Lesenswert?

>holger schrieb:
>> So natürlich:(
>>
>>      NUM |= (unsigned int8)rxBuf[index_rxBuf_R];

>Hat keine Besserung gebracht....

Und was ist mit:

     NUM += rxBuf[index_rxBuf_R];

??

von Patrick B. (p51d)


Lesenswert?

holger schrieb:
> Und was ist mit:
>
>      NUM += rxBuf[index_rxBuf_R];

Das funktioniert wiederum interessanterweise.

Ich werde mir aber trotzdem die Mühe nehmen und das Programm auf den GCC 
umschreiben, damit ich eine Sprungtabelle habe.

MFG
Patrick

von Patrick B. (p51d)


Lesenswert?

Andreas Ferber schrieb:
> Patrick B. schrieb:
>> Ein Switch muss zwingend eine Jump-Tabelle haben, sonst verliere ich wie
>> gesagt benötigte Zeit.
>
> Wenn du unbedingt ganz bestimmten Code haben willst/musst, benutzt du
> mit C die falsche Sprache, das geht prinzipiell nur in Assembler.

Wie würde so ein switch mit einer Sprungtablle in Assembler aussehen??

Ich habe hierzu leider nicht viel gefunden.

MFG
Patrick

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.