Noch ein RTOS

OP #3728804
Lesenswert?

Ich schlage mich gerade mit einem STM32F401 herum und probiere so 
einiges aus. Unter Anderem Habe ich ein RTOS gesucht, dass auf 
verschiedenen Contollern einfach zum Laufen zu bringen ist. Nun gibt es 
reichlich RTOS-Ports für zahlreiche Controller, selten aber, ein RTOS 
das sowohl auf einem Renesas als auch auf einem STM läuft. Ich könnte 
zwar ein RTOS für den STM nehmen und das auf den Renesas portieren, aber 
das ist mehr oder weniger zeitaufwändig, meist müssen ja iwelche 
spezifischen Eigenheiten der Controller angepasst werden und das oftmals 
auch noch in Assembler.
Nach stundenlangem Suchen im WWW bin ich dann über ein in C 
geschriebenes RTOS gestolpert.

http://www.raffia.ch/?RTOS_MiniOS

Damit es ans Laufen kommt ist lediglich ein Timertick erforderlich in 
dem eine OS-Spezifische Routine aufgerufen wird.
Zum eigenen Projekt müssen dann noch die runtergeladenen Header- und 
Sourcedateien hinzugefügt werden. Das war's. Ich habe etwa 1h gebraucht, 
bis ich begriffen habe was nötig ist und ich eine fehlerfreie 
Kompilation erhielt.
Meine ermittelten Daten:
Controller STM32F401RC, Sysclock (Core-Frequenz) 144MHz.
2 Tasks werden aufgerufen. Die eine setzt einen Portpin auf High, die 
andere auf Low:
1
//-----------------------------------------------------------------------
2
void Task0(void)
3
{
4
    while (1)   // Task Endlos-Loop
5
    {
6
        SCHEDULE(); // Switch zum Kernel
7
        g_LEDPC5Off();
8
    } // no Return
9
}
10
//----------------------------------------------------------------------
11
void Task1(void)
12
{
13
    while (1)  // Task Endlos-Loop
14
    {
15
        SCHEDULE(); // Switch zum Kernel
16
        g_LEDPC5On();
17
    } // no Return
18
}
19
//----------------------------------------------------------------------
20
int main(void)
21
{
22
    InitSystem();   //Clock, Ports usw.
23
    while(1)
24
    {
25
        OS_Execute();
26
        OS_Schedule();
27
        if (ERROR == ERR_ISR_NOTIFY || ERROR == ERR_ISR_SEMOVFL) 
28
        {
29
             while (1);        // stop if error in ISR
30
        }
31
    }
32
}
33
//----------------------------------------------------------------------
Mit dem Scope habe ich 3,7µs Low-Time und 3,7µs High-Time ermittelt. Ich 
kann also interpretieren, das ein Taskwechsel rund 3,7µs dauert.
Für meine Anwendungen schnell genug, immerhin bleiben bei einem 
"OS_Timer_Tick" von 1000µs noch 996µs für die eigentliche Arbeit übrig.
Wie gut und stabil das OS läuft kann ich noch nicht sagen. Ich spiele 
jetzt erstmal mit den Smaphoren und Mailboxen rum.
So, das wars. Viel Spaß euch allen.
Matthias
#3730354
Lesenswert?

Matthias G. schrieb:
> Jan S. schrieb:
>> http://www.chibios.org mal angeschaut?
>
> Nur oberflächlich. Scheint mir aber so, dass da auch ein erheblicher
> Aufwand erforderlich ist um das RTOS zu portieren und das wollte ich
> eben vermeiden.

Ich weiß nicht welchen Renesas du verwenden möchtest. Ich habe ChibiOS 
erwähnt, weil es für so ziemlich alle STM eine Portierung gibt sowie 
eine experimentelle für den RX62N: 
http://svn.code.sf.net/p/chibios/svn/branches/rx_dev/
#3733598
Lesenswert?

Angeregt durch deinen Beitrag habe ich mir Mini-OS mal geholt und 
versucht, es auf einen ATMega zu portieren. Wenn man dem Compiler 
jegliche Optimierung verbietet, sind rudimentäre Funktionen machbar. 
Ansonsten crasht es sofort. Und nach einem kurzen Blick in den 
Quelltext, wird auch klar, warum das so sein muss. Und dann versteht man 
auch den Hinweis im Handbuch, dass nach einem Taskwechsel lokale 
Variable im Eimer sind und auch der Stack etwas anders ist.

Fazit: Ab in die Tonne damit.
#3734257
Lesenswert?

Marcus H. schrieb:
> eine Textstelle

Handbuch, Seite 7, "Wichtige Hinweise"
Lokale Task-Variablen und Rücksprungadressen bleiben nach einem Kontext-
Switch nicht erhalten.

Ich habe zuerst drüber hinweg gelesen, wer rechnet auch mit solchen 
Einschränkungen. Nochmals, ganz langsam geschrieben: Im Taskwechsel 
werden keine Register gerettet. Unglaublich...

FreeRTOS habe ich mittlerweile auch mal probiert. Ein Wust an Files und 
Verzeichnissen, unübersichtlich. Und der vorhandene Port für den 
ATMega128 passt nicht zum aktuellen System. Unter anderem wurden Namen 
von Systemvariablen munter geändert. Viel Arbeit, um den ersten Schritt 
machen zu können.
Gast #3734270
Lesenswert?

Schon  8 Jahre alt das Zeug.
Also nicht gepflegt.

Schade  dass im Internet  soviel altes Geraffel herumfliegt
dass endlich mal gelöscht gehörte.

Eigentlich erstaunlich dass Linux  nicht auch diesen Weg gegangen ist.
#3735223
Lesenswert?

@Georg
Schau Dir mal scmrtos an: http://scmrtos.sourceforge.net/ScmRTOS
Sehr schlank, sehr einfach gehalten. Man hat sofort ein Aha-Erlebnis.

Habe damit sehr lange gearbeitet (MCU war ein STM32F4; aber es gibt auch 
ein AVR-Port). Keinerlei Probleme.
Aber da es seit 2 Jahren auch dort Funktstille herrscht, habe ich 
vorsichtshalber auf ChibiOS umgesattelt (wobei ich dort nur das RTOS 
(ohne das HAL) benutze).

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