<?xml version="1.0" encoding="utf-8"?>
<feed xml:lang="en" xmlns="http://www.w3.org/2005/Atom"><title>Recent posts to CODESYS Shared Memory Raspberry Pi</title><link href="https://forge.codesys.com/forge/talk/Runtime/thread/94ebfa6696/" rel="alternate"/><link href="https://forge.codesys.com/forge/talk/Runtime/thread/94ebfa6696/feed.atom" rel="self"/><id>https://forge.codesys.com/forge/talk/Runtime/thread/94ebfa6696/</id><updated>2022-06-21T13:22:05.718000Z</updated><subtitle>Recent posts to CODESYS Shared Memory Raspberry Pi</subtitle><entry><title>CODESYS Shared Memory Raspberry Pi</title><link href="https://forge.codesys.com/forge/talk/Runtime/thread/94ebfa6696/?limit=25#a68b" rel="alternate"/><published>2022-06-21T13:22:05.718000Z</published><updated>2022-06-21T13:22:05.718000Z</updated><author><name>ravi</name><uri>https://forge.codesys.com/u/ravi/</uri></author><id>https://forge.codesys.comb531effb5f0e8bd5411498289a299cfbb266664d</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;Hello, Greetings!, &lt;/p&gt;
&lt;p&gt;We are trying to utilize CODESYS Shared Memory on Raspberry Pi 4, we are unable to move forward due to Segmentation fault in Pi OS (c program compiled using gcc). On running, a valid memory address is shown in CODESYS but unable to read it on Pi using the c program. Appreciate your help.&lt;/p&gt;
&lt;p&gt;CODESYS IDE Version 3.5.18.20&lt;br/&gt;
Raspberry Pi 4&lt;br/&gt;
CODESYS Runtime 4.4.0.0 is installed on Pi&lt;/p&gt;
&lt;h2 id="step-1"&gt;Step 1 :&lt;/h2&gt;
&lt;p&gt;Create a structure structWrite of type DataExchange&lt;br/&gt;
Write a static value 300 to structWrite.Val1&lt;br/&gt;
Create a named shared memory "ShMem"&lt;br/&gt;
Write the value structWrite.Val1 to shared memory&lt;/p&gt;
&lt;h2 id="step-2"&gt;Step 2 :&lt;/h2&gt;
&lt;p&gt;Create a structure DataExchange&lt;br/&gt;
Create a prointer *pRead to DataExchange&lt;br/&gt;
Open the shared memory "ShMem" using shm_open()&lt;br/&gt;
Tried using O_CREAT | O_RDWR, S_IRWXU | S_IRWXG flags.. did not work&lt;br/&gt;
Map to the shared memory using mmap()&lt;br/&gt;
Read value and print&lt;br/&gt;
Unmap using munmap()&lt;br/&gt;
Unlink using shm_unlink()&lt;/p&gt;
&lt;h2 id="error"&gt;Error** :&lt;/h2&gt;
&lt;p&gt;shm_open() is failed and returns -1 &lt;br/&gt;
Not able to read shared memory&lt;br/&gt;
Generates Segmentation fault&lt;/p&gt;
&lt;p&gt;Here is the code for reference:&lt;/p&gt;
&lt;h2 id="codesys-program"&gt;Codesys Program:&lt;/h2&gt;
&lt;h2 id="declarations"&gt;Declarations:&lt;/h2&gt;
&lt;p&gt;TYPE DataExchange :&lt;br/&gt;
STRUCT&lt;br/&gt;
    Val1 : DINT;&lt;br/&gt;
END_STRUCT&lt;br/&gt;
END_TYPE&lt;/p&gt;
&lt;p&gt;PROGRAM PLC_PRG&lt;br/&gt;
VAR&lt;br/&gt;
    hShMemWrite: RTS_IEC_HANDLE;&lt;br/&gt;
    ResultWrite: RTS_IEC_RESULT;&lt;br/&gt;
    WriteResult: RTS_IEC_RESULT;&lt;br/&gt;
    structWrite: DataExchange;&lt;br/&gt;
    ulSize: UDINT := SIZEOF(structWrite);&lt;br/&gt;
    create: BOOL ;&lt;br/&gt;
    iWrite: __UXINT;&lt;br/&gt;
