Hallo,
ich habe einen AVR32UC3C0512C, der einen IR-Protokollstack über einen
8-Bit Parallelbus anspricht. Im späteren Verlauf des Projektes wird der
µController gewechselt (kleineres Package) bei dem die Pins dann zwar am
selben Port hängen, aber wild verstreut (reicht von Pin 4 bis Pin 27).
Nachdem die Kommunikation und alle Routinen grundsätzlich funktionieren,
würde ich gerne die Geschwindigkeit der Lese- und Schreibroutinen
erhöhen. Derzeit bin ich bei Übertragungsraten von 2,7 MBit/s von
(theoretisch) maximalen 4 MBit/s. Nachfolgend der Code, den es zu
optimieren gilt:
1 | /* IPMS Controllerpins definieren */
|
2 | #define GPIO_IPMS_DB0 AVR32_PIN_PD11
|
3 | #define GPIO_IPMS_DB1 AVR32_PIN_PD12
|
4 | #define GPIO_IPMS_DB2 AVR32_PIN_PD13
|
5 | #define GPIO_IPMS_DB3 AVR32_PIN_PD14
|
6 | #define GPIO_IPMS_DB4 AVR32_PIN_PD15
|
7 | #define GPIO_IPMS_DB5 AVR32_PIN_PD16
|
8 | #define GPIO_IPMS_DB6 AVR32_PIN_PD17
|
9 | #define GPIO_IPMS_DB7 AVR32_PIN_PD18
|
10 |
|
11 | ...
|
12 |
|
13 | uint8_t ipms_read_reg(uint8_t address)
|
14 | {
|
15 | uint8_t data = 0;
|
16 | uint32_t temp_bitmask = 0;
|
17 |
|
18 | ...
|
19 |
|
20 | /* Pinzustände abfragen */
|
21 | temp_bitmask = AVR32_GPIO.port[IPMS_DB_PORT].pvr;
|
22 |
|
23 | /* Byte wieder zurecht biegen */
|
24 | if(temp_bitmask & (1 << (GPIO_IPMS_DB0 & 0x1F))) data |= 1;
|
25 | if(temp_bitmask & (1 << (GPIO_IPMS_DB1 & 0x1F))) data |= 2;
|
26 | if(temp_bitmask & (1 << (GPIO_IPMS_DB2 & 0x1F))) data |= 4;
|
27 | if(temp_bitmask & (1 << (GPIO_IPMS_DB3 & 0x1F))) data |= 8;
|
28 | if(temp_bitmask & (1 << (GPIO_IPMS_DB4 & 0x1F))) data |= 16;
|
29 | if(temp_bitmask & (1 << (GPIO_IPMS_DB5 & 0x1F))) data |= 32;
|
30 | if(temp_bitmask & (1 << (GPIO_IPMS_DB6 & 0x1F))) data |= 64;
|
31 | if(temp_bitmask & (1 << (GPIO_IPMS_DB7 & 0x1F))) data |= 128;
|
32 |
|
33 | ...
|
34 | }
|
Wie kann ich hier Taktzyklen einsparen? Vor lauter Programmierarbeit,
habe ich gerade keine Ideen mehr :) Vielleicht liegt es auch daran, dass
es schon spät ist.....oder früh.
Gute Nacht und vielen Dank im voraus für eure Mühen