Hallo ich bin neu hier wollte wissen ob jemand von euch schon Erfahrung mit einem RTOS auf dem ATMega16 hat. Hätte da auch eine Bitte oba jemand ein funktionierendes BSP. für das RTOS AVRX hat und er mir dieses hier posten könnte! Mittlerweile habe ich schon ein funktionierendes Programm auf dem ATMega16, dass unter dem Betriebssystem FreeRTOS. mfg Danke im Voraus Penzi
Ich bins nochmal habe jetzt hier mein Test Programm für das AvrX RTOS im Dateianhang! Vielleich findet jemand von euch den Fehler in meinem Programm! Das kompilen für den ATMega16 funktioniert ohne Fehler auch das Programmieren funktioniert einwandfrei, doch danach tut sich nichts! danke mfg Penzi
Das hab ich auch schon bemerkt weis aber nicht warum! neuer Versuch!!!
Bei uns funktionierts auf einem ATmega32, wir machen es aber ein bischen anders. Die Tasks werden mit AVRX_GCC_TASKDEF() definiert, z.B. AVRX_GCC_TASKDEF(task1, 100, 2) { DDRB = 0xFF; PORTB = 0xFF; while(1) { AvrXWaitSemaphore(&TimerSemaphore); PORTB ^= _BV(PORTB0); } } Und AvrXRunTask bekommt den TCB als Parameter, also : AvrXRunTask(TCB(task1)); Grüße Klaus
Also habe das jetzt versucht! Programm nochmals im Anhang falls sich jemand dafür interessiert!!! Bin schön langsam am verzweifeln vieleicht könnte mir jemand ein funktionierendes Programm posten danke
Ich bins nochmal so bin jetzt soweit, dass zumindes PORTB0 leuchtet dies bringt mich schon mal eine große Schritt nach vorne! Schaut euch bitte das Programm von mir an und versucht den Fehler zufinden, denn eigenlich sollte auch PORTB1 leuchten oder verstehe ich hier etwas falsch? mfg Daniel
Müsstest Du nicht noch irgendwo mit der cli(); Anweisung die Interrups freigeben...??? (vor oder nach Epilog) MfG Peter
Ich habe jetzt am Wochenende keinen Zugang zu dem Quellcode, aber ich denke nicht daß IntProlog() und Epilog() in der Interrupt routine nötig sind. Das EndCriticalSection() ist auch eher falsch, das sollte immer paarweise mit BeginCritical() auftauchen. In diesem Fall reaktiviert es die Interrupts, keine gute Idee. Klaus
Entschuldigung, habe gerade gesehen, daß das im Tutorial genauso angegeben ist. Wird also doch stimmen. Klaus
Deine Tasks geben die Kontrolle nie ab. Außerdem haben beide die selbe Priorität, weiss nicht ob das richtig ist. Bau einmal eine Wartezeit in deine Tasks ein, so wie folgt AVRX_TASKDEF(myTask, 10, 3) { TimerControlBlock MyTimer; while (1) { AvrXDelay(&MyTimer, 10); // 10ms delay // Hier die Ports togglen } } Klaus
(1) Dein
1 | while(AvrXIntTestSemaphore(&TimerSemaphore) == SEM_WAIT) |
2 | AvrXIntSetSemaphore(&TimerSemaphore); |
3 | AvrXIntSetSemaphore(&TimerSemaphore); |
wird der Compiler so sehen:
1 | while(AvrXIntTestSemaphore(&TimerSemaphore) == SEM_WAIT) { |
2 | AvrXIntSetSemaphore(&TimerSemaphore); |
3 | }
|
4 | AvrXIntSetSemaphore(&TimerSemaphore); |
Ausserdem ist es höchst unsauber, in Interrupts zu warten. (2) Das Statement
1 | PORTB ^= _BV(PORTB0); |
ist nicht Interrupt-fest, folglich auch in einem preemptiven RTOS bei eingeschalteten Interrupts nicht nicht korrekt. (3) Der Port sollte genau 1x initialisiert werden. NIcht in jeder Task.
A.K. wrote: > (2) Das Statement >
1 | > PORTB ^= _BV(PORTB0); |
2 | >
|
> ist nicht Interrupt-fest, folglich auch in einem preemptiven RTOS bei > eingeschalteten Interrupts nicht nicht korrekt. Wieso? Das ergibt cbi PORTB, 0.
Das wird ohne Abschalten der Interrupts nur sicher, wenn man einen neueren Controller (z.B. Mega644) nimmt, und daraus
1 | PINB=_BV(PORTB0) |
macht.
@ Klaus Falser Habe das mit den warte zeiten ausprobiert jetzt leuchtet tut sich garnichts mehr. Wenn ich jetzt die Wartezeit des jeweiligen Tasks auskommentiere leuchtet dieser wider. @ All danke für die schnellen antworten auch wenn sie mir nicht weiterhelfen mfg Daniel
Ich denke, daß der Timer nicht korrekt funktioniert. Hast Du die Initialisierung des Timer selbst ausgerechnet oder nur das Beispiel abgeschrieben? Du mußt den Timer so setzen, daß er mit deiner Oszillatorfrequenz alle 1 ms einen Interrupt erzeugt. Kannst Du das ganze nicht auch im AVR Studio simulieren? Klaus
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.