END_VAR&lt;/p&gt;
&lt;h2 id="code"&gt;Code:&lt;/h2&gt;
&lt;p&gt;IF not create THEN&lt;br/&gt;
    structWrite.Val1:=300;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nt"&gt;hShMemWrite&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nt"&gt;SysSharedMemoryCreate&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'ShMem'&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;0&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;ADR&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;ulSize&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="nt"&gt;ADR&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;ResultWrite&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
&lt;span class="nt"&gt;iWrite&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nt"&gt;SysSharedMemoryWrite&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;hShMemWrite&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;0&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;ADR&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;structWrite&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="nt"&gt;SIZEOF&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;structWrite&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="nt"&gt;ADR&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;WriteResult&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;

&lt;span class="nt"&gt;create&lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="nt"&gt;TRUE&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;END_IF;&lt;/p&gt;
&lt;h2 id="c-program"&gt;C Program&lt;/h2&gt;
&lt;p&gt;(compiled using gcc)&lt;/p&gt;
&lt;p&gt;include &amp;lt;stdio.h&amp;gt;&lt;br/&gt;
include &amp;lt;stdlib.h&amp;gt;&lt;br/&gt;
include &amp;lt;sys mman.h=""&amp;gt;&lt;br/&gt;
include &amp;lt;sys stat.h=""&amp;gt;&lt;br/&gt;
include &amp;lt;fcntl.h&amp;gt;&lt;br/&gt;
include &amp;lt;unistd.h&amp;gt;&lt;br/&gt;
include &amp;lt;string.h&amp;gt;&amp;lt;/string.h&amp;gt;&amp;lt;/unistd.h&amp;gt;&amp;lt;/fcntl.h&amp;gt;&amp;lt;/sys&amp;gt;&amp;lt;/sys&amp;gt;&amp;lt;/stdlib.h&amp;gt;&amp;lt;/stdio.h&amp;gt;&lt;/p&gt;
&lt;p&gt;struct DataExchange &lt;br/&gt;
{&lt;br/&gt;
    int i1;&lt;br/&gt;
};&lt;/p&gt;
&lt;p&gt;int main(int argc, char *&lt;em&gt;argv)&lt;br/&gt;
{&lt;br/&gt;
    struct DataExchange &lt;/em&gt;pRead;&lt;br/&gt;
    char sSharedMemReadName&lt;span&gt;[100]&lt;/span&gt; = "ShMem"; &lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c"&gt;/*int fdRead = shm_open(sSharedMemReadName, O_CREAT | O_RDWR, S_IRWXU | S_IRWXG);*/&lt;/span&gt;

&lt;span class="nt"&gt;int&lt;/span&gt; &lt;span class="nt"&gt;fdRead&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nt"&gt;shm_open&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"ShMem"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;O_RDONLY&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;S_IRUSR&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;span class="nt"&gt;printf&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Shared Memory Read: %s %d\n\n"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;sSharedMemReadName&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;fdRead&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="nt"&gt;ftruncate&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;fdRead&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;sizeof&lt;/span&gt;&lt;span class="o"&gt;(*&lt;/span&gt;&lt;span class="nt"&gt;pRead&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
&lt;span class="nt"&gt;pRead&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nt"&gt;mmap&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;0&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;sizeof&lt;/span&gt;&lt;span class="o"&gt;(*&lt;/span&gt;&lt;span class="nt"&gt;pRead&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="nt"&gt;PROT_READ&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nt"&gt;PROT_WRITE&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;MAP_SHARED&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;fdRead&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;0&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;span class="nt"&gt;printf&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"pRead-&amp;gt;i1: %d : %d\n"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;pRead-&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nt"&gt;i1&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;span class="nt"&gt;close&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;fdRead&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="nt"&gt;munmap&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;pRead&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;sizeof&lt;/span&gt;&lt;span class="o"&gt;(*&lt;/span&gt;&lt;span class="nt"&gt;pRead&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
&lt;span class="nt"&gt;shm_unlink&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;sSharedMemReadName&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;span class="nt"&gt;exit&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;0&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;}&lt;/p&gt;&lt;/div&gt;</summary></entry></feed>