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