Jump to content
Форум по продукции MOXA

Разделяемая память. Применял ли кто? Если да, то как?


Recommended Posts

Доброго времени суток.

Вроде Linux... но при компиляции:

igor@debian-i:/home/ext_projects/shared_mem/w1$ make
/usr/local/arm-linux/bin/arm-linux-gcc -c -Wall main.c -o main.o
main.c: In function `main':
main.c:41: error: `S_IRWXO' undeclared (first use in this function)
main.c:41: error: (Each undeclared identifier is reported only once
main.c:41: error: for each function it appears in.)
main.c:41: error: `S_IRWXG' undeclared (first use in this function)
main.c:41: error: `S_IRWXU' undeclared (first use in this function)
make: *** [main.o] Ошибка 1

Вот этого (пока бесполезный пример для пробы):

w1.zip

 

На другой Linux машине нормально - стоит поправить Makefile/

Хочу применить... не через сокеты как ранее, а "напрямую" если коды процессов на одном устройстве.

Заранее спасибо!

Link to comment

Здравствуйте!

 

Я подозреваю, что это происходит потому, что компилятор может брать заголовочные файлы не из той директории. Попробуйте в makefile изменить строку

CC=$(PREFIXPATH)/arm-linux-gcc

на

INCPATH=/usr/local/arm-linux/include
CC=$(PREFIXPATH)/arm-linux-gcc -I$(INCPATH)
Link to comment

 

Здравствуйте!

 

Я подозреваю, что это происходит потому, что компилятор может брать заголовочные файлы не из той директории. Попробуйте в makefile изменить строку

CC=$(PREFIXPATH)/arm-linux-gcc

на

INCPATH=/usr/local/arm-linux/include
CC=$(PREFIXPATH)/arm-linux-gcc -I$(INCPATH)

Простите за мою медлительность... Только вчера отыскал... но отписаться сам не мог:

#include <sys/stat.h>

Тоесть в моём примере надо применять добавление в заголовок. Путь для компиляции изменить не додумался. :wacko:

 

Вообще вот что вышло (смотрите текстовый файл в корне):

shared_mem.zip

Спасибо!!!

 

 

Link to comment
  • 1 year later...

Доброго времени суток!

...собственно опять беспокою Вас по этой теме. И всё бы отлично... но решил разделить тестовую программу на разные процессы (не потоки).

Это в теме "LX-7112-LX-Plus... может баловство... а может и нет". Смысл в том, что "websocket - server" это один процесс. Его задача контролировать изменение на картинке в shared memory... и если она отличается от ранее посланной, начать пересылку. Второй его задачей является приём событий от браузера и ложить команды в shared memory (но уже другой файл). Другой процесс собственно занимается анализом этих команд (из shared memory) и изменение картинки в shared memory.

И всё бы отлично, но каков вариант синхронизации данных. Проблема в том что "sem_open" не работает на устройстве  Есть вариант использовать sem_init, но там не задается имя семафора. А оба процесса запускаются с помощью bash скрипта, где указываются имена файлов картинки, файла команд и семафоров. Компиляция проходит успешно... но вот запуск на устройстве не выходит. Следует отметить, что на других Linux машинах всё работает.

А имена файлов и семафоров важны.

Заранее спасибо.

Link to comment

Доброго времени суток!

...ответа не дождался... и ничего умнее сделать не смог как применить самодельный "мютекс" ну и простенькие функции отдельном файле Си:

//msem.c

#include <stdint.h>
#include <unistd.h>
#include "msem.h"


void wmcreate(uint8_t * fm, uint8_t val)
{
        *fm = val;
}


//ожидание
//содержимое fm > 0 - занят
void wmutlock(uint8_t * fm)
{
        while(*fm > 0)
        {
                usleep(_t_wmutlock);
        }
        *fm = 0xFF;
}

void wmutunlock(uint8_t * fm)
{
        *fm = 0;
}

Решено было применить это через ту же разделяемую память, только файлы другие.

А вот картинка находится в shared memory - файл и "мютекс" для картинки другой файл. А формирую так:

int createSHMbmp(void)
{
        //память - создание
        if ( (shmBMP = shm_open(&SHCMDfilenameBMP[0], O_CREAT|O_RDWR, S_IRWXO|S_IRWXG|S_IRWXU)) == -1 )
                return 1;
        if ( ftruncate(shmBMP, _BMP_DUMP_SIZE_ + 1) == -1 ) 
                return 2;
        if ( (addrBMP = mmap(0, _BMP_DUMP_SIZE_+1, PROT_WRITE|PROT_READ, MAP_SHARED, shmBMP, 0)) == (u_int8_t*)-1 )
                return 3;
        //
        if ( (semBMP = shm_open(&SHSEMfilenameBMP[0], O_CREAT|O_RDWR, S_IRWXO|S_IRWXG|S_IRWXU)) == -1 )
                return 4;
        if ( ftruncate(semBMP, sizeof(pthread_mutex_t) + 1) == -1 ) 
                return 5;
        if ( (addrsemBMP = mmap(0, sizeof(pthread_mutex_t) + 1, PROT_WRITE|PROT_READ, MAP_SHARED, semBMP, 0)) == (u_int8_t*)-1 )
                return 6;
        wmcreate(addrsemBMP, 0);
        wmutlock(addrsemBMP);
        //анализ шаблона BMP
        BMP_FileAnalise(&filenameBMP[0], addrBMP);
        wmutunlock(addrsemBMP);
        return 0;
}

Ну и работа так:

 wmutlock(addrsemBMP);
                test8();
                BMP_textout(&testline[0], 50, 140, 255,255,0, 0,0,0, 0);
                gp_circlesec_ind(220, 340, 50, 45, scnt, 1, 255, 255, 255);
                gp_circlesec_ind(220, 210, 50, 45, scnt, 2, 255, 255, 255);
                gp_circlesec_ind(420, 340, 50, 45, scnt, 3, 255, 255, 255);
                gp_circlesec_ind(420, 210, 50, 45, scnt, 4, 255, 255, 255);
                sliderCTRL(mX, mY, 0);
                wmutunlock(addrsemBMP);

Проверки wmutlock(addrsemBMP); - захватили, wmutunlock(addrsemBMP); - отпустили. Может надо по другому, но это функционирует.

Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...