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
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.
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
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.
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
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. .
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.