ATMega16 mit Betriebsystem

OP #515388
Lesenswert?

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
OP #515412
Lesenswert?

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
#515613
Lesenswert?

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
Gast #516021
Lesenswert?

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
Gast #516030
Lesenswert?

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
Gast #516036
Lesenswert?

(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.
OP #516244
Lesenswert?

@ 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
Gast #516605
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren