mikrocontroller.net

Forum: Compiler & IDEs Erzeugen/Einbinden einer Library (Threads-)


Autor: Manuel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich möchte in AVR-Studio mit Threads programmieren. Diese sind in der 
AVR-Libc aber ja nicht mit drin.

Ich habe im Internet folgende Library dafür gefunden:
http://www.bourbonstreetsoftware.com/AVRDevelopment.html

Dort ist auch eine Erläuterung bei und ich weiß auch, dass es hier auf 
der Seite einen Artikel zu Libraries gibt, aber ehrlich gesagt komme ich 
mit beidem nicht weiter.

In der Erläuterung der Lib steht :
2.1 Build

To install the AVR Threads Library, unpack the source tree. If you downloaded
the *.tgz version, you can do this with the following command:

tar -xzf threads-1.3-src.tgz

Next, change directory to the head of the source tree that was just unpacked
and run the make command:

$ cd threads-1.3
$ make

This should build the AVR Threads Library for all the supported AVR microcontrollers.


2.2 Installation

Once the libraries have been successfully built, you need to install the library
components to a location where the AVR GCC compiler can find them.
The default installation directory prefix is /usr/local. If you wish to change
this, you will have to edit the src/Makefile file in the source tree. In the
Makefile, you’ll find a line that looks like this:

prefix = /usr/local

Change this line to desired directory prefix. For example, if you’re using
WinAVR, you will need to change this this point to where WinAVR has been installed.
For example, if WinAVR has been installed in c:\WinAVR, then change
the prefix line to this:

prefix = c:/WinAVR

Finally, from the head of the source tree, or from the src directory, run this:

$ make install

wo kann ich denn diese Befehle eingeben?

Selbiges Problem, wenn ich das über die "Libraries-Anleitung" versuchen 
will:
Compileraufruf 
Da eine Library lediglich kompiliert und assembliert, aber nicht gelinkt
werden soll, muss das beim Compileraufruf berücksichtigt werden. Der 
Kommandozeilenschalter dafür ist '-c'. 

$ gcc -c -ggdb -O2 -o libmylibfunc1.o libmylibfunc1.c

[Bearbeiten] Archiv erstellen 
Das Archivierungsprogramm 'ar' wird dazu verwendet, um die kompilierten
Objektfiles zu einer Library zusammen zu fügen. 

$ ar -rcs libmylib.a libmylibfunc1.o libmylibfuncs.o

Auch hier bin ich ehrlich gesagt überfragt wie ich direkt einen 
Compileraufruf starten kann...

Oder alternativ, welche Threads-Lib ist gut und wie bekomme ich diese 
auch genutzt >.<

mfg, danke

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Manuel schrieb:
> Ich möchte in AVR-Studio mit Threads programmieren

Auf einem µC (kleiner 8bit atmel) gibt es keine BS auch gibt es dort 
soetwas wie Thread nichts, da hilft es auch nicht wenn man die lib 
benutzt.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter schrieb:
> Manuel schrieb:
>> Ich möchte in AVR-Studio mit Threads programmieren
>
> Auf einem µC (kleiner 8bit atmel) gibt es keine BS auch gibt es dort
> soetwas wie Thread nichts, da hilft es auch nicht wenn man die lib
> benutzt.

Dann lies Dir einfach mal die Beschreibung auf 
http://www.bourbonstreetsoftware.com/AVRDevelopment.html durch, und Du 
wirst sehen, daß diese Library genau das tut, sie stellt 
Threadfunktionalität auf einem AVR zur Verfügung:
The AVR Threads Library provides basic preemptive multitasking/multi-
threading to the Atmel AVR family of microcontrollers. It is written 
mostly in C with some assembly language. It implements a simple round-
robin style task switcher.

