>I know this subject has been beaten to death but I can't seem to get it to go on my >system. >[snip] >Garth Gaddy Hi Garth, Nice to meet you at the show, I looked at your code, and I can't see anything obviously wrong. I have attached a stand alone test program that gives a simple example of using shared memory. I tested it on rtl 0.9j+ (1.0) and 2.0.36. You may need to change the -I in the makefile and some hash defines for the size of memory on your system. Details of how to use it are in the source header. I hope this works for you. Regards Stuart. - Visit http://www.zentropix.com/ for Real Time Linux Tools
//////////////////////////////////////////////////////////////////////////////// // // Copyright © 1998 Zentropic Computing, All rights reserved // // Authors: Stuart Hughes // Original date: Mon 16 Aug 1999 // Id: @(#)$Id$ // License: GPL // // Description: This is an example that shows how to set up shared // memory under real time Linux to allow access // from both user and real time context. Build it by // typing "make -f Makefile.shm", to run the program, // do an insmod of rtl_sched, and shm_rt. Next run // ./shm. If it is working, you should see an // incrementing number printed at the tty. // // Scheme The user space loop increments a counter in shared // memory, this location is copied in the real-time // task (asynchronously) to another shared memory // location. The user space print the contents of // the shared memory location written to by the // real time task. // // Variables Shared memory is reserved by adding a line like // append="mem=63m" (example to reserve 1 meg in a // 64 meg machine) // The include path for RTL may need chaning in the // Makefile.shm for your system // // Notes: For 2.2 kernels you need to uses ioremap and iounmap // in place of vremap and vfree. // Error checking omitted for clarity. // // //////////////////////////////////////////////////////////////////////////////// static char id_shm_c[] __attribute__ ((unused)) = "@(#)$Id$"; // change this line if you have a different memory size #define SHM_BASE ((63 * 0x100000)) struct shm_vars { int from_user; int to_user; }; struct shm_vars *shm_ptr; /////////////////////////////////////////////////////////////////////////////// // // kernel module // /////////////////////////////////////////////////////////////////////////////// #ifdef __KERNEL__ #include <linux/module.h> #include <linux/kernel.h> #include <linux/mm.h> #include <rtl_sched.h> RT_TASK task_str; void func(int arg) { while(1) { shm_ptr->to_user = shm_ptr->from_user; rt_task_wait(); } } int init_module(void) { shm_ptr = (struct shm_vars *) vremap(SHM_BASE, sizeof(struct shm_vars)); shm_ptr->from_user = shm_ptr->to_user = 0; rt_task_init(&task_str, func, 0, 3000, 4); rt_task_make_periodic(&task_str, rt_get_time(), (RT_TICKS_PER_SEC/10000)); return 0; } void cleanup_module(void) { rt_task_suspend(&task_str); rt_task_delete(&task_str); vfree(shm_ptr); } /////////////////////////////////////////////////////////////////////////////// // // user process // /////////////////////////////////////////////////////////////////////////////// #else #include <stdio.h> #include <string.h> #include <unistd.h> #include <sys/mman.h> #include <fcntl.h> #include <errno.h> int main() { int mem_fd; if(( mem_fd = open("/dev/mem", O_RDWR)) < 0) { printf("open(/dev/mem, O_RDWR) : %s\n", strerror(errno)); exit(1); } shm_ptr = (struct shm_vars *) mmap(0, sizeof(struct shm_vars), PROT_READ | PROT_WRITE, MAP_FILE | MAP_SHARED, mem_fd, SHM_BASE ); if( shm_ptr == MAP_FAILED ) { printf("mmap failed: %s\n", strerror(errno)); exit(1); } close(mem_fd); // main loop, update counter, read back and print copy from RT while(1) { shm_ptr->from_user++; printf("counter = %d\n", shm_ptr->to_user); usleep(100000); } } #endif
# you will need to change this INC = -I /usr/src/rtl/include all: shm shm_rt shm_rt: shm.c gcc $(INC) -D__RT__ -D__KERNEL__ -DMODULE -O2 -g -c -o shm_rt.o shm.c ld -r -static -o shm_rt shm_rt.o rm shm_rt.o clean: rm shm shm.o shm_rt shm_rt.o