RTOS, Lib-Funktionen schützen?

Gast #1093929
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
Angehängte Dateien:
Gast #1093970
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.
Gast #1094219
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.

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