Sida 4 av 13

Re: lite undringar om AVR progrannering i C

Postat: 26 oktober 2009, 11:43:15
av Mr M
Jo, för att ibland när jag ville debugga koden i AVR Studio så vill jag stänga av kod optimeringen så att singel steppningen ska funka enligt C-koden. Och då kanske man inte vill hålla på och ändra tillbaks till optimering igen för att testa i hårdvara.

Så därför klippte jag in det som assemblerkod för att alltid vara säker på att jag får den kod som jag vill ha (som funkar).

Re: lite undringar om AVR progrannering i C

Postat: 26 oktober 2009, 11:44:15
av speakman
För att få den optimerade versionen oavsett vad man ber kompilatorn om?

edit: Mr M hann emellan...

Re: lite undringar om AVR progrannering i C

Postat: 26 oktober 2009, 12:24:46
av jesse
Mr M. Precis så gjorde jag också, av ren lathet. Jag kan assemböer, men orkade inte slå upp adressen för det register jag skulle ändra i :)

(Ni andra: läs lite längre upp i tråden så förstår du varför jag och Mr M klistade in assemberkoden.)

#include "blabla.h"

Postat: 26 oktober 2009, 12:51:50
av jesse
Nu blir jag tokig när jag ska dela upp programmet i flera filer!

Jag har gjort ett program som ligger i en fil : uarttest.c, där jag gjort några buffrade uart-funktioner samt ett huvudprogram som testar dem.

Nu är jag nöjd med uart-funktionerna och tänkte lyfta in dem i mitt lilla projekt. Därför vill jag separera dem från huvudfilen och skapa

uart.c
uart.h


Men hur sjutton jag än fixar och donar så kommer grejerna i fel ordning.

Jag har också delat upp huvudprogrammet uarttest i två delar: uarttest.h och uarttest.c.

Dessa innehåller bl.a:

uarttest.h:

Kod: Markera allt

#ifndef UARTTEST_H
#define UARTTEST_H

#define F_OSC 8000000UL
#define BAUDRATE 19200UL
#include "eeprom.h"  // används för att skicka konstanta textsträngar från eeprom.
  ....
#endif
uarttest.c

Kod: Markera allt

#include <avr/interrupt.h>
#include <stdint.h>
#include <stdio.h>
#include <avr/io.h>
#include <util/delay.h>
#include <avr/eeprom.h>

#include "uarttest.h"
#include "uart.h"
#include "eeprom.h"
    ....
