Forum: Mikrocontroller und Digitale Elektronik Erfahrungen mit RTOS auf Atmega1280 oder Atmega2560


von Tobias G. (t-g-laeser)


Lesenswert?

Hallo Forengemeinde,

Für ein Projekt habe ich mich entschlossen ein RTOS auf einem Atmega 
einzusetzen. Die Schaltung besteht soweit schon und es sollen sehr viele 
unterschiedliche Sachen erledigt werden.
Bisher habe ich keinerlei Erfahrung mit RTOS auf AVR hab mich aber die 
letzten Wochen durch diverse Foren und Code-Beispiele gelesen.

Benötigte Funktionen:
alle 16 AD-Ports auslesen und bearbeiten
5 Taster auslesen und bearbeiten
8 LEDs
8 Dip-Schalter
Display (4-Wire-Daten, 4x20 Zeichen)
I2C: Temperatur, Porterweiterung, Lichtsensor, RTC, ADC, EEPROM
Hupe (Einfaches I/O Signal)

Nun ist mir leider kein passendes RTOS über den Weg gelaufen, bzw ich 
habe keine richtige Ahnung was für mich am geeignetsten wäre.

gut 10 Tasks sollte es haben und wenig Speicher benötigen. Aber wie kann 
ich Displayfunktionen und die Werte der AD-Wandler in allen Tasks 
verwenden?

Ich wäre Euch für eine Starthilfe in dem Bereich RTOS speziell für den 
µC (Atmega1280 oder Atmega2560) sehr dankbar!

Mit freundlichen Grüßen
Tobias Gläser

von (prx) A. K. (prx)


Lesenswert?

Worum geht es? Willst du ein bestimmtes Problem lösen, oder willst du 
dich unbedingt mit einem RTOS befassen?

Um rauszukriegen, wie man mit einem RTOS gemeinsame Resourcen korrekt 
verwendet, kann man auch mit dem PC anfangen. Multithreading geht 
nämlich ähnlich und die Prinzipien von Semaphoren, Queues, Timern und 
Critical Sections sind ziemlich universell. FreeRTOS kann man ebenfalls 
auf dem PC unter Windows nutzen, um damit Erfahrung zu gewinnen ohne 
sich mit den eingeschränkten Debugging eines Mikrocontrollers plagen zu 
müssen.

von Tobias G. (t-g-laeser)


Lesenswert?

Hallo A. K.,

mit RTOS auf dem PC habe ich mich bereits im Studium befasst.
Die Platine mit den oben genannten Funktionen ist bereits fertig 
entwickelt.
Eine Lösung mit einem normalem Programm wäre sicherlich möglich, aber 
bestimmt nicht so schön wie mit einem RTOS und Multitasking.

Die Frage ist eigentlich, ob jemand schonmal ein umfangreicheres Projekt 
mit einem RTOS auf einem solchem AVR (Atmega1280 oder Atmega2560) 
gemacht hat und dieses zuverlässig und ohne Speicherprobleme läuft.
(am besten mit gcc, zur Not auch IAR)

Mit freundlichen Grüßen
Tobias Gläser

von Arne (Gast)


Lesenswert?

