djbpm Poziom 16

Joined: 22 Jan 2003 Posts: 337 Location: -
|
#1
24 May 2006 17:16 Optymalizacja kodu w C na atttiny2313 |
|
|
|
Jako że to jeden z pierwszych programów w C, i kombinuje z nim już sporo czasu, straciłem cierpliwość, a właściwie brak mi pomysłów.
Ma to chodzić na attiny2313, w następujący sposób.
Procek sprawdza stan PINB1 i jeśli 1 to wysyła dane z tablicy „jedynka” jeśli zero to „zero” na PORTD. Wysłanie jedynki zmienia fazę, w taki sposób, że następna wysyłana tablica będzie wysyłana w odwrotną stronę (od końca). Mniej więcej w połowie wysyłania tablicy ma zostać ustawiona 1 na PORTB0. Po skończeniu wysyłania tablicy ma być 0 na PORTB0, sprawdzenie stanu PINB1, fazy, i wysyłanie. Tablica dla 0 jest wysyłana 2krotnie, ponieważ ma 192 elementy, a powinna mieć 384.
Program działa, ale problem jest to, że wartości na portach mają się pojawiać co 19 taktów. Teraz pojawiają się co 9 lub 11, można wstawić _NOP() lub coś pożytecznego, bo sprawdzenie stanu portu, i fazy trwa dużo za długo. Też powinno się zmieścić w 19 taktach. Ewentualnie można wyciąć ostatni i pierwszy element z tablicy, i zyskamy 19+2*19 czyli razem 57 taktów, ale to wciąż za mało. Czy ktoś wie jak to znacząco przyspieszyć?
Korzystam z avr studio i winavr, włączyłem optymalizacje na 0s
| Code: |
#define CHECKBIT(ADDRESS,BIT) (ADDRESS & (1<<BIT))
#include <avr\io.h>
#include <avr\iom8.h>
#include <compat/ina90.h>
unsigned char zero[] = {128, 134, 136, 134, 128, 116, 111, 116, 128, 146, 153, 146, 128, 105, 95, 105, 128, 157, 169, 157, 128, 94, 79, 94, 128, 168, 184, 168, 128, 83, 65, 83, 128, 178, 199, 178, 128, 73, 51, 73, 128, 187, 212, 187, 128, 69, 44, 69, 128, 192, 218, 192, 128, 60, 33, 60, 128, 199, 229, 199, 128, 53, 22, 53, 128, 206, 238, 206, 128, 47, 14, 47, 128, 211, 245, 211, 128, 43, 8, 43, 128, 215, 251, 215, 128, 40, 3, 40, 128, 217, 254, 217, 128, 38, 1, 38, 128, 218, 255, 218, 128, 38, 1, 38, 128, 217, 254, 217, 128, 40, 3, 40, 128, 215, 251, 215, 128, 43, 8, 43, 128, 211, 245, 211, 128, 47, 14, 47, 128, 206, 238, 206, 128, 53, 22, 53, 128, 199, 229, 199, 128, 60, 33, 60, 128, 196, 218, 192, 128, 69, 44, 69, 128, 183, 205, 183, 128, 78, 57, 78, 128, 173, 192, 173, 128, 88, 72, 88, 128, 162, 177, 162, 128, 99, 87, 99, 128, 151, 161, 151, 128, 110, 103, 110, 128, 140, 145, 140, 128, 122, 120, 122, 128};
unsigned char jedynka[] = {128, 124, 122, 124, 128, 137, 141, 137, 128, 112, 105, 112, 128, 149, 158, 149, 128, 100, 88, 100, 128, 161, 175, 161, 128, 89, 73, 89, 128, 172, 190, 172, 128, 79, 58, 79, 128, 181, 203, 181, 128, 69, 45, 69, 128, 190, 215, 190, 128, 62, 34, 62, 128, 197, 225, 197, 128, 55, 25, 55, 128, 202, 233, 202, 128, 51, 19, 51, 128, 206, 239, 206, 128, 47, 14, 47, 128, 209, 243, 209, 128, 45, 11, 45, 128, 211, 245, 211, 128, 45, 10, 45, 128, 210, 244, 210, 128, 45, 11, 45, 128, 209, 243, 209, 128, 47, 14, 47, 128, 207, 240, 207, 128, 50, 18, 50, 128, 204, 235, 204, 128, 53, 22, 53, 128, 200, 230, 200, 128, 57, 28, 57, 128, 197, 225, 197, 128, 61, 33, 61, 128, 192, 219, 192, 128, 65, 39, 65, 128, 188, 213, 188, 128, 69, 44, 69, 128, 185, 208, 185, 128, 72, 49, 72, 128, 182, 204, 182, 128, 75, 53, 75, 128, 180, 201, 180, 128, 77, 56, 77, 128, 177, 198, 177, 128, 78, 57, 78, 128, 177, 198, 177, 128, 78, 57, 78, 128, 177, 198, 177, 128, 77, 56, 77, 128, 179, 200, 179, 128, 76, 54, 76, 128, 180, 202, 180, 128, 74, 51, 74, 128, 183, 206, 183, 128, 70, 46, 70, 128, 187, 211, 187, 128, 66, 41, 66, 128, 191, 217, 191, 128, 63, 36, 63, 128, 194, 222, 194, 128, 59, 30, 59, 128, 199, 228, 199, 128, 54, 24, 54, 128, 202, 233, 202, 128, 51, 19, 51, 128, 206, 238, 206, 128, 48, 15, 48, 128, 209, 242, 209, 128, 46, 12, 46, 128, 210, 244, 210, 128, 45, 11, 45, 128, 211, 245, 211, 128, 45, 11, 45, 128, 210, 244, 210, 128, 47, 13, 47, 128, 208, 241, 208, 128, 49, 16, 49, 128, 204, 236, 204, 128, 53, 22, 53, 128, 199, 229, 199, 128, 59, 30, 59, 128, 193, 220, 193, 128, 66, 41, 66, 128, 185, 209, 185, 128, 75, 53, 75, 128, 175, 195, 175, 128, 85, 67, 85, 128, 165, 181, 165, 128, 95, 82, 95, 128, 154, 165, 154, 128, 107, 98, 107, 128, 142, 148, 142, 128, 119, 115, 119, 128, 130, 131, 130, 128};
int i=0;
char faza=0;
void initialization(void)
{
DDRD = 0xff; // Set PORTD as output
DDRB = 0x01; // set pin 0 as output, 1, 2, 3, 4, 5, 6, 7 as input
PORTB = 0xff;
}
void wyslijzero(void)
{
if (faza==0) //dla fazy 0
{
for (i=191; i >= 0; i=i-1)
{
PORTD = zero[i];
}
PORTB |= (1<<0);
for (i = 1; 192 >= i; i=i+1)
{
PORTD = zero[i];
}
PORTB &= ~(1 << (0));
}
else //dla fazy 1
{
for (i = 1; 192 >= i; i=i+1)
{
PORTD = zero[i];
}
PORTB=PORTB|(1<<0);
for (i=191; i >= 0; i=i-1)
{
PORTD = zero[i];
}
PORTB &= ~(1 << (0));
}
}
void wyslijjeden(void)
{
if (faza==0) // dla fazy 0
{
faza = 1;
for (i = 1; 192 >= i; i=i+1)
{
PORTD = jedynka[i];
}
PORTB=PORTB|(1<<0);
for (i = 193; 384 >= i; i=i+1)
{
PORTD = jedynka[i];
}
PORTB &= ~(1 << (0));
}
else // dla fazy 1
{
faza = 0;
for (i=383; i >= 192; i=i-1)
{
PORTD = jedynka[i];
}
PORTB=PORTB|(1<<0);
for (i=191; i >= 0; i=i-1)
{
PORTD = jedynka[i];
}
PORTB &= ~(1 << (0));
}
}
void main (void)
{
initialization(); //Initialize Pheripherals
while (1)
{
if(CHECKBIT(PINB,PINB1))
{
wyslijjeden();
}
else
{
wyslijzero();
}
}
}
|
|
|