int main( void ) { ...
och mina uart-funktioner i:

uart.h

Kod: Markera allt

    ....   diverse globala variabler  ....
    ....   funktionsdeklarationerna ....   
uart.c

Kod: Markera allt

#include "uart.h"

void uart0_init(void){ // ----- initiera UART0 -----
	#define	BAUD_PRESCALE (F_OSC/(16*BAUDRATE)-1)
	UBRR0L = BAUD_PRESCALE & 0xff; 
             .... osv....
}

      .... osv  ...

Error: ../uart.c:6: error: 'F_OSC' undeclared (first use in this function)


(i avr-gcc's projektfönster har jag lagt uattest.c och uart.c i "källfiler" och uarttest.h och uart.h i "header files")

Efter att ha gjort lite ändringar, bl.a. lagt in #include "uarttest.h" även i uart.c så får jag andra fel...

Kod: Markera allt

avr-gcc -mmcu=atmega324p -Wl,-Map=uarttest.map uarttest.o uart.o     -o uarttest.elf
uart.o: In function `uart0_init':
C:\AVR_projekt\AVR_GCC_projekt\uarttest\default/../uart.c:7: multiple definition of `uaflag'
uarttest.o:C:\AVR_projekt\AVR_GCC_projekt\uarttest\default/../uarttest.c:20: first defined here
uart.o: In function `uart0_init':
C:\AVR_projekt\AVR_GCC_projekt\uarttest\default/../uart.c:7: multiple definition of `uartInbufpos'
uarttest.o:C:\AVR_projekt\AVR_GCC_projekt\uarttest\default/../uarttest.c:20: first defined here
uart.o: In function `uart0_init':
C:\AVR_projekt\AVR_GCC_projekt\uarttest\default/../uart.c:7: multiple definition of `uartInbufRead'
uarttest.o:C:\AVR_projekt\AVR_GCC_projekt\uarttest\default/../uarttest.c:20: first defined here
uart.o:(.eeprom+0x13e): multiple definition of `retur'
uarttest.o:(.eeprom+0x13e): first defined here
uart.o:(.eeprom+0x0): multiple definition of `welcome'
uarttest.o:(.eeprom+0x0): first defined here
uart.o:(.eeprom+0x137): multiple definition of `BMSprompt'
uarttest.o:(.eeprom+0x137): first defined here
uart.o: In function `uart0_init':
C:\AVR_projekt\AVR_GCC_projekt\uarttest\default/../uart.c:7: multiple definition of `uartSendbufWrite'
uarttest.o:C:\AVR_projekt\AVR_GCC_projekt\uarttest\default/../uarttest.c:20: first defined here
uart.o: In function `uart0_init':
C:\AVR_projekt\AVR_GCC_projekt\uarttest\default/../uart.c:7: multiple definition of `uartSendbufRead'
uarttest.o:C:\AVR_projekt\AVR_GCC_projekt\uarttest\default/../uarttest.c:20: first defined here
make: *** [uarttest.elf] Error 1
Build failed with 1 errors and 0 warnings...
nu blir jag tokig... det blir mer och mer kaos... :wall:

Re: lite undringar om AVR progrannering i C

Postat: 26 oktober 2009, 13:26:37
av sodjan
Hur definieras F_OSC för user.c ?
(D.v.s i första fallet)

De andra "felen" kan man väl undvika genom ifdef/endif i h-filerna.

Re: lite undringar om AVR progrannering i C

Postat: 26 oktober 2009, 13:39:40
av jesse
jag tänker mig att F_OSC definieras i huvudprogrammets uarttest.h och ska inte behöva deklarareras i uart.c

De andra fallen: jag har ifndef... i alla .h-filer.
Men den verkar tycka att variablerna definieras igen inne i koden där de används!

Re: lite undringar om AVR progrannering i C

Postat: 26 oktober 2009, 13:46:13
av Icecap
Om man BÅDA inkludera i projektet OCH inkluderar filerna via #include kan man få detta fenomen.

Välj alltså ena eller andra vägen, inte båda.

Re: lite undringar om AVR progrannering i C

Postat: 26 oktober 2009, 13:50:33
av sodjan
> jag tänker mig att F_OSC definieras i huvudprogrammets uarttest.h och ska inte behöva deklarareras i uart.c


Är det inte separatkompilering ?
D.v.a att uart.c kompileras fristående från övriga c filer ?
D.v.s att när uart kompileras så är det enbart uart.c och uart.h som används,
övriga filer känner kompilatorn inte till vid det tillfället.

Re: lite undringar om AVR progrannering i C

Postat: 26 oktober 2009, 13:55:02
av speakman
Helt rätt sodjan, varje .c-fil kompileras i helt skiljda kontexter. F_OSC defineras automatiskt i AVR Studio om man anger klockfrekvensen i projektinställningarna.

Re: lite undringar om AVR progrannering i C

Postat: 26 oktober 2009, 14:01:02
av jesse
>Är det inte separatkompilering ?

Jo, det verkar det vara. Därför har jag med #include "uarttest.h" inne i "uart.h" för att få med definitionerna från huvudprogrammet. Så det löste jag.

Nu verkar resten ha löst sig också. Förvirringen är stor kring vad som ska vara i .h erspektive .c filerna!
Jag definierade globala variabler i uart.h - det var felet. De ska ligga i en .c-fil. Jag lade dem i uarttest.h men då kom jag inte åt dem från funktioner i uart.c.... Efter lite sökande på nätet lärde jag mig ett nytt ord: extern!

Globala variabler som ska användas i mer än en programfil måste deklareras i .h med "extern" före och sedan initieras i .c ....

t.ex.

main.h:

Kod: Markera allt

extern uint8_t EEMEM welcome[];
och main.c:

Kod: Markera allt

 uint8_t EEMEM welcome[]="Välkommen!";
så löste sig det också :P .... men det tar rejält med tid att fastna i sådana här detaljer :x och errorkoderna talar ju sällan om vad ursprungsfelet ligger...

>F_OSC defineras automatiskt i AVR Studio om man anger klockfrekvensen i projektinställningarna.
Nja.... jag har skrivit in en klockfrekvens i projektbeskrivningen, men F_OSC definieras inte. Den verkar istället heta någonting annat (hittar den inte just nu).

Re: lite undringar om AVR progrannering i C

Postat: 26 oktober 2009, 14:07:42
av Nerre
Det är väl liksom så det alltid fungerar med flera källkodsfiler.

Filerna kompileras var för sig och länkas sen ihop.

Och för att de ska kunna länkas ihop så måste gemensamma symboler vara deklararade i alla "kompilationer".

Re: lite undringar om AVR progrannering i C

Postat: 26 oktober 2009, 14:17:18
av sodjan
> men F_OSC definieras inte. Den verkar istället heta någonting annat

Då kanske det är det där "någonting annat" som du ska använda istället för F_OSC...

Re: lite undringar om AVR progrannering i C

Postat: 26 oktober 2009, 14:18:22
av eqlazer
Inte helt ovanligt att den heter F_CPU i vissa projekt.

Re: lite undringar om AVR progrannering i C

Postat: 26 oktober 2009, 14:53:56
av bos
Det jesse behöver är en grundkurs i C, det är på tok för många förvirringar på en och samma gång för att på ett sakligt sätt kunna räta ut dem en och en och förklara varför det blir si och varför det blir så.

Jag rekommenderar den här boken. Läs den pärm till pärm.

Re: lite undringar om AVR progrannering i C

Postat: 26 oktober 2009, 14:56:21
av jesse
Problemet att grundkurser i C oftast inte kommer till dessa saker. Jag har tre böcker hemma just nu, inte i någon av dem nämns hur man gör ett projekt med mer än en källfil! Ändå är en av dem på 595 sidor!

Men du ar väl rätt, jag skulle vilja ha en bra grundöversikt på över språket och programmeringsmiljön.

Boken du hänvisar till verkar finnas även på svenska!