SysRMAlloc, relocatable memory allocation

  1. Home
  2. Knowledge Base
  3. Manualistica
  4. Programmazione IEC 61131-3
  5. Gestione sistema
  6. SysRMAlloc, relocatable memory allocation

La funzione esegue l'allocazione dinamica di uno spazio di memoria della dimensione in byte definita da parametro Size. Nella variabile DataPtr occorre fornire l'indirizzo del buffer dove la funzione memorizza l'indirizzo alla memoria allocata.

La memoria è allocata nella memoria di sistema e quindi non utilizza la memoria a disposizione del programma utente. La funzione ritorna FALSE se errore allocazione e TRUE se memoria allocata.

Nota

A differenza della funzione SysMAlloc questa funzione permette tramite la funzione SysRMFree di liberare la memoria allocata quando non è più utilizzata, in questo modo è possibile riutilizzare la memoria.

Per ottimizzare l'utilizzo della memoria la memoria allocata viene automaticamente rilocata dal sistema operativo che ne sposta automaticamente l'indirizzo di allocazione aggiornando di conseguenza il buffer che lo contiene. Quindi prima di utilizzarla occorre sempre fare riferimento all'indirizzo memorizzato nel buffer indicato in DataPtr.

Function
CODESYS: Non disponibile
LogicLab: eLLabXUnified12Lib

Size (UDINT) Indica la dimensione in bytes dell'area da allocare.

DataPtr (UDINT) Occorre indicare l'indirizzo del buffer dove memorizzare il puntatore alla memoria allocata.

La funzione ritorna un (BOOL) FALSE se errore allocazione memoria, TRUE se memoria allocata.

Errori

In caso di errore si attiva l'uscita Fault, eseguendo immediatamente dopo la funzione SysGetLastError è possibile rilevare il codice di errore. Fare riferimento alla tabella seguente per la descrizione.

Esempi

Come utilizzare gli esempi.
Al primo loop di esecuzione viene aperta la comunicazione seriale (19200, e, 8, 1), poi ad ogni secondo viene allocato un buffer di memoria di 16 bytes, se l'allocazione non è possibile ad ogni loop viene ritentata.  Se il buffer di memoria viene allocato viene incrementato il valore di un contatore e ne viene inviato il valore come stringa sulla porta seriale ed il buffer di memoria viene liberato.

LogicLab (Ptp116)
PROGRAM ST_SysRMAlloc
VAR
    i : INT; (* Auxiliary counter *)
    NrOfChars : INT; (* Number of printed chars *)
    Counter : UDINT; (* Counter *)
    SOut : @USINT; (* String output pointer *)
    TimeBf : UDINT; (* Time buffer (uS) *)
    BSize : UINT := 16; (* Buffer size definition *)
    Sp : SysSerialPort; (* Serial port *)
END_VAR

// *****************************************************************************
// PROGRAM "ST_SysRMAlloc"
// *****************************************************************************
// An example of how allocate a memory buffer and how to use it.
// -----------------------------------------------------------------------------

    // -------------------------------------------------------------------------
    // INITIALIZATION
    // -------------------------------------------------------------------------
    // First program execution loop initializations.

    IF (SysFirstLoop) THEN
        Sp.COM:=ADR('COM0'); //COM port definition
        TimeBf:=SysGetSysTime(TRUE); //Time buffer (uS)
    END_IF;

    // Exit if COM port not opened.

    IF NOT(Sp.Opened) THEN RETURN; END_IF;

    // -------------------------------------------------------------------------
    // COUNT AND SENDING VALUE
    // -------------------------------------------------------------------------
    // Every 1 second print out the counter value.

    IF ((SysGetSysTime(TRUE)-TimeBf) > 1000000) THEN

        // Try to allocate memory, when it's possible counter is managed.

        IF (SysRMAlloc(BSize, ADR(SOut))) THEN
            TimeBf:=SysGetSysTime(TRUE); //Time buffer (uS)
            Counter:=Counter+1; //Counter
            NrOfChars:=SysVarsnprintf(SOut, BSize, 'Counter:%04d$r$n', VR_TYPE#UDINT_TYPE, ADR(Counter));
            i:=Sysfwrite(SOut, NrOfChars, 1, Sp.File);
            i:=SysRMFree(ADR(SOut)); //Fre memory
        END_IF;
    END_IF;

// [End of file]

Ti è stato utile questo articolo ?

Ultimo aggiornamento: 19 Agosto 2019