Skip to content
This repository was archived by the owner on Aug 19, 2021. It is now read-only.

Commit 7586f7d

Browse files
committed
Folded platform specific code into master branch
Using branches for ports, while flexible, was debatably a questionable abuse of git branches. The model proved to be unhelpfully annoying to manage and made the codebase unnecessarily distributed.
1 parent 6830476 commit 7586f7d

File tree

9 files changed

+599
-12
lines changed

9 files changed

+599
-12
lines changed

.travis.yml

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,2 @@
11
script:
2-
- git config user.email "test"
3-
- git config user.name "test"
4-
- git fetch origin posix:posix
5-
- git merge posix --no-commit
62
- make test

Makefile

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,19 @@
11
TARGET = libevents.a
22

3-
43
CC = gcc
54
AR = ar
65
SIZE = size
76

8-
SRC += $(wildcard *.c sys/*.c)
7+
SRC += $(wildcard *.c)
98
OBJ := $(SRC:.c=.o)
109
DEP := $(SRC:.c=.d)
1110
ASM := $(SRC:.c=.s)
1211

12+
TESTS = tests/tests
13+
TSRC += $(wildcard tests/*.c)
14+
TOBJ := $(TSRC:.c=.o)
15+
TDEP := $(TSRC:.c=.d)
16+
1317
ifdef DEBUG
1418
CFLAGS += -O0 -g3 -DMU_DEBUG
1519
CFLAGS += -fkeep-inline-functions
@@ -19,16 +23,20 @@ endif
1923
ifdef WORD
2024
CFLAGS += -m$(WORD)
2125
endif
26+
CFLAGS += -I.
2227
CFLAGS += -std=c99
2328
CFLAGS += -Wall -Winline
24-
CFLAGS += -D_POSIX_C_SOURCE=200112L
29+
CFLAGS += -D_XOPEN_SOURCE=500
2530

2631
LFLAGS += -lpthread
27-
LFLAGS += -lrt
2832

2933

3034
all: $(TARGET)
3135

36+
test: $(TOBJ) $(OBJ)
37+
$(CC) $(CFLAGS) $^ $(LFLAGS) -o $(TESTS)
38+
$(TESTS)
39+
3240
asm: $(ASM)
3341

3442
size: $(OBJ)
@@ -47,6 +55,8 @@ size: $(OBJ)
4755

4856
clean:
4957
rm -f $(TARGET)
58+
rm -f $(TESTS)
59+
rm -f $(TOBJ) $(TDEP)
5060
rm -f $(OBJ)
5161
rm -f $(DEP)
5262
rm -f $(ASM)

events.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@ extern "C" {
99
#endif
1010

1111
// System specific files
12-
#include "sys/events_tick.h"
13-
#include "sys/events_mutex.h"
14-
#include "sys/events_sema.h"
12+
#include "events_tick.h"
13+
#include "events_mutex.h"
14+
#include "events_sema.h"
1515

1616

1717
// Event/queue structures

events_mbed.cpp

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
#if defined(__MBED__)
2+
3+
#include "events_tick.h"
4+
#include "events_sema.h"
5+
#include "events_mutex.h"
6+
7+
#include <stdbool.h>
8+
#include "mbed.h"
9+
#ifdef MBED_CONF_RTOS_PRESENT
10+
#include "rtos.h"
11+
#endif
12+
13+
14+
// Ticker operations
15+
static class GlobalTicker {
16+
public:
17+
GlobalTicker() {
18+
_tick = 0;
19+
_timer.start();
20+
_ticker.attach_us(this, &GlobalTicker::step, (1 << 16) * 1000);
21+
};
22+
23+
void step() {
24+
_timer.reset();
25+
_tick += 1 << 16;
26+
}
27+
28+
unsigned tick() {
29+
return _tick + (unsigned)_timer.read_ms();
30+
}
31+
32+
private:
33+
unsigned _tick;
34+
Timer _timer;
35+
Ticker _ticker;
36+
} gticker;
37+
38+
unsigned events_tick() {
39+
return gticker.tick();
40+
}
41+
42+
43+
// Mutex operations
44+
int events_mutex_create(events_mutex_t *m) { return 0; }
45+
void events_mutex_destroy(events_mutex_t *m) { }
46+
47+
void events_mutex_lock(events_mutex_t *m) {
48+
*m = __get_PRIMASK();
49+
__disable_irq();
50+
}
51+
52+
void events_mutex_unlock(events_mutex_t *m) {
53+
__set_PRIMASK(*m);
54+
}
55+
56+
57+
// Semaphore operations
58+
#ifdef MBED_CONF_RTOS_PRESENT
59+
60+
static inline Semaphore *sema(events_sema_t *s) {
61+
return static_cast<Semaphore*>(*s);
62+
}
63+
64+
int events_sema_create(events_sema_t *s) {
65+
*s = new Semaphore(0);
66+
return sema(s) ? 0 : -1;
67+
}
68+
69+
void events_sema_destroy(events_sema_t *s) {
70+
delete sema(s);
71+
}
72+
73+
void events_sema_release(events_sema_t *s) {
74+
sema(s)->release();
75+
}
76+
77+
bool events_sema_wait(events_sema_t *s, int ms) {
78+
int t = sema(s)->wait(ms < 0 ? osWaitForever : ms);
79+
return t > 0;
80+
}
81+
82+
#else
83+
84+
// Semaphore operations
85+
int events_sema_create(events_sema_t *s) { return 0; }
86+
void events_sema_destroy(events_sema_t *s) {}
87+
void events_sema_release(events_sema_t *s) {}
88+
89+
static void events_sema_wakeup() {}
90+
91+
bool events_sema_wait(events_sema_t *s, int ms) {
92+
Timeout timeout;
93+
timeout.attach_us(events_sema_wakeup, ms*1000);
94+
95+
__WFI();
96+
97+
return true;
98+
}
99+
100+
#endif
101+
102+
#endif

sys/events_mutex.h renamed to events_mutex.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,13 @@ extern "C" {
1414
// If this type is safe in interrupt contexts, then
1515
// the associated event queue will also be safe in
1616
// interrupt contexts.
17-
typedef struct {} events_mutex_t;
17+
#if defined(__unix__)
18+
#include <pthread.h>
19+
typedef pthread_mutex_t events_mutex_t;
20+
#elif defined(__MBED__)
21+
typedef unsigned events_mutex_t;
22+
#endif
23+
1824

1925
// Mutex operations
2026
int events_mutex_create(events_mutex_t *m);

events_posix.c

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
#if defined(__unix__)
2+
3+
#include "events_tick.h"
4+
#include "events_sema.h"
5+
#include "events_mutex.h"
6+
7+
#include <time.h>
8+
9+
10+
// Tick operations
11+
#ifdef _POSIX_TIMERS
12+
13+
unsigned events_tick(void) {
14+
struct timespec ts;
15+
clock_gettime(CLOCK_MONOTONIC, &ts);
16+
return (unsigned)(ts.tv_sec*1000 + ts.tv_nsec/1000000);
17+
}
18+
19+
#else
20+
#include <sys/time.h>
21+
22+
unsigned events_tick(void) {
23+
struct timeval tv;
24+
gettimeofday(&tv, 0);
25+
return (unsigned)(tv.tv_sec*1000 + tv.tv_usec/1000);
26+
}
27+
28+
#endif
29+
30+
31+
// Mutex operations
32+
int events_mutex_create(events_mutex_t *m) {
33+
return pthread_mutex_init(m, 0);
34+
}
35+
36+
void events_mutex_destroy(events_mutex_t *m) {
37+
pthread_mutex_destroy(m);
38+
}
39+
40+
void events_mutex_lock(events_mutex_t *m) {
41+
pthread_mutex_lock(m);
42+
}
43+
44+
void events_mutex_unlock(events_mutex_t *m) {
45+
pthread_mutex_unlock(m);
46+
}
47+
48+
49+
int events_sema_create(events_sema_t *s) {
50+
int err = pthread_mutex_init(&s->mutex, 0);
51+
if (err) {
52+
return err;
53+
}
54+
55+
err = pthread_cond_init(&s->cond, 0);
56+
if (err) {
57+
return err;
58+
}
59+
60+
return 0;
61+
}
62+
63+
void events_sema_destroy(events_sema_t *s) {
64+
pthread_mutex_destroy(&s->mutex);
65+
pthread_cond_destroy(&s->cond);
66+
}
67+
68+
void events_sema_release(events_sema_t *s) {
69+
pthread_cond_signal(&s->cond);
70+
}
71+
72+
bool events_sema_wait(events_sema_t *s, int ms) {
73+
int err;
74+
pthread_mutex_lock(&s->mutex);
75+
76+
if (ms < 0) {
77+
err = pthread_cond_wait(&s->cond, &s->mutex);
78+
} else {
79+
ms += events_tick();
80+
struct timespec ts = {
81+
.tv_sec = ms/1000,
82+
.tv_nsec = ms*1000000,
83+
};
84+
err = pthread_cond_timedwait(&s->cond, &s->mutex, &ts);
85+
}
86+
87+
pthread_mutex_unlock(&s->mutex);
88+
return !err;
89+
}
90+
91+
#endif

sys/events_sema.h renamed to events_sema.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,20 @@ extern "C" {
1515
//
1616
// Optimal implementation is a binary semaphore,
1717
// however a regular semaphore is sufficient.
18+
#if defined(__unix__)
19+
#include <pthread.h>
20+
typedef struct {
21+
pthread_mutex_t mutex;
22+
pthread_cond_t cond;
23+
} events_sema_t;
24+
#elif defined(__MBED__)
25+
#ifdef MBED_CONF_RTOS_PRESENT
26+
typedef void *events_sema_t;
27+
#else
1828
typedef struct {} events_sema_t;
29+
#endif
30+
#endif
31+
1932

2033
// Semaphore operations
2134
int events_sema_create(events_sema_t *s);
File renamed without changes.

0 commit comments

Comments
 (0)