diff -r 9e496a2aadca -r b9274b595650 drivers/unix/unix.c --- a/drivers/unix/unix.c Fri Nov 12 22:02:32 2010 +0100 +++ b/drivers/unix/unix.c Fri Nov 12 22:24:06 2010 +0100 @@ -1,5 +1,5 @@ /* -This file is part of CanFestival, a library implementing CanOpen Stack. +This file is part of CanFestival, a library implementing CanOpen Stack. Copyright (C): Edouard TISSERANT and Francis DUPIN @@ -26,6 +26,7 @@ #else #include #endif +#include #ifndef NOT_USE_DYNAMIC_LOADING #define DLL_CALL(funcname) (* funcname##_driver) @@ -95,7 +96,7 @@ { LIB_HANDLE handle = NULL; char *error; - + if(handle==NULL) { @@ -106,7 +107,7 @@ fprintf (stderr, "%s\n", dlerror()); return NULL; } - + /*Get function ptr*/ DLSYM(canReceive) DLSYM(canSend) @@ -142,7 +143,7 @@ res = DLL_CALL(canSend)(((CANPort*)port)->fd, m); //EnterMutex(); return res; // OK - } + } return 1; // NOT OK } @@ -161,6 +162,13 @@ EnterMutex(); canDispatch(((CANPort*)port)->d, &m); LeaveMutex(); + +#ifdef __KERNEL__ +#ifdef USE_XENO + /* periodic task for Xenomai kernel realtime */ + rt_task_wait_period(NULL); +#endif +#endif } } @@ -178,19 +186,19 @@ if(!canports[i].used) break; } - + #ifndef NOT_USE_DYNAMIC_LOADING if (&DLL_CALL(canOpen)==NULL) { fprintf(stderr,"CanOpen : Can Driver dll not loaded\n"); return NULL; } -#endif +#endif CAN_HANDLE fd0 = DLL_CALL(canOpen)(board); if(fd0){ canports[i].used = 1; canports[i].fd = fd0; canports[i].d = d; - d->canHandle = (CAN_PORT)&canports[i]; + d->canHandle = (CAN_PORT)&canports[i]; CreateReceiveTask(&(canports[i]), &canports[i].receiveTask, &canReceiveLoop); return (CAN_PORT)&canports[i]; }else{ @@ -207,17 +215,18 @@ int canClose(CO_Data * d) { UNS8 res; - + ((CANPort*)d->canHandle)->used = 0; CANPort* tmp = (CANPort*)d->canHandle; - d->canHandle = NULL; - + + // kill receiver task before port is closed and handle set to NULL + WaitReceiveTaskEnd(&tmp->receiveTask); + // close CAN port res = DLL_CALL(canClose)(tmp->fd); - // kill receiver task - WaitReceiveTaskEnd(&tmp->receiveTask); - + d->canHandle = NULL; + return res; } @@ -236,7 +245,7 @@ res = DLL_CALL(canChangeBaudRate)(((CANPort*)port)->fd, baud); //EnterMutex(); return res; // OK - } + } return 1; // NOT OK }