Forum: Mikrocontroller und Digitale Elektronik RTOS, Lib-Funktionen schützen?


von Stephan (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Leute,

ich hab beim stöbern auf http://www.koders.com was interessantes für 
mich gefunden.

"memb.h"
"memb.c" <- ist im Anhang

ich würde gerne dieses Konzept für mich in ähnlicher Version nutzen 
wollen.
Das ist das Beispiel im c-File:
1
 #include "memb.h"
2
 
3
 MEMB(cmem, 20, 8);
4
5
 int main(int argc, char *argv[]) {
6
    char *ptr;
7
    
8
    memb_init(&cmem);
9
10
    ptr = memb_alloc(&cmem);
11
12
    if(ptr != NULL) {
13
       do_something(ptr);
14
    } else {
15
       printf("Could not allocate memory.\n");
16
    }
17
18
    if(memb_free(&cmem, ptr) == 0) {
19
       printf("Deallocation succeeded.\n");
20
    }
21
 }

Jetzt zu meiner Frage:
wie kann ich diese Lib. für ein RTOS sicher machen??? (FreeRTOS)
Da alle Funktionen auf den gleichen Speicher zugreifen ist das etwas 
schwieriger für mich!

einzelne Funktionen und Anweisungen schütze ich so:
1
taskENTER_CRITICAL();
2
:
3
code
4
:
5
taskEXIT_CRITICAL();

Meine Überlegung war das ich in jeder Funktion mir den gemeinsam 
genutzen Speicher per Bin-Semaphor reserviere und das darüber steuere.
Aber ich glaub es gibt bestimmt einen besseren weg, oder?

mfg
Stephan

von Dirk (Gast)


Lesenswert?

In FreeRTOS selber wird das im 3. Beispiel ganz simpel so gemacht:
1
#include <stdlib.h>
2
3
#include "FreeRTOS.h"
4
#include "task.h"
5
6
/*-----------------------------------------------------------*/
7
8
void *pvPortMalloc( size_t xWantedSize )
9
{
10
void *pvReturn;
11
12
  vTaskSuspendAll();
13
  {
14
    pvReturn = malloc( xWantedSize );
15
  }
16
  xTaskResumeAll();
17
18
  return pvReturn;
19
}
20
/*-----------------------------------------------------------*/
21
22
void vPortFree( void *pv )
23
{
24
  if( pv )
25
  {
26
    vTaskSuspendAll();
27
    {
28
      free( pv );
29
    }
30
    xTaskResumeAll();
31
  }
32
}


Ich würde das an Deiner Stelle auch so machen. Wenn Du mehr Speed 
brauchst, solltest Du die Speicherverwaltung eh an Deine Bedürfnisse 
anpassen.

von aha (Gast)


Lesenswert?

Das Verwalten von Speicher ist als Resource zu betrachten und mit einer 
Semaphore zu schuetzen. Viele Leute vermeiden deshalb auch dynamisches 
Memory und arbeiten mit fest allozierten Strukturen.

von tuppes (Gast)


Lesenswert?

Alle Tasks suspendieren und wieder loslassen kann teuer werden, je 
nachdem, wie viele Tasks da sind.

Es wird schneller sein, vorübergehend die globale Interrupt-Freigabe 
wegzunehmen - dann wird man auch nicht mehr unterbrochen.

Man muss dann wohl damit leben, dass alle Interrupts für einen kurzen 
Moment ausgebremst sind - wenn die Applikation das erträgt, ist es 
vielleicht das kleinere Übel.

Noch eine Alternative: Nur den Interrupt des RTOS-Timers sperren, die 
anderen weiterlaufen lassen. Konsequenz: Man verpasst eventuell einen 
Timertick, und die Uhr geht nach.

Die Moral von der Geschicht: Es gibt kein Patentrezept. Es gibt mehrere 
Wege, man muss den wählen, der den kleinsten Schaden anrichtet.

von (prx) A. K. (prx)


Lesenswert?

tuppes wrote:

> Alle Tasks suspendieren und wieder loslassen kann teuer werden, je
> nachdem, wie viele Tasks da sind.

Der Name des API täuscht. Er schaltet lediglich den Scheduler ab.

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