--- 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); -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); -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;
static uint64_t lastCommTime=0;
- while (UART_task_active){
+ struct sched_param param = { .sched_priority = 10 }; + pthread_setname_np(pthread_self(), "UART_task"); + pthread_setschedparam(pthread_self(), SCHED_FIFO, ¶m); + 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); // 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 @@
#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 @@
-if((err = rt_mutex_create (&UART_WriteMutex, "UART_WriteMutex")))
-if((err = rt_mutex_create (&UART_ReadMutex, "UART_ReadMutex")))
UART_fd = openserial(serialdev, uartBaudrate); /* uartBaudrate is initialized from Composer */
fprintf(stderr, "Error while initializing %%s.\n", serialdev);
@@ -39,9 +33,6 @@
-if((err = rt_task_create(&UART_task, "UART_task", 0, 0, T_JOINABLE)))
+if(err = pthread_create(&UART_task, NULL, &UART_task_proc, NULL)); -if((err = rt_task_start(&UART_task, &UART_task_proc, NULL)))
--- 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)){ prevstate=uartDevWriteBuf_plc_state;
uartDevWriteBuf_plc_state = LOCKED;
- rt_mutex_release(&UART_WriteMutex);
+ pthread_mutex_unlock(&UART_WriteMutex); @@ -12,5 +12,8 @@
uartDevWriteBuf_plc_state = FULL;
- 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)){ if((prevstate=uartDevReadBuf_plc_state) == FULL){
uartDevReadBuf_plc_state = LOCKED;
- rt_mutex_release(&UART_ReadMutex);
+ pthread_mutex_unlock(&UART_ReadMutex);