AVRX å GCC fel.

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
DeVille
Inlägg: 2360
Blev medlem: 29 mars 2004, 15:04:22
Ort: Dalsländska skogen.
Kontakt:

AVRX å GCC fel.

Inlägg av DeVille »

Får följande fel när jag försöker initiera en pekare till en char.


:32: warning: type defaults to `int' in declaration of `str'
:32: error: conflicting types for `str'
:31: error: previous declaration of `str'
:32: warning: data definition has no type or storage class

Här är koden som det blir fel i.

Kod: Markera allt

	
char test[20]="AVRTESTING";
char *str;
str=test;
Spelar ingen roll om jag försöker göra det i/utanför main() eller i något av tasken..

detta är vad som är inkluderat.

#include <c:/avrx/avrx/avrx-io.h>
#include <c:/avrx/avrx/avrx-signal.h>
#include "c:/avrx/avrx/Avrx.h"
#include "hardware.h"

Tack på förhand för hjälpen.
Användarvisningsbild
Melker
Inlägg: 410
Blev medlem: 26 maj 2003, 22:17:34
Ort: Umeå

Inlägg av Melker »

från Error-texten verkar det som att str är deklarerat tidigare? Provat med något annat pekarnamn?
Användarvisningsbild
DeVille
Inlägg: 2360
Blev medlem: 29 mars 2004, 15:04:22
Ort: Dalsländska skogen.
Kontakt:

Inlägg av DeVille »

Nope den är inte deklarerad förut.. spelar inte någon roll vad jag kallar den, får ändå previous declared felet..

Suck.. blir så trött.. har ni inte använt GCC med pekare? funderar på om
det kan vara något jag glömt att inkludera.. men vet inte vad.
Användarvisningsbild
Melker
Inlägg: 410
Blev medlem: 26 maj 2003, 22:17:34
Ort: Umeå

Inlägg av Melker »

Givetvis har man använt pekare med GCC, är en standard datatyp för C, ska inte behövas inkluderas några header filer för att dom ska fungera.

Har ingen aning vad det kan vara då. :?
Användarvisningsbild
DeVille
Inlägg: 2360
Blev medlem: 29 mars 2004, 15:04:22
Ort: Dalsländska skogen.
Kontakt:

Inlägg av DeVille »

När jag undrade om pekare.. var det inte för att vara uppkäftig.. sorry.
Läste inte före jag postade, kunde tolkas fel.

Är en lösning på spåret.. återkommer när jag har mer på G.

Tack så länge.
Användarvisningsbild
Melker
Inlägg: 410
Blev medlem: 26 maj 2003, 22:17:34
Ort: Umeå

Inlägg av Melker »

Jag uppfattade inte din fråga som att den var uppkäftigt. Uppfattade du mitt svar som det så får jag be om ursäkt, var inte meningen. :)
Nog om det.
gille
Inlägg: 69
Blev medlem: 28 november 2004, 18:06:09
Ort: Stockholm
Kontakt:

Inlägg av gille »

Helt helt säker på att du inte deklarerat str tidigare?
Eller en struct som inte är avslutad (};) ?
Det bygger nämligen med avr-gcc för mig.

F.ö. anser jag personligen att man ska skriva strängar
char str[]={"hej"};
och inte
char str[]="hej";

Men det är så klart en smaksak.
henkebenke
Inlägg: 515
Blev medlem: 31 maj 2003, 10:42:37
Ort: Helsingborg

Inlägg av henkebenke »

Känns ganska onödigt. Kan inte precis missförstås ändå.
sprawl
Inlägg: 299
Blev medlem: 9 juni 2004, 13:01:33
Ort: Göteborg

Inlägg av sprawl »

Jag tycker strängar ska skrivas:
char str[]={'h','e','j'};
...
eller inte.

Men kan du inte skicka upp koden du har? Det är förmodligen något litet syntaxfel någonstans som du missat.

/a
henkebenke
Inlägg: 515
Blev medlem: 31 maj 2003, 10:42:37
Ort: Helsingborg

Inlägg av henkebenke »

du glömde '\0' :D
Användarvisningsbild
DeVille
Inlägg: 2360
Blev medlem: 29 mars 2004, 15:04:22
Ort: Dalsländska skogen.
Kontakt:

Inlägg av DeVille »

