RTOS, Lib-Funktionen schützen?

Gast #1093929
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
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
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.
Gast
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

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.