PES4 / Mbed OS Queue_02
Committer:
demayer
Date:
Sat Mar 28 15:28:19 2020 +0000
Revision:
0:6bf0743ece18
IMU Thread with an event-queue running parallel to handle tasks like a 5 times blinking LED. Button with interrupt detected.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
demayer 0:6bf0743ece18 1 /*
demayer 0:6bf0743ece18 2 * Implementation for Posix compliant platforms
demayer 0:6bf0743ece18 3 *
demayer 0:6bf0743ece18 4 * Copyright (c) 2016 Christopher Haster
demayer 0:6bf0743ece18 5 *
demayer 0:6bf0743ece18 6 * Licensed under the Apache License, Version 2.0 (the "License");
demayer 0:6bf0743ece18 7 * you may not use this file except in compliance with the License.
demayer 0:6bf0743ece18 8 * You may obtain a copy of the License at
demayer 0:6bf0743ece18 9 *
demayer 0:6bf0743ece18 10 * http://www.apache.org/licenses/LICENSE-2.0
demayer 0:6bf0743ece18 11 *
demayer 0:6bf0743ece18 12 * Unless required by applicable law or agreed to in writing, software
demayer 0:6bf0743ece18 13 * distributed under the License is distributed on an "AS IS" BASIS,
demayer 0:6bf0743ece18 14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
demayer 0:6bf0743ece18 15 * See the License for the specific language governing permissions and
demayer 0:6bf0743ece18 16 * limitations under the License.
demayer 0:6bf0743ece18 17 */
demayer 0:6bf0743ece18 18 #include "equeue/equeue_platform.h"
demayer 0:6bf0743ece18 19
demayer 0:6bf0743ece18 20 #if defined(EQUEUE_PLATFORM_POSIX)
demayer 0:6bf0743ece18 21
demayer 0:6bf0743ece18 22 #include <time.h>
demayer 0:6bf0743ece18 23 #include <sys/time.h>
demayer 0:6bf0743ece18 24 #include <errno.h>
demayer 0:6bf0743ece18 25
demayer 0:6bf0743ece18 26
demayer 0:6bf0743ece18 27 // Tick operations
demayer 0:6bf0743ece18 28 unsigned equeue_tick(void) {
demayer 0:6bf0743ece18 29 struct timeval tv;
demayer 0:6bf0743ece18 30 gettimeofday(&tv, 0);
demayer 0:6bf0743ece18 31 return (unsigned)(tv.tv_sec*1000 + tv.tv_usec/1000);
demayer 0:6bf0743ece18 32 }
demayer 0:6bf0743ece18 33
demayer 0:6bf0743ece18 34
demayer 0:6bf0743ece18 35 // Mutex operations
demayer 0:6bf0743ece18 36 int equeue_mutex_create(equeue_mutex_t *m) {
demayer 0:6bf0743ece18 37 return pthread_mutex_init(m, 0);
demayer 0:6bf0743ece18 38 }
demayer 0:6bf0743ece18 39
demayer 0:6bf0743ece18 40 void equeue_mutex_destroy(equeue_mutex_t *m) {
demayer 0:6bf0743ece18 41 pthread_mutex_destroy(m);
demayer 0:6bf0743ece18 42 }
demayer 0:6bf0743ece18 43
demayer 0:6bf0743ece18 44 void equeue_mutex_lock(equeue_mutex_t *m) {
demayer 0:6bf0743ece18 45 pthread_mutex_lock(m);
demayer 0:6bf0743ece18 46 }
demayer 0:6bf0743ece18 47
demayer 0:6bf0743ece18 48 void equeue_mutex_unlock(equeue_mutex_t *m) {
demayer 0:6bf0743ece18 49 pthread_mutex_unlock(m);
demayer 0:6bf0743ece18 50 }
demayer 0:6bf0743ece18 51
demayer 0:6bf0743ece18 52
demayer 0:6bf0743ece18 53 // Semaphore operations
demayer 0:6bf0743ece18 54 int equeue_sema_create(equeue_sema_t *s) {
demayer 0:6bf0743ece18 55 int err = pthread_mutex_init(&s->mutex, 0);
demayer 0:6bf0743ece18 56 if (err) {
demayer 0:6bf0743ece18 57 return err;
demayer 0:6bf0743ece18 58 }
demayer 0:6bf0743ece18 59
demayer 0:6bf0743ece18 60 err = pthread_cond_init(&s->cond, 0);
demayer 0:6bf0743ece18 61 if (err) {
demayer 0:6bf0743ece18 62 return err;
demayer 0:6bf0743ece18 63 }
demayer 0:6bf0743ece18 64
demayer 0:6bf0743ece18 65 s->signal = false;
demayer 0:6bf0743ece18 66 return 0;
demayer 0:6bf0743ece18 67 }
demayer 0:6bf0743ece18 68
demayer 0:6bf0743ece18 69 void equeue_sema_destroy(equeue_sema_t *s) {
demayer 0:6bf0743ece18 70 pthread_cond_destroy(&s->cond);
demayer 0:6bf0743ece18 71 pthread_mutex_destroy(&s->mutex);
demayer 0:6bf0743ece18 72 }
demayer 0:6bf0743ece18 73
demayer 0:6bf0743ece18 74 void equeue_sema_signal(equeue_sema_t *s) {
demayer 0:6bf0743ece18 75 pthread_mutex_lock(&s->mutex);
demayer 0:6bf0743ece18 76 s->signal = true;
demayer 0:6bf0743ece18 77 pthread_cond_signal(&s->cond);
demayer 0:6bf0743ece18 78 pthread_mutex_unlock(&s->mutex);
demayer 0:6bf0743ece18 79 }
demayer 0:6bf0743ece18 80
demayer 0:6bf0743ece18 81 bool equeue_sema_wait(equeue_sema_t *s, int ms) {
demayer 0:6bf0743ece18 82 pthread_mutex_lock(&s->mutex);
demayer 0:6bf0743ece18 83 if (!s->signal) {
demayer 0:6bf0743ece18 84 if (ms < 0) {
demayer 0:6bf0743ece18 85 pthread_cond_wait(&s->cond, &s->mutex);
demayer 0:6bf0743ece18 86 } else {
demayer 0:6bf0743ece18 87 struct timeval tv;
demayer 0:6bf0743ece18 88 gettimeofday(&tv, 0);
demayer 0:6bf0743ece18 89
demayer 0:6bf0743ece18 90 struct timespec ts = {
demayer 0:6bf0743ece18 91 .tv_sec = ms/1000 + tv.tv_sec,
demayer 0:6bf0743ece18 92 .tv_nsec = ms*1000000 + tv.tv_usec*1000,
demayer 0:6bf0743ece18 93 };
demayer 0:6bf0743ece18 94
demayer 0:6bf0743ece18 95 pthread_cond_timedwait(&s->cond, &s->mutex, &ts);
demayer 0:6bf0743ece18 96 }
demayer 0:6bf0743ece18 97 }
demayer 0:6bf0743ece18 98
demayer 0:6bf0743ece18 99 bool signal = s->signal;
demayer 0:6bf0743ece18 100 s->signal = false;
demayer 0:6bf0743ece18 101 pthread_mutex_unlock(&s->mutex);
demayer 0:6bf0743ece18 102
demayer 0:6bf0743ece18 103 return signal;
demayer 0:6bf0743ece18 104 }
demayer 0:6bf0743ece18 105
demayer 0:6bf0743ece18 106 #endif