oiv_1968 Posted February 5, 2017 Share Posted February 5, 2017 Доброго времени суток. Вроде 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
Agibalov Posted February 6, 2017 Share Posted February 6, 2017 Здравствуйте! Я подозреваю, что это происходит потому, что компилятор может брать заголовочные файлы не из той директории. Попробуйте в makefile изменить строку CC=$(PREFIXPATH)/arm-linux-gcc на INCPATH=/usr/local/arm-linux/include CC=$(PREFIXPATH)/arm-linux-gcc -I$(INCPATH) Link to comment
oiv_1968 Posted February 7, 2017 Author Share Posted February 7, 2017 Здравствуйте! Я подозреваю, что это происходит потому, что компилятор может брать заголовочные файлы не из той директории. Попробуйте в makefile изменить строку CC=$(PREFIXPATH)/arm-linux-gcc на INCPATH=/usr/local/arm-linux/include CC=$(PREFIXPATH)/arm-linux-gcc -I$(INCPATH) Простите за мою медлительность... Только вчера отыскал... но отписаться сам не мог: #include <sys/stat.h> Тоесть в моём примере надо применять добавление в заголовок. Путь для компиляции изменить не додумался. Вообще вот что вышло (смотрите текстовый файл в корне): shared_mem.zip Спасибо!!! Link to comment
oiv_1968 Posted July 10, 2018 Author Share Posted July 10, 2018 Доброго времени суток! ...собственно опять беспокою Вас по этой теме. И всё бы отлично... но решил разделить тестовую программу на разные процессы (не потоки). Это в теме "LX-7112-LX-Plus... может баловство... а может и нет". Смысл в том, что "websocket - server" это один процесс. Его задача контролировать изменение на картинке в shared memory... и если она отличается от ранее посланной, начать пересылку. Второй его задачей является приём событий от браузера и ложить команды в shared memory (но уже другой файл). Другой процесс собственно занимается анализом этих команд (из shared memory) и изменение картинки в shared memory. И всё бы отлично, но каков вариант синхронизации данных. Проблема в том что "sem_open" не работает на устройстве Есть вариант использовать sem_init, но там не задается имя семафора. А оба процесса запускаются с помощью bash скрипта, где указываются имена файлов картинки, файла команд и семафоров. Компиляция проходит успешно... но вот запуск на устройстве не выходит. Следует отметить, что на других Linux машинах всё работает. А имена файлов и семафоров важны. Заранее спасибо. Link to comment
oiv_1968 Posted July 11, 2018 Author Share Posted July 11, 2018 Доброго времени суток! ...ответа не дождался... и ничего умнее сделать не смог как применить самодельный "мютекс" ну и простенькие функции отдельном файле Си: //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
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now