Felet försvann när jag deklarerade såhär.

unsigned char *test[]="AVRTESTING";

funkade hur bra som helst.. vet inte varför dock.
Användarvisningsbild
DeVille
Inlägg: 2360
Blev medlem: 29 mars 2004, 15:04:22
Ort: Dalsländska skogen.
Kontakt:

Inlägg av DeVille »

Håll i er, nu kommer koden här.. kanske är en bra ide att ta in den i Programmers notepad eller liknande, har kommenterat bort lite saker..
Följande fel finns.

Koden fungerar i nedanstående skick så länge jag inte deklarerar
det som är markerat med *?*?*?*?
Då verkar den inte starta Tasken..


Använder ett 16 Tangenters tgb.

Kod: Markera allt

/*

	
	KOPPLA IN SÅHÄR:
	PORTA->NR2
	PORTB->NR5
	PORTC->NR1
	PORTD->NR3
	
	
*/
#include <c:/avrx/avrx/avrx-io.h>
#include <c:/avrx/avrx/avrx-signal.h>
#include "c:/avrx/avrx/Avrx.h"
#include "hardware.h"
#include <string.h>
#define timerdelay 70000
#define timerdelay1 550



	
	 


char *nb1="Last: 1";
char *nb2="Last: 2"; //*?*?*?*?*?*?*?*?*?

void set_rs(void);
void write_dd_ram(void);
void e_rsclock(void);
void eclock(void);
void delay(void);
void cleardisplay(void);
void disp(char*, int);


	

 







TimerControlBlock Timer1,Timer2,Timer3;    				// Create a control blocks for a timer
MessageControlBlock no1,no2,no3,no4,no5,no6,no7,no8,no9,no0,noA,noB,noC,noD,noStar,noBrackets;	// Create simple messages (no internal data)
MessageQueue Queue1;						// Create a message queue

/*
 Timer 0 Overflow Interrupt Handler
 Prototypical Interrupt handler:
 . Switch to kernel context
 . handle interrupt
 . switch back to interrupted context.
*/
AVRX_SIGINT(SIG_OVERFLOW0)
{
    IntProlog();                			// Switch to kernel stack/context
    outp(TCNT0_INIT, TCNT0);    			// Reset timer overflow count
    AvrXTimerHandler();         			// Call Time queue manager
    Epilog();                   			// Return to tasks
}


//Skapa 3 task. Rinnande ljus, rinnande ljus, och 1 till.

AVRX_GCC_TASK(task1, 70, 3);				// Create three tasks with 70 bytes stacksize and priority 3
AVRX_GCC_TASK(task2, 110, 3);
AVRX_GCC_TASK(task3, 30, 3);








//*****TASK1*****