This library provides basic thread start and stop functions, a couple 
of flavors of mutual exclusion semaphore, and events to help synchronize
threads.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ob das auf einem AVR sinnvoll ist, sei aber mal dahingestellt.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann ist auch jedes RTOS auf einem µC sinnlos.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rufus t. Firefly schrieb:
> Dann ist auch jedes RTOS auf einem µC sinnlos.

Na das ist dann doch etwas arg allgmein. Beim AVR hat man z.B. das 
Problem, daß ein Taskwechsel aufgrund der großen Zahl an Registern, die 
alle einzeln gesichert werden müssen, recht teuer ist (sowohl im Bezug 
auf die Taskwechsel-Dauer, als auch im Bezug auf Speicherverbrauch). 
Dazu kommt, daß für jeden Thread ein eigener Stack benötigt wird.
Wenn man nur einen Stack hat, ist der eben so groß, wie der noch nicht 
anderweitig verbrauchte Speicher. Sobald man Threads hat, muß man für 
jeden Thread schauen, wie groß der Stack jeweils maximal sein kann und 
die entsprechende Menge Speicher dafür allokieren, auch wenn es nie 
vorkommt, daß alle Threads gleichzeitig die maximale Stackauslastung 
haben. Das ist halt auf vielen AVRs mit ihrem knappen SRAM eher 
einschränkend.
Da muß man schauen, daß man nicht für die Threads ein Vielfaches der 
Ressourcen verbraucht, die nachher für die eigentliche Aufgabe noch 
übrig sind und daß man dabei überhaupt einen Vorteil aus der Verwendung 
von Multithreading ziehen kann.

Autor: Manuel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also ich hab nen Atmega2561, der hat immerhin den doppelten SRAM :)

bevor ich auf diesen atmega umgestiegen bin hatte ich ein JControl 
Board, mit einem mir nicht bekannten µC, auch 8-bit, 64kFlash und soweit 
ich weiß nochmal deutlich weniger SRAM, den habe ich über JAVA 
programmiert und da liefen Threads ohne Probleme und ohne großen 
Aufwand...

Wie kann ich denn sonst realisieren, mehrere ADC-Eingänge "gleichzeitig" 
abzufragen? Denn sonst wäre das ja sinnlos, dass er überhaupt mehrere 
hat.

Wie dem auch sei, freut mich ja dass ich hier ne Diskussion angestoßen 
habe, aber ich als Neuling stehe immernoch vor dem Library-Problem!

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Manuel schrieb:
> Wie kann ich denn sonst realisieren, mehrere ADC-Eingänge "gleichzeitig"
> abzufragen? Denn sonst wäre das ja sinnlos, dass er überhaupt mehrere
> hat.

was soll denn das? Sotwas wird immer nacheinander gemacht. Auch wenn du 
es über threads macht wird es nicht gleichzeit gemacht. Wo soll das 
Problem sein?

wert[0] = GetADC(1);
wert[2] = GetADC(2);
wert[3] = GetADC(3);
wert[4] = GetADC(4);
wert[5] = GetADC(5);
wert[6] = GetADC(6);

bei java wird ja jeder mist über ein einen Thread gemacht, weil es dort 
teilweise nicht anders geht - aber resourcend schonen ist das bestimmt 
nicht. Ich denke mal das 95% aller Projekte hier ohne Thread arbeiten 
und drozdem scheinbar viele dinge gleichzeig machen.

