Welcome to our new forum
All users of the legacy CODESYS Forums, please create a new account at account.codesys.com. But make sure to use the same E-Mail address as in the old Forum. Then your posts will be matched. Close

SysMemReallocData / SysMemIsValidPointer

Nina
2017-11-17
2017-12-07
  • Nina - 2017-11-17

    Foldender Code:

    PROGRAM PLC_PRG
    VAR
       _p1:POINTER TO BYTE;
       _p2:POINTER TO BYTE;
       uiCnt:UINT :=4;
       eResult:SysMem.RTS_IEC_RESULT;
    END_VAR
    _p1:=SysMem.SysMemAllocData(szComponent:='', udiSize:=uiCnt, pResult:=ADR(eResult));
    _p2:=SysMem.SysMemReallocData(szComponent:='', pMemory:=_p1, udiSize:=uiCnt, pResult:=ADR(eResult));
    eResult:=SysMem.SysMemFreeData(szComponent:='', pMemory:=_p1);
    eResult:=SysMem.SysMemFreeData(szComponent:='', pMemory:=_p2);
    eResult:=SysMem.SysMemIsValidPointer(ptr:=_p1, udiSize:=uiCnt, bWrite:=TRUE);
    
     
  • Nina - 2017-11-22

    Hallo Codesys Support,

    könntet ihr Frage 1 als Bug bitte fixeden, denn nach der Doku ist dieses Verhalten zweifelsfrei falsch:

    Zitat:
    If the requested memory size cannot made available at the same place (address) , the function will allocate new memory space.

    Danke!

     
  • eschwellinger

    eschwellinger - 2017-11-24

    Hallo,
    auf welchem System/SPS und welcher CODESYS Version
    verwendest du das?
    (Nur als Info für uns/damit ich des einfacher habe)
    Grüße
    Edwin

     
  • Nina - 2017-11-24

    Hallo Herr Schwellinger,

    getestet in hab ich das in Codesys 3.5.11.4 mit der SysMem Version 3.5.5.0 und ControlWin ebenfalls 3.5.11.4.

    Vielen Dank,
    Nina

     
  • Nina - 2017-12-04

    Hallo Herr Schwellinger,

    konnten Sie das nachstellen? Ich kann ihnen auch ein Projektarchiv zukommen lassen...

    VG
    Nina

     
  • eschwellinger

    eschwellinger - 2017-12-07

    Hallo Nina,

    wenn es Control Win ist:

    #1. Wir verwenden den realloc() des Betriebssystems. Und der scheint hier eben einen neuen Speicherbereich zurückzugeben

    #2. Wir verwenden hier ebenfalls die Speicher API des jeweiligen Betriebssystems, um die Gültigkeit eines Speichers abzufragen.
    Der GarbageCollector (CmpMemGC) beinhaltet aktuell bereits die Möglichkeit, allokierte Heap Speicherblöcke zu verwalten.
    Das könnte man auf dem betreffenden Betriebssystem verwenden, um SysMemIsValidPointer() darauf abzustützen.

    #3. Nein, das gibt meist die Speicher API eines OS nicht her die Größe eines Speichers abzufragen

    Grüße
    Edwin

     
  • Nina - 2017-12-07

    Hallo Edwin,

    Danke für die Rückmeldung.

    Gibt es denn einen jira Eintrag um SysMemIsValidPointer auf CmpMemGC abzustützen?

     

Log in to post a comment.