lpcmanager

Parents 59fe1eea36a8
Children 4b07f192cdc9
Fixed random blocking of RS485 task, probably bug of Alchemy API in Xenomai (rt_suspend and rt_resmue ?)
--- a/LPCBus/MC9_Devices_cleanup.c Fri Jan 25 14:09:27 2019 +0100
+++ b/LPCBus/MC9_Devices_cleanup.c Tue Feb 05 13:33:17 2019 +0100
@@ -1,8 +1,8 @@
+
+pthread_mutex_lock(&UART_WakeCondLock);
UART_task_active = 0;
-rt_task_resume(&UART_task);
-rt_task_delete(&UART_task);
-rt_task_join(&UART_task);
+pthread_cond_signal(&UART_WakeCond);
+pthread_mutex_unlock(&UART_WakeCondLock);
+pthread_join(UART_task, NULL);
closeserial(UART_fd);
-rt_mutex_delete(&UART_WriteMutex);
-rt_mutex_delete(&UART_ReadMutex);
--- a/LPCBus/MC9_Devices_decl.c Fri Jan 25 14:09:27 2019 +0100
+++ b/LPCBus/MC9_Devices_decl.c Tue Feb 05 13:33:17 2019 +0100
@@ -125,21 +125,38 @@
/* Table of timers (one for each position) */
static commTimer uartPortTim[MAX_UART_DEVICES];
-static RT_TASK UART_task;
-static RT_MUTEX UART_WriteMutex;
-static RT_MUTEX UART_ReadMutex;
+static pthread_t UART_task;
+static pthread_mutex_t UART_WriteMutex = PTHREAD_MUTEX_INITIALIZER;
+static pthread_mutex_t UART_ReadMutex = PTHREAD_MUTEX_INITIALIZER;
+static pthread_mutex_t UART_WakeCondLock = PTHREAD_MUTEX_INITIALIZER;
+static pthread_cond_t UART_WakeCond = PTHREAD_COND_INITIALIZER;
+static int UART_WakeCondValue = 0;
static int UART_task_active;
-void UART_task_proc(void *arg)
+void* UART_task_proc(void *arg)
{
static unsigned char i=0;
char commStat;
uint64_t actTime;
static uint64_t lastCommTime=0;
- while (UART_task_active){
- rt_task_suspend(NULL);
- if(!UART_task_active)
+ struct sched_param param = { .sched_priority = 10 };
+ pthread_setname_np(pthread_self(), "UART_task");
+ pthread_setschedparam(pthread_self(), SCHED_FIFO, &param);
+
+ while (1){
+ int active;
+ pthread_mutex_lock(&UART_WakeCondLock);
+ active = UART_task_active;
+ while(!UART_WakeCondValue && active){
+ pthread_cond_wait(&UART_WakeCond, &UART_WakeCondLock);
+ active = UART_task_active;
+ }
+
+ UART_WakeCondValue = 0;
+ pthread_mutex_unlock(&UART_WakeCondLock);
+
+ if(!active)
break;
// Communicate only with initialised UART devices
@@ -149,7 +166,11 @@
// Timers for UART port modules
if(uartPortTim[i].status != TIM_DISABLED)
{
- actTime = (uint64_t)rt_timer_read();
+ struct timespec time_ref;
+ if(clock_gettime(CLOCK_MONOTONIC, &time_ref)){
+ perror("clock_gettime(time_ref)");
+ }
+ actTime = time_ref.tv_nsec + time_ref.tv_sec * 1000000000LL;
uartPortTim[i].actValue = actTime - uartPortTim[i].oldTime;
if((uartPortTim[i].actValue < uartPortTim[i].toValue)
@@ -166,7 +187,7 @@
if((uartPortTim[i].status == TIM_DISABLED)
|| (uartPortTim[i].status == TIM_EN_EXPIRED))
{
- if(!rt_mutex_acquire(&UART_WriteMutex, TM_INFINITE )){
+ if(!pthread_mutex_lock(&UART_WriteMutex)){
if(uartDevWriteBuf_plc_state == FULL){
uartDevWriteBuf_t *uartDevWriteBuf_tmp;
uartDevWriteBuf_tmp = uartDevWriteBuf_plc;
@@ -174,7 +195,7 @@
uartDevWriteBuf_drv = uartDevWriteBuf_tmp;
uartDevWriteBuf_plc_state = EMPTY;
}
- rt_mutex_release(&UART_WriteMutex);
+ pthread_mutex_unlock(&UART_WriteMutex);
}
// Communicate with device
@@ -185,7 +206,7 @@
memcpy(uartDevReadBuf_drv, &uartDevReadBuf, sizeof(uartDevReadBuf_t));
- if(!rt_mutex_acquire(&UART_ReadMutex, TM_INFINITE )){
+ if(!pthread_mutex_lock(&UART_ReadMutex)){
if(uartDevReadBuf_plc_state == EMPTY){
uartDevReadBuf_t *uartDevReadBuf_tmp;
uartDevReadBuf_tmp = uartDevReadBuf_plc;
@@ -193,7 +214,7 @@
uartDevReadBuf_drv = uartDevReadBuf_tmp;
uartDevReadBuf_plc_state = FULL;
}
- rt_mutex_release(&UART_ReadMutex);
+ pthread_mutex_unlock(&UART_ReadMutex);
}
// Check communication status:
@@ -230,6 +251,7 @@
}
else i=0;
}
+ return NULL;
}
#define TAIL_LEN 3 /* Length of data tail in bytes */
--- a/LPCBus/MC9_Devices_init.c Fri Jan 25 14:09:27 2019 +0100
+++ b/LPCBus/MC9_Devices_init.c Tue Feb 05 13:33:17 2019 +0100
@@ -20,12 +20,6 @@
%(init_code)s
-if((err = rt_mutex_create (&UART_WriteMutex, "UART_WriteMutex")))
- return err;
-
-if((err = rt_mutex_create (&UART_ReadMutex, "UART_ReadMutex")))
- return err;
-
UART_fd = openserial(serialdev, uartBaudrate); /* uartBaudrate is initialized from Composer */
if (!UART_fd) {
fprintf(stderr, "Error while initializing %%s.\n", serialdev);
@@ -39,9 +33,6 @@
UART_task_active = 1;
-if((err = rt_task_create(&UART_task, "UART_task", 0, 0, T_JOINABLE)))
+if(err = pthread_create(&UART_task, NULL, &UART_task_proc, NULL));
return err;
-if((err = rt_task_start(&UART_task, &UART_task_proc, NULL)))
- return err;
-
--- a/LPCBus/MC9_Devices_publish.c Fri Jan 25 14:09:27 2019 +0100
+++ b/LPCBus/MC9_Devices_publish.c Tue Feb 05 13:33:17 2019 +0100
@@ -1,10 +1,10 @@
-if(!rt_mutex_acquire(&UART_WriteMutex, TM_INFINITE )){
+if(!pthread_mutex_lock(&UART_WriteMutex)){
int prevstate;
prevstate=uartDevWriteBuf_plc_state;
uartDevWriteBuf_plc_state = LOCKED;
- rt_mutex_release(&UART_WriteMutex);
+ pthread_mutex_unlock(&UART_WriteMutex);
%(publish_code)s
@@ -12,5 +12,8 @@
uartDevWriteBuf_plc_state = FULL;
/* wakeup task */
- rt_task_resume(&UART_task);
+ pthread_mutex_lock(&UART_WakeCondLock);
+ UART_WakeCondValue = 1;
+ pthread_cond_signal(&UART_WakeCond);
+ pthread_mutex_unlock(&UART_WakeCondLock);
}
--- a/LPCBus/MC9_Devices_retrieve.c Fri Jan 25 14:09:27 2019 +0100
+++ b/LPCBus/MC9_Devices_retrieve.c Tue Feb 05 13:33:17 2019 +0100
@@ -1,11 +1,11 @@
-if(!rt_mutex_acquire(&UART_ReadMutex, TM_INFINITE )){
+if(!pthread_mutex_lock(&UART_ReadMutex)){
int prevstate;
if((prevstate=uartDevReadBuf_plc_state) == FULL){
uartDevReadBuf_plc_state = LOCKED;
}
- rt_mutex_release(&UART_ReadMutex);
+ pthread_mutex_unlock(&UART_ReadMutex);
if(prevstate == FULL){