NAKEDFUNC(task1)							// Task 1					
{




	
	for(;;)
    {
	int temp=0,temp1=0;
	temp=inp(PINC);
	temp1=temp&16;
	
	
	if(temp1==16)
	{
	
	PORTC=PORTC&223;		//Output enable går LÅG.
							//outp(0x00, PORTA);
	
	AvrXDelay(&Timer1,1);	//Vänta 1ms.
	
	temp=inp(PINC);			//Lägg PINC till temp, dvs tangenpositionen i temp.

	PORTC=PORTC|32;			//Output enable går HÖG.
	


	switch(temp){
	
	case 3 : 	AvrXSendMessage(&Queue1, &no1);	// Skicka Meddelande till kö1
				AvrXWaitMessageAck(&no1);		//Vänta på kvitto
				
	case 2 : 	AvrXSendMessage(&Queue1, &no2);	// Skicka Meddelande till kö1
				AvrXWaitMessageAck(&no2);		//Vänta på kvitto

	case 1 : 	AvrXSendMessage(&Queue1, &no3);	// Skicka Meddelande till kö1
				AvrXWaitMessageAck(&no3);		//Vänta på kvitto
				
	case 0 : 	AvrXSendMessage(&Queue1, &noA);	// Skicka Meddelande till kö1
				AvrXWaitMessageAck(&noA);		//Vänta på kvitto
				
	case 7 : 	AvrXSendMessage(&Queue1, &no4);	// Skicka Meddelande till kö1
				AvrXWaitMessageAck(&no4);		//Vänta på kvitto
	
	case 6 : 	AvrXSendMessage(&Queue1, &no5);	// Skicka Meddelande till kö1
				AvrXWaitMessageAck(&no5);		//Vänta på kvitto	
	
	case 5 : 	AvrXSendMessage(&Queue1, &no6);	// Skicka Meddelande till kö1
				AvrXWaitMessageAck(&no6);		//Vänta på kvitto	
	
	case 4 : 	AvrXSendMessage(&Queue1, &noB);	// Skicka Meddelande till kö1
				AvrXWaitMessageAck(&noB);		//Vänta på kvitto	
	
	case 11: 	AvrXSendMessage(&Queue1, &no7);	// Skicka Meddelande till kö1
				AvrXWaitMessageAck(&no7);		//Vänta på kvitto	
	
	case 10: 	AvrXSendMessage(&Queue1, &no8);	// Skicka Meddelande till kö1
				AvrXWaitMessageAck(&no8);		//Vänta på kvitto	
	
	case 9 : 	AvrXSendMessage(&Queue1, &no9);	// Skicka Meddelande till kö1
				AvrXWaitMessageAck(&no9);		//Vänta på kvitto	
	
	case 8 : 	AvrXSendMessage(&Queue1, &noC);	// Skicka Meddelande till kö1
				AvrXWaitMessageAck(&noC);		//Vänta på kvitto	
	
	case 15: 	AvrXSendMessage(&Queue1, &noStar);	// Skicka Meddelande till kö1
				AvrXWaitMessageAck(&noStar);		//Vänta på kvitto	
	

	case 14: 	AvrXSendMessage(&Queue1, &no0);	// Skicka Meddelande till kö1
				AvrXWaitMessageAck(&no0);		//Vänta på kvitto


	case 13: 	AvrXSendMessage(&Queue1, &noBrackets);	// Skicka Meddelande till kö1
				AvrXWaitMessageAck(&noBrackets);		//Vänta på kvitto

	case 12: 	AvrXSendMessage(&Queue1, &noD);	// Skicka Meddelande till kö1
				AvrXWaitMessageAck(&noD);		//Vänta på kvitto

				}



	
	
	}
	else{
	PORTB=0;
	}
	
	
	
	

		
	}


}


//Task2, kollar efter och fixar med meddelanden.
NAKEDFUNC(task2)
{
MessageControlBlock *p;								// Create a pointer to a MessageControlBlock



    while (1)
    {
		p=AvrXWaitMessage(&Queue1);						// Wait for new message @ Queue1
		




		
		if(p==&no1)	
		{
			disp(nb1, 7);
			
			AvrXAckMessage(p);			
		}
		
		
		else 
			if (p==&no2)
			{
	
				disp(nb2, 7);
				
				AvrXAckMessage(p);
			}
/*
		else 
			if (p==&no3)
			{
				
				disp(nb3, 7);
				AvrXAckMessage(p);
			}

		else 
			if (p==&no4)
			{
				
				disp(nb4, 7);
				AvrXAckMessage(p);
			}

		else 
			if (p==&no5)
			{
				
				disp(nb5, 7);		
				AvrXAckMessage(p);
			}

		else 
			if (p==&no6)
			{
				
				disp(nb6, 7);
				AvrXAckMessage(p);
			}

		else 
			if (p==&no7)
			{
				
				disp(nb7, 7);
				AvrXAckMessage(p);
			}


		else 
			if (p==&no8)
			{
				
				disp(nb8, 7);
				AvrXAckMessage(p);
			}

		else 
			if (p==&no9)
			{
				
				disp(nb9, 7);
				AvrXAckMessage(p);
			}

		else 
			if (p==&no0)
			{
				
				disp(nb0, 7);
				AvrXAckMessage(p);
			}

		else 
			if (p==&noStar)
			{
				
				disp(nbStar, 7);
				AvrXAckMessage(p);
				
			}

		else 
			if (p==&noBrackets)
			{
				
				disp(nbBrackets, 7);
				AvrXAckMessage(p);
			}

		else 
			if (p==&noA)
			{
				
				disp(nbA, 7);
				AvrXAckMessage(p);
			}

		else 
			if (p==&noB)
			{
				
				disp(nbB, 7);
				AvrXAckMessage(p);
			}
			
		else 
			if (p==&noC)
			{
		
				disp(nbC, 7);
				AvrXAckMessage(p);
			}

		else 
			if (p==&noD)
			{
			
				disp(nbD, 7);
				AvrXAckMessage(p);
			}
*/


			AvrXHalt();

}
}

