Jesses följetång om AVR programmering i C...

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Mr M
Inlägg: 165
Blev medlem: 20 januari 2006, 21:35:14

Re: lite undringar om AVR progrannering i C

Inlägg 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).
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Re: lite undringar om AVR progrannering i C

Inlägg av speakman »

För att få den optimerade versionen oavsett vad man ber kompilatorn om?

edit: Mr M hann emellan...
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: lite undringar om AVR progrannering i C

Inlägg 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.)
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

#include "blabla.h"

Inlägg 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:
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: lite undringar om AVR progrannering i C

Inlägg 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.
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: lite undringar om AVR progrannering i C

Inlägg 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!
Användarvisningsbild
Icecap
Inlägg: 26658
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: lite undringar om AVR progrannering i C

Inlägg 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.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: lite undringar om AVR progrannering i C

Inlägg 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.
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Re: lite undringar om AVR progrannering i C

Inlägg 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.
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: lite undringar om AVR progrannering i C

Inlägg 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).
Nerre
Inlägg: 27256
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Re: lite undringar om AVR progrannering i C

Inlägg 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".
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: lite undringar om AVR progrannering i C

Inlägg 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...
eqlazer
Inlägg: 923
Blev medlem: 22 september 2007, 13:53:45
Ort: Göteborg

Re: lite undringar om AVR progrannering i C

Inlägg av eqlazer »

Inte helt ovanligt att den heter F_CPU i vissa projekt.
bos
Inlägg: 2314
Blev medlem: 24 februari 2007, 23:29:15
Kontakt:

Re: lite undringar om AVR progrannering i C

Inlägg 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.
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: lite undringar om AVR progrannering i C

Inlägg 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!
Skriv svar