Autor: mano (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dein Mikro hat einen ADC und der hat 8 Kanäle, oder hebe ich mich 
verschaut?

Autor: roflkartoffel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
der hat genau 1 ADC .. über einen multiplexer werden 8 eingänge 
umgeschalten

wenn du mit threads arbeitest und er würde dir in den thread kotzen und 
dann das sample des ADC4 auf ADC3 ausgeben ... blöd gesagt

du kannst eh nur nacheinander abarbeiten von daher erübrigt sich das 
ganze gethreade


lass den ADC im freerunning mode laufen und mach einen ADC complete 
interupt
wenn der interrupt kommt schalteste den eingang um und speicherst das 
ergebnis
mit dem nächsten interrupt kommt auch das nächste ergebnis
das kannste dann einfach so laufen lassen

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Manuel schrieb:

> wo kann ich denn diese Befehle eingeben?

In einer Shell/Kommandozeile/Eingabeaufforderung (cmd.exe)

Damit das funktioniert muss eine bestimmte Umgebung vorhanden sein. Was 
fehlt, wird man erst sehen, wenn die Fehlermeldungen zu den eingegebenen 
Kommandos kommen -- und so wie's aussieht ist recht wahrscheinlich, daß 
was fehlt.

Autor: Manuel (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
okay ja, dann fehlt da tatsächlich was.

naja, wie dem auch sei, ich komme wirklich ohne Threads aus, war ein 
anderes Problem wodurch ich den Eindruck hatte, der ADC wäre zu langsam.

Passt zwar nicht mehr zum Thread-Namen aber kann mal jemand bei 
Gelegenheit kurz in die Datei gucken und mir sagen, warum ich am PinE3 
und E4 kein PWM-Signal erhalte?! Irgendetwas scheine ich da noch nicht 
ganz verstanden zu haben.
Ich möchte die aus der Spannung am Eingang gewonnene Zahl direkt an den 
PWM weitergeben und dadurch die Pulsweite bestimmen. Ich kann mir auf 
meinem Display die Spannungen, die ich anlege, anzeigen lassen, das 
funktioniert, aber ich bekomm hinten nicht das raus was ich haben 
will...(Nicht über die LCD_Befehle wundern, die sind vom 
Display-Hersteller mitgeliefert)

Autor: Manuel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hm, hat keiner ne Idee für mich? Ich seh den Fehler, auch nach 
vergleichen mit Tutorial und anderen Beiträgen nicht. Eig kann der 
Fehler nur in PWM_Init oder PWM_Set sein, aber keine Ahnung was ich da 
ändern sollte.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
void PWM_Init(void)
{
     DDRE |= (1<<PE3) | (1<<PE4);             // PinE3 und E4 auf Ausgang
    TCCR3A |= (1<<COM3A1) | (1<<COM3B1);     //OC3A PINE3/OC3B PinE4 auf nicht inv.PWM
    TCCR3A = ((1<<WGM31) | (1<<WGM30));      // 10 Bit PWM

mit der 2.ten Zuweisung löscht du dir die bei der ersten Zuweisung 
gesetzten COM Bits wieder.

Autor: Manuel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
äh ja klingt logisch...

gehen tuts leider trotzdem nicht >.<

hab aus verzweiflung jetzt erstmal nur nen anderes Programm zum Dimmen 
einer LED (der LED des Displays, welche an (OC0A/OC1C/PCINT7) PB7 
anliegt) geschrieben, aber nichtmal das geht, bin langsam echt am 
verzweifeln an PWM obwohl das ja eigentlich gar nichts schweres ist. 
sobald ich einmal ein lauffähiges prog habe, bekomm ich es auch sicher 
hin aber irgendwas muss ich scheinbar noch vergessen
#include <stdio.h>
#include <avr/io.h>
#include <util/delay.h>
#include <avr/pgmspace.h>
#include <stdint.h>
#include <glcd-Display3000-211.h>


void delay_ms(uint16_t period);


int main (void)
{

  uint8_t i;  
  char c[8];

  DDRB |= (1<<PB7);



  TCCR0A = (1<<COM0A1) | (1<<WGM00);//Phasenkorrektes PWM, clear on compare match
  TCCR0B = (1<<CS01);                //Prescaler 8
  //sei();

  LCD_Init();
  Orientation = Portrait180;//Ausgaberichtung nach unten 
  delay_ms(1000);            //Display braucht wegen Trägheit bisschen Zeit
  LCD_Cls(white);           // Clear Screen
  
  LCD_Print("Dimmen testen", 0, 10, 1, 1, 2, blue, dark_red);

  

  for(i=0; i<=255; i++)
  {
    OCR0A = i;              //Zählerwert von i für Helligkeit
    itoa(i, c, 10);
    LCD_Print("Dimmwert:", 0, 40, 1, 1, 1, black, white);
    LCD_Print(c, 60, 40, 1, 1, 1, red, white);
    delay_ms(500);

  }

  OCR0A = 130;              //Mittlere Helligkeit zum Ende
  for(;;);


  return 0;
}







/****************************************************************/
void delay_ms(uint16_t period)   //delay routine (milliseconds)
{
  for(unsigned int i=0; i<=period; i++)
    _delay_ms(1);
}

muss ich vielleicht noch soetwas wie global interups enablen oder 
sonstige interrupt-routines? im PWM-modus ja eigentlich nicht?!

Autor: Manuel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann meinen letzten Beitrag hier leider nicht wieder löschen (weil ich 
nicht angemeldet bin?)

aber das LED-Dimm Programm funktioniert doch, die LED des Displays war 
nur über einen Spannungsbooster dauerhaft auf HIGH gestellt, ich musste 
einen Kontakt umlöten.

Zu meinem eigentlichen Programm: ich vermute, dass ich den simplen 
Fehler gemacht habe, OCR3A/B bei Mode 15 (fast PWM, 10-bit) als 
einzustellende Weite genommen habe und nicht als Obergrenze, aber was 
nehme ich denn dann zum einstellen der Pulsweite?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Manuel schrieb:

> Zu meinem eigentlichen Programm: ich vermute, dass ich den simplen
> Fehler gemacht habe, OCR3A/B bei Mode 15 (fast PWM, 10-bit) als
> einzustellende Weite genommen habe und nicht als Obergrenze

Das kann nicht sein.
Bei einer 10-Bit PWM ist die Obergrenze fox auf 10 Bit, also 1024

>, aber was
> nehme ich denn dann zum einstellen der Pulsweite?
OCR3A bzw OCR3B, je nachdem welche Pins du mit den COMxx Bits 
freigegeben hast.

Autor: Manuel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zwar nicht sehr übersichtlich, aber hier die Liste ausm Datenblatt.
Ich hatte Modus 15 eingestellt, dort ist OCRnA Top, habs jetzt auf Modus 
7 geändert, da ist es tatsächlich so wie du meintest und nun 
funktioniert auch alles, danke für die Hilfen!

0 0 0 0 0 Normal 0xFFFF Immediate MAX
1 0 0 0 1 PWM, Phase Correct, 8-bit 0x00FF TOP BOTTOM
2 0 0 1 0 PWM, Phase Correct, 9-bit 0x01FF TOP BOTTOM
3 0 0 1 1 PWM, Phase Correct, 10-bit 0x03FF TOP BOTTOM
4 0 1 0 0 CTC OCRnA Immediate MAX
5 0 1 0 1 Fast PWM, 8-bit 0x00FF BOTTOM TOP
6 0 1 1 0 Fast PWM, 9-bit 0x01FF BOTTOM TOP
7 0 1 1 1 Fast PWM, 10-bit 0x03FF BOTTOM TOP
8 1 0 0 0 PWM, Phase and Frequency Correct ICRn BOTTOM BOTTOM
9 1 0 0 1 PWM,Phase and Frequency Correct OCRnA BOTTOM BOTTOM
10 1 0 1 0 PWM, Phase Correct ICRn TOP BOTTOM
11 1 0 1 1 PWM, Phase Correct OCRnA TOP BOTTOM
12 1 1 0 0 CTC ICRn Immediate MAX
13 1 1 0 1 (Reserved) – – –
14 1 1 1 0 Fast PWM ICRn BOTTOM TOP
15 1 1 1 1 Fast PWM OCRnA BOTTOM TOP

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.