Betriebsystem für AVR

Gast #1295689
ich denmke für sowas ist ein AVR ungeeignet, das Verhältnis von 
rechenpower zu Verwaltungsaufansd für multitasking ist zu gering.
Wenn man sowas braucht, sollten man sich nach einem brauchbaream ARM 
oder sowas umsehen.
Gast #1295737
Ist im Wesentlichen nur zu Lernzwecken gedacht. Bevor ich die
Quellen von einem "echten OS" anschaue und mit 100 Konzepten
gleichzeitig erschlagen werde, will ich etwas kleines putziges^^

Das Schema für ein kooperatives OS habe ich schon:
1
#define MAX_TASKS 3
2

3
int task = 0;
4

5
timer_interrupt() {
6
    task++;
7
    task %= MAX_TASKS;
8
}
9

10
void thread0() {
11
    // keine while(1) nötig
12
    if(nix_zu_tun) {
13
        task++;
14
        task %= MAX_TASKS;
15
        return;
16
    }
17
}
18

19
void init() {
20
   setup_timer(10 usec);
21
}
22

23
int main() {
24
   init();
25
   switch(task) {
26
       case 0: thread0(); break;
27
       case 1: thread1(); break;
28
       case 2: thread2(); break;
29
       // ... usw
30
   }
31
}

Wenn ein thread trotzdem auf ihregendeine Weise while(1)
hinbekommt, dann hängt alles.
Etwas ähnliches habe ich auf Linux programmiert. Habe dafür
alarm() system call als Timer missbraucht. Wenn da ein Thread
blockierend liest, dann hängt auch alles.

Ich überlege mir wie ich Speicher "aufteilen" soll, damit jeder
Thread eigenen Stack bekommt.(und weitere Aufrufe tätigen kann)
Bestimmt gibt es andere Probleme, an die ich nicht gedacht habe.
MMU zählt erst mal nicht dazu ;-)

Grüsse
Gast #1295755
FreeRTOS ist ziemlich cool (wurde oben ja schon erwaehnt). Laeuft 
problemlos ab Atmega32. Nur muss man hoellisch aufpassen mit dem 
RAM-Verbrauch, weil jeder Task (logischerweise) seinen eigenen Stack 
unterhaelt.
#1295958
RTOSe gibts für den AVR ne Menge, einfach mal bei AVRfreaks nachschauen 
oder googlen.

Allerdings ist der AVR nicht sonderlich gut dafür geeignet, da er sehr 
wenig SRAM hat.
Pro Task 32 Register sichern, 32 Byte Call-Stack, 32 Byte Variablen, 
also ~100Byte ist nicht viel.
Bei nur 10 Tasks ist dann ein ATmega16 (1kB) rappeldicht zu.
Interrupts sind dabei nichtmal eingerechnet. Auch sonstige 
SRAM-Verbraucher (Display-Buffer, UART-FIFO usw.) kannste knicken.

Ein RTOS geht also nur für sehr kleine und überschaubare Applikationen, 
wo man es eigentlich garnicht bräuchte.


Peter

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.