I know this subject has been beaten to death but I can't seem to get it to go on my
system. I have reviewed all of the past messages on the subject including the "buzz"
examples and after several days I am turning to you folks for help. Here is a
synopsis of the shared memory important stuff. The rtl_servo.c compiles to a module
and runs the servo board fine. The main.c file does however throw a warning that the
argument for the munmap() call is of an incorrect pointer type. Maybe this is the
source of my problem, maybe not. Any suggestions?
//sram.h SHARED MEMORY HEADER FILE
#define SRAM_BASE ((63 * 0x100000))typedef struct{ unsigned char inuse; int arg1; int
arg2;}SRAM_CMD;typedef struct{ unsigned char inuse; int stat1; int
stat2;}SRAM_STAT;typedef struct{ SRAM_CMD command; SRAM_STAT status;}SRAM_ACCESS;
//rtl_servo.h RTLINUX MODULE HEADER FILEextern void * vremap (unsigned long
offset, unsigned long size);extern void vfree (void * addr);SRAM_ACCESS *rt_ptr;
//rt_Linux side access
//rtl_servo.c RTLINUX MODULE CODE
#include "sram.h"
int init_module(void){ rt_ptr = (SRAM_ACCESS *)vremap(SRAM_BASE, sizeof(SRAM_ACCESS));
//snip.....other init stuff.......
return 0;}void cleanup_module(void){ //snip.... .other cleanup stuff.....
vfree(rt_ptr);}void tsk_servo_pid(int bogus) //servo pid task{
while (1) { sramCntr++; if(0 == rt_ptr->status.inuse)
//if sram not is use, set data values {
rt_ptr->status.stat1 = junk; rt_ptr->status.stat2 = sramCntr;
} if(0 == rt_ptr->command.inuse) {
junk = rt_ptr->command.arg1; } //snip ....... servo pid
stuff
}}//main.h USER SIDE LINUX MAIN PROGRAM HEADER FILESRAM_ACCESS
*alloc_sram(void);void free_sram (SRAM_ACCESS *);int help_menu(void);
//main.c USER SIDE LINUX MAIN PROGRAM#include "sram.h"
int main(){ short c; SRAM_ACCESS *u_ptr; SRAM_ACCESS
local; u_ptr = alloc_sram(); help_menu(); do { c
= getchar(); putchar('\n'); switch(c) {
case '1': u_ptr->status.inuse = 1; memcpy(&local, u_ptr,
sizeof(SRAM_ACCESS)); u_ptr->status.inuse = 0;
printf("Command Verify = %d\n", local.status.stat1);
break; case '2': u_ptr->status.inuse = 1;
memcpy(&local, u_ptr, sizeof(SRAM_ACCESS));
u_ptr->status.inuse = 0; printf("SRAM Counter = %d\n",
local.status.stat2); break; case '3':
local.command.arg1 = 1234; u_ptr->command.inuse = 1;
memcpy(u_ptr, &local, sizeof(SRAM_ACCESS));
u_ptr->command.inuse = 0; printf("Command sent = %d\n",
local.command.arg1);
break; case 'q': break;
default: printf("Enter Command for Shared Memory Test : "); }
} while (c != 'q'); free_sram(u_ptr); return 0;}int help_menu(void){
printf("Commands:\n"); printf(" 1 - 1st arg in shared ram\n"); printf("
2 - 2nd arg in shared ram\n"); printf(" 3 - Send Command to RT side\n");
printf(" q - Quit\n"); printf("Enter Command for Shared Memory Test : ");
return(0);}SRAM_ACCESS *alloc_sram(){ SRAM_ACCESS *u_ptr; int memd; if (
(memd=open("/dev/mem" , O_RDWR)) < 0 ) { printf("\nShared memory not
opened\n"); return NULL; } u_ptr = (SRAM_ACCESS *) mmap(0,
sizeof(SRAM_ACCESS), PROT_READ | PROT_WRITE, MAP_FILE | MAP_SHARED, memd,
SRAM_BASE); printf("\nShared memory setup up, pointer = %10d\n", u_ptr); if
(MAP_FAILED == u_ptr) return NULL; close(memd);
return u_ptr;}void free_sram (SRAM_ACCESS *user_ptr){ munmap(user_ptr,
sizeof(SRAM_ACCESS));}
--- [rtl] ---
To unsubscribe:
echo "unsubscribe rtl" | mail [EMAIL PROTECTED] OR
echo "unsubscribe rtl <Your_email>" | mail [EMAIL PROTECTED]
----
For more information on Real-Time Linux see:
http://www.rtlinux.org/~rtlinux/