Ich habe mal ein Projekt mit pC/OS (http://www.embedded-os.de) begonnen. 
Brauche es eigentlich nicht, war mehr Neugierde in Bezug auf RTOS. Habe 
es bis dato noch nicht beendet, da ich die HW nicht fertig habe, die die 
Sensoren auswertet.

von Peter D. (peda)


Lesenswert?

Tobias Gläser schrieb:
> Eine Lösung mit einem normalem Programm wäre sicherlich möglich, aber
> bestimmt nicht so schön wie mit einem RTOS und Multitasking.

Kommt drauf an, welche Schönheit Du meinst.
Zumindest wäre es schneller bwz. bräuchte weniger Ressourcen.

Ein normales Programm (Main-Loop) heißt ja nicht, Spaghetticode 
schreiben zu müssen.
Man kann auch dann prima kleine Module schreiben und aufrufen.
Das ist auch sehr übersichtlich und erweiterbar.

Die ADCs und Tasten kann man prima im Timerinterrupt auslesen bzw. 
entprellen.
Ebenso kann man dem LCD einen Textspeicher spendieren, der dann alle 
200ms an das LCD geschickt wird oder im Timerinterrupt etwa ein Byte/ms.

Die Main-Routinen holen sich dann alles nur aus dem SRAM bzw. schreiben 
dahin. Haben also keinerlei unnötige Wartezeiten.


Peter

von Uwe (de0508)


Lesenswert?

Hallo,

ich kann Peter nur zustimmen und verweise auf den von ihm geschriebenen 
Scheduler:

Beitrag "Wartezeiten effektiv (Scheduler)"

Ich hatte erst cocoOS http://www.cocoos.net/ verwendet, das mir aber für 
die einfachen Aufgaben schon zu viel Code verbraucht.

Bei Peters Ansatz läuft ein Timer mit 1ms Takt, das ist der Systemtakt.
In der ISR wird bei einem meiner Programme die Eingangspins entprellt 
und auch eine Drehgeber (2-fach) abgefragt.

Die Verschiedene "Tasks" rufen sich teilweise gegenseitig auf, oder 
kommunizieren über Semaphore (TRUE / FALSE) miteinander.
Der Datenaustausch zwischen den Tasks erfolgt über globale (statische) 
Speicherbereiche.

Z.B. habe ich die Kodierung von Morsezeichen für ein Bakenprojekt über 
die Verkettung von einigen Tasks realisiert.
1
/* TASK Prototypen */
2
static void task_key_press(void);
3
static void task_key_release(void);
4
static void task_trx_on_traeger(void);
5
static void task_trx_off_traeger(void);
6
static void task_trx_bake(void);
7
static void task_morse_ch(void);
8
static void task_morse_pause(void);

Ich muss z.B. die steigende und fallende Flanke einer "Taste" 
verarbeiten, deshalb rufen sich die Tasks
1
task_key_press()
 und
1
task_key_release()
 gegenseitig auf:

Hier ein Auszug wie schön leserlich ein Programm werden kann, die 
Funktion der Makros (alles in GROSSBuchstaben) kann man sich denken:
1
static void task_key_press(void)
2
{
3
  if ( get_key_press( _BV(KEYER_BIT) ) ) {
4
5
    PWM_ON();      // 660Hz on
6
    SET_OFF(TRX);    // on
7
8
    sem_trx_send = TRUE;
9
    REM_SCHEDULER_DEAD_TIME();    // und alle anderen Tasks !
10
11
    ADD_SCHEDULER_KEYRELEASE();
12
  } else {
13
    ADD_SCHEDULER_KEYPRESS();
14
  }
15
}
16
17
static void task_key_release(void)
18
{
19
  if ( get_key_release( _BV(KEYER_BIT) ) ) {
20
21
    PWM_OFF();      // 660Hz off
22
    SET_ON(TRX);    // off
23
24
    sem_trx_send = FALSE;
25
    ADD_SCHEDULER_DEAD_TIME();
26
27
    ADD_SCHEDULER_KEYPRESS();
28
  } else {
29
    ADD_SCHEDULER_KEYRELEASE();
30
  }
31
}

|ADD_SCHEDULER_DEAD_TIME| starte nach 30 Sekunden, wenn am Eingang |KEYER_BIT| 
kein Signal anliegt.
1
///////////////////////////////////////
2
// ADD_SCHEDULER_DEAD_TIME();
3
static void task_trx_on_traeger(void)
4
{
5
  if (!sem_trx_send) {
6
    PWM_ON();
7
    SET_OFF(TRX);
8
    timeradd( task_trx_off_traeger, SECONDS(1) );
9
  }
10
}

Nachtrag, das gesamte Bakenprojekt mit allen Daten etc. benötigt:
1
avr-size main.elf 
2
   text     data      bss      dec      hex  filename
3
   2172      142       50     2364      93c  main.elf

Es passt damit nicht mehr in ein attiny25 aber der attiny45v wurde dann 
für den Sender gewählt.

Mit diesem Taskmodel kann man auch einfach Flussdiagramme oder 
Petrienetze in Codeform bringen.

.

von Tobias G. (t-g-laeser)


Lesenswert?

Vielen Dank für Eure schnellen Antworten!

Arne schrieb:
> Ich habe mal ein Projekt mit pC/OS (http://www.embedded-os.de) begonnen.
> Brauche es eigentlich nicht, war mehr Neugierde in Bezug auf RTOS. Habe
> es bis dato noch nicht beendet, da ich die HW nicht fertig habe, die die
> Sensoren auswertet.
Sieht sehr interessant aus, aber für mich als neuling im Bezug auf RTOS 
auf AVR etwas unverständlich und vermutlich schwer "anpassbar". USB, 
File-Systems, Netzwerk, ... kommt bei mir alles nicht zum Einsatz. Eher 
einfache digitale/analoge Signale.

Peter Dannegger schrieb:
> Kommt drauf an, welche Schönheit Du meinst.
> Zumindest wäre es schneller bwz. bräuchte weniger Ressourcen.
Das ist mir schon wichtig. Allgemein gefallen mir die Vorteile von RTOS 
sehr, deswegen möchte ich mich auch damit beschäftigen.

Peter Dannegger schrieb:
> Man kann auch dann prima kleine Module schreiben und aufrufen.
> Das ist auch sehr übersichtlich und erweiterbar.
Meine bisherigen Programmierprojekte bestanden immer aus Modulen, die 
durch Interrupts und Timer aufgerufen werden.
Aber wie kann ich diesen nun Prioritäten etc zuordnen, damit diese wie 
im RTOS ablaufen?

Uwe S. schrieb:
> ich kann Peter nur zustimmen und verweise auf den von ihm geschriebenen
> Scheduler:
>
> Beitrag "Wartezeiten effektiv (Scheduler)"
>
> Ich hatte erst cocoOS http://www.cocoos.net/ verwendet, das mir aber für
> die einfachen Aufgaben schon zu viel Code verbraucht.
Vielleicht ist diese Frage nun etwas blöd, aber was unterscheidet das 
nun von einem kompletten RTOS? Das ist doch komplett mit Tasks etc, oder 
täusch ich mich nun?
CocoOS sieht auch sehr interessant aus, aber eben wie bei allen anderen 
OS wie FreeRTOS etc., fehlt mir der "Arschtritt" und Anfang richtig 
damit umzugehen.

Uwe S. schrieb:
> Mit diesem Taskmodel kann man auch einfach Flussdiagramme oder
> Petrienetze in Codeform bringen.
Wie ist es mit mehreren zeitproblematischen Ereignissen hier?

Mit freundlichen Grüßen
Tobias Gläser

EDIT: Habe mich die letzten Wochen etwas mit 
http://www.femtoos.org/index.html beschäftigt...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.