//******TASK3******
NAKEDFUNC(task3)
{




}




void main(void)                 	// Main runs under the AvrX Stack
{
    

	
	AvrXSetKernelStack(0);			// Set kernel stack to current SPL/SPH

    //outp((1<<SE), MCUCR);      	// Enable "Sleep" instruction
    outp(TCNT0_INIT, TCNT0);
    outp(TMC8_CK256, TCCR0);    	// Set up Timer0 for CLK/256 rate
    outp((1<<TOIE0), TIMSK);   	// Enable Timer0 overflow interrupt



	DDRC=0x20;
	PORTC=PORTC|20;
	DDRA=255;
	DDRD=255;
	
    outp(0xFF, DDRB);           	// Make PORT B output and...
    outp(0xFF, PORTB);            	// LEDs on

    
	PORTA=56;
	eclock();	
	
	PORTA=15;
	eclock();
		
		
	PORTA=6;
	eclock();
		
	cleardisplay();


	
	
	
	
	
	
	AvrXRunTask(TCB(task1));		// Start task1
    AvrXRunTask(TCB(task2));		// Start task2
    //AvrXRunTask(TCB(task3));
	Epilog();      					// Switch from AvrX Stack to first task
	
	return(0);
}

//*****Delay*****
void delay()			
{
	long i;								// Declare a variable
	for(i=0;i<=timerdelay;i=i+1)		// Do nothing for "timerdelay" times
	{}
}
//***************


//*****E_Clock*****
//Klockar ut Instruktioner
void eclock()
{
	PORTD=4;
	delay();
	PORTD=0;
}
//***************


//*****RS_Clock*****
//Klockar ut tecken
void e_rsclock()
{
	
	PORTD=5;
	delay();
	PORTD=0;
	
}
//******************



//*****Write_dd_ram*****
//Stoppar efter 8 tecken
void write_dd_ram()
{
	PORTA=192;
	eclock();
}
//**********************




//*****write RS R/W och E*****
void set_rs()	
{
	delay();
	PORTD=4;
	delay();
	PORTD=0;
	delay();	
}
//****************************



//*****Rensa Displayen*****
void cleardisplay()
{
	
	PORTA=1;
	eclock();
	delay();
}
//*************************




//**********Display funktion******
void disp(char *string, int x)
{
int c;
int i;
c=0;
x=x-1;
	
do	{
PORTA=string[c];	
e_rsclock();


if (c==7)		//Byter "rad" på displayen om det behövs.
{
write_dd_ram();
PORTA=string[c];
}

c=c+1;
}
	
	while(c<=x);
	
}




Användarvisningsbild
Melker
Inlägg: 410
Blev medlem: 26 maj 2003, 22:17:34
Ort: Umeå

Inlägg av Melker »

De_Ville skrev:Felet försvann när jag deklarerade såhär.

unsigned char *test[]="AVRTESTING";

funkade hur bra som helst.. vet inte varför dock.
Det där blir en pekarmatris om jag inte tänker helt fel, och det är nog inte vad du är ute efter egentligen, men kan tänkas att det fungerar ändå.
Användarvisningsbild
Icecap
Inlägg: 26621
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Nämen hallå!

Hur enkelt som helst!

Kod: Markera allt

char test[20]="AVRTESTING";
char *str;
str=&test
'str' är ju en pekare på ett char array, den innehåller altså adressen på objektet. Om man då anger 'test' som data försöker man att ge den datan som är i 'test' men '&test' betyder adressen till 'test' och då ruller det bra.

Edit: Hmmmm....&test hade blivit &....sorry
Senast redigerad av Icecap 25 april 2005, 16:12:06, redigerad totalt 1 gång.
Användarvisningsbild
cykze
EF Sponsor
Inlägg: 1539
Blev medlem: 8 april 2004, 10:40:28
Ort: Uppsala

Inlägg av cykze »

Icecap: Anger man 'test' så är det adressen till 'test' som menas och inte det som ligger på adressen. 'test' är samma sak som '&test[0]'.
Skriv svar