--- a/targets/Xenomai/plc_Xenomai_main.c Mon May 04 09:31:59 2009 +0200
+++ b/targets/Xenomai/plc_Xenomai_main.c Mon May 04 10:12:35 2009 +0200
@@ -8,18 +8,25 @@
#include <native/timer.h>
#include <native/mutex.h>
+#include <native/pipe.h> unsigned int PLC_state = 0;
#define PLC_STATE_TASK_CREATED 1
#define PLC_STATE_PYTHON_MUTEX_CREATED 2
#define PLC_STATE_PYTHON_WAIT_SEM_CREATED 4
#define PLC_STATE_DEBUG_MUTEX_CREATED 8
-#define PLC_STATE_DEBUG_WAIT_SEM_CREATED 16
+#define PLC_STATE_DEBUG_FILE_OPENED 16 +#define PLC_STATE_DEBUG_PIPE_CREATED 32 +#define WAITDEBUG_PIPE_DEVICE "/dev/rtp0" +#define WAITDEBUG_PIPE_MINOR 0 +#define WAITDEBUG_PIPE_SIZE 500 extern int common_ticktime__;
@@ -37,12 +44,16 @@
+RT_TASK SuspendDebug_task; +RT_TASK ResumeDebug_task; RT_TASK WaitPythonCommand_task;
RT_TASK UnLockPython_task;
+int WaitDebug_pipe_fd = -1; void PLC_SetTimer(long long next, long long period)
RTIME current_time = rt_timer_read();
@@ -65,7 +76,6 @@
void PLC_cleanup_all(void)
@@ -76,6 +86,7 @@
if (PLC_state & PLC_STATE_PYTHON_WAIT_SEM_CREATED) {
+ rt_sem_v(&python_wait_sem); rt_sem_delete(&python_wait_sem);
PLC_state &= ~ PLC_STATE_PYTHON_WAIT_SEM_CREATED;
@@ -85,9 +96,14 @@
PLC_state &= ~ PLC_STATE_PYTHON_MUTEX_CREATED;
- if (PLC_state & PLC_STATE_DEBUG_WAIT_SEM_CREATED) {
- rt_sem_delete(&debug_wait_sem);
- PLC_state &= ~ PLC_STATE_DEBUG_WAIT_SEM_CREATED;
+ if (PLC_state & PLC_STATE_DEBUG_PIPE_CREATED) { + rt_pipe_delete(&WaitDebug_pipe); + PLC_state &= ~PLC_STATE_DEBUG_PIPE_CREATED; + if (PLC_state & PLC_STATE_DEBUG_FILE_OPENED) { + close(WaitDebug_pipe_fd); + PLC_state &= ~PLC_STATE_DEBUG_FILE_OPENED; if (PLC_state & PLC_STATE_DEBUG_MUTEX_CREATED) {
@@ -101,11 +117,9 @@
- rt_sem_v(&debug_wait_sem);
- rt_sem_v(&python_wait_sem);
@@ -141,10 +155,19 @@
PLC_state |= PLC_STATE_PYTHON_MUTEX_CREATED;
- /* create debug_wait_sem */
- ret = rt_sem_create(&debug_wait_sem, "debug_wait_sem", 0, S_FIFO);
+ /* create WaitDebug_pipe */ + ret = rt_pipe_create(&WaitDebug_pipe, "WaitDebug_pipe", WAITDEBUG_PIPE_MINOR, + WAITDEBUG_PIPE_SIZE * sizeof(char)); - PLC_state |= PLC_STATE_DEBUG_WAIT_SEM_CREATED;
+ PLC_state |= PLC_STATE_DEBUG_PIPE_CREATED; + /* open WaitDebug_pipe*/ + WaitDebug_pipe_fd = open(WAITDEBUG_PIPE_DEVICE, O_RDWR); + if (WaitDebug_pipe_fd == -1) { + PLC_state |= PLC_STATE_DEBUG_FILE_OPENED; ret = rt_mutex_create(&debug_mutex, "debug_mutex");
@@ -184,9 +207,10 @@
/* from plc_debugger.c */
- rt_task_shadow(&WaitDebug_task, "WaitDebug_task", 0, 0);
/* Wait signal from PLC thread */
- rt_sem_p(&debug_wait_sem, TM_INFINITE);
+ if (PLC_state & PLC_STATE_DEBUG_FILE_OPENED) + read(WaitDebug_pipe_fd, &message, sizeof(char)); @@ -194,32 +218,42 @@
* This is supposed to unlock debugger thread in WaitDebugData*/
void InitiateDebugTransfer()
/* signal debugger thread it can read data */
- rt_sem_v(&debug_wait_sem);
+ if (PLC_state & PLC_STATE_DEBUG_PIPE_CREATED) + rt_pipe_write(&WaitDebug_pipe, &message, sizeof(char), P_NORMAL); - /* Prevent PLC to enter debug code */
- rt_mutex_acquire(&debug_mutex, TM_INFINITE);
+ if (PLC_state & PLC_STATE_DEBUG_MUTEX_CREATED) { + rt_task_shadow(&SuspendDebug_task, "SuspendDebug_task", 0, 0); + /* Prevent PLC to enter debug code */ + rt_mutex_acquire(&debug_mutex, TM_INFINITE); - /* Let PLC enter debug code */
- rt_mutex_release(&debug_mutex);
+ if (PLC_state & PLC_STATE_DEBUG_MUTEX_CREATED) { + rt_task_shadow(&ResumeDebug_task, "ResumeDebug_task", 0, 0); + /* Let PLC enter debug code */ + rt_mutex_release(&debug_mutex); int WaitPythonCommands(void)
- rt_task_shadow(&WaitPythonCommand_task, "WaitPythonCommand_task", 0, 0);
/* Wait signal from PLC thread */
- rt_sem_p(&python_wait_sem, TM_INFINITE);
+ if (PLC_state & PLC_STATE_PYTHON_WAIT_SEM_CREATED) { + rt_task_shadow(&WaitPythonCommand_task, "WaitPythonCommand_task", 0, 0); + rt_sem_p(&python_wait_sem, TM_INFINITE); /* Called by PLC thread on each new python command*/
@@ -236,12 +270,16 @@
- rt_task_shadow(&UnLockPython_task, "UnLockPython_task", 0, 0);
- rt_mutex_release(&python_mutex);
+ if (PLC_state & PLC_STATE_PYTHON_MUTEX_CREATED) { + rt_task_shadow(&UnLockPython_task, "UnLockPython_task", 0, 0); + rt_mutex_release(&python_mutex); - rt_task_shadow(&LockPython_task, "LockPython_task", 0, 0);
- rt_mutex_acquire(&python_mutex, TM_INFINITE);
+ if (PLC_state & PLC_STATE_PYTHON_MUTEX_CREATED) { + rt_task_shadow(&LockPython_task, "LockPython_task", 0, 0); + rt_mutex_acquire(&python_mutex, TM_INFINITE);