Skip to content

Commit b275cc2

Browse files
committed
Add tick api to osal
1 parent 0ab0808 commit b275cc2

File tree

10 files changed

+120
-8
lines changed

10 files changed

+120
-8
lines changed

include/osal.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,12 +76,20 @@ typedef void os_mbox_t;
7676
typedef void os_timer_t;
7777
#endif
7878

79+
#ifndef OS_TICK
80+
typedef void os_tick_t;
81+
#endif
82+
7983
void * os_malloc (size_t size);
8084
void os_free (void * ptr);
8185

8286
void os_usleep (uint32_t us);
8387
uint32_t os_get_current_time_us (void);
8488

89+
os_tick_t os_tick_current (void);
90+
os_tick_t os_tick_from_us (uint32_t us);
91+
void os_tick_sleep (os_tick_t tick);
92+
8593
os_thread_t * os_thread_create (
8694
const char * name,
8795
uint32_t priority,

src/freertos/osal.c

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,21 @@ uint32_t os_get_current_time_us (void)
8686
return 1000 * (xTaskGetTickCount() / portTICK_PERIOD_MS);
8787
}
8888

89+
os_tick_t os_tick_current (void)
90+
{
91+
return xTaskGetTickCount();
92+
}
93+
94+
os_tick_t os_tick_from_us (uint32_t us)
95+
{
96+
return us / (1000u * portTICK_PERIOD_MS);
97+
}
98+
99+
void os_tick_sleep (os_tick_t tick)
100+
{
101+
vTaskDelay (tick);
102+
}
103+
89104
os_sem_t * os_sem_create (size_t count)
90105
{
91106
SemaphoreHandle_t handle = xSemaphoreCreateCounting (UINT32_MAX, count);

src/freertos/sys/osal_sys.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ extern "C" {
3333
#define OS_EVENT
3434
#define OS_MBOX
3535
#define OS_TIMER
36+
#define OS_TICK
3637

3738
typedef SemaphoreHandle_t os_mutex_t;
3839
typedef TaskHandle_t os_thread_t;
@@ -48,6 +49,8 @@ typedef struct os_timer
4849
uint32_t us;
4950
} os_timer_t;
5051

52+
typedef TickType_t os_tick_t;
53+
5154
#ifdef __cplusplus
5255
}
5356
#endif

src/linux/osal.c

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,36 @@ uint32_t os_get_current_time_us (void)
234234
return ts.tv_sec * 1000 * 1000 + ts.tv_nsec / 1000;
235235
}
236236

237+
os_tick_t os_tick_current (void)
238+
{
239+
struct timespec ts;
240+
os_tick_t tick;
241+
242+
clock_gettime (CLOCK_MONOTONIC, &ts);
243+
tick = ts.tv_sec;
244+
tick *= NSECS_PER_SEC;
245+
tick += ts.tv_nsec;
246+
return tick;
247+
}
248+
249+
os_tick_t os_tick_from_us (uint32_t us)
250+
{
251+
return (os_tick_t)us * 1000;
252+
}
253+
254+
void os_tick_sleep (os_tick_t tick)
255+
{
256+
struct timespec ts;
257+
struct timespec remain;
258+
259+
ts.tv_sec = tick / NSECS_PER_SEC;
260+
ts.tv_nsec = tick % NSECS_PER_SEC;
261+
while (clock_nanosleep (CLOCK_MONOTONIC, 0, &ts, &remain) != 0)
262+
{
263+
ts = remain;
264+
}
265+
}
266+
237267
os_event_t * os_event_create (void)
238268
{
239269
os_event_t * event;

src/linux/sys/osal_sys.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ extern "C" {
2929
#define OS_EVENT
3030
#define OS_MBOX
3131
#define OS_TIMER
32+
#define OS_TICK
3233

3334
typedef pthread_t os_thread_t;
3435
typedef pthread_mutex_t os_mutex_t;
@@ -70,6 +71,8 @@ typedef struct os_timer
7071
bool oneshot;
7172
} os_timer_t;
7273

74+
typedef uint64_t os_tick_t;
75+
7376
#ifdef __cplusplus
7477
}
7578
#endif

src/rt-kernel/osal.c

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,21 @@ uint32_t os_get_current_time_us (void)
6565
return 1000 * tick_to_ms (tick_get());
6666
}
6767

68+
os_tick_t os_tick_current (void)
69+
{
70+
return tick_get();
71+
}
72+
73+
os_tick_t os_tick_from_us (uint32_t us)
74+
{
75+
return tick_from_ms (us / 1000);
76+
}
77+
78+
void os_tick_sleep (os_tick_t tick)
79+
{
80+
task_delay (tick);
81+
}
82+
6883
os_sem_t * os_sem_create (size_t count)
6984
{
7085
return sem_create (count);

src/rt-kernel/sys/osal_sys.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,15 @@ extern "C" {
2828
#define OS_EVENT
2929
#define OS_MBOX
3030
#define OS_TIMER
31+
#define OS_TICK
3132

3233
typedef task_t os_thread_t;
3334
typedef mtx_t os_mutex_t;
3435
typedef sem_t os_sem_t;
3536
typedef flags_t os_event_t;
3637
typedef mbox_t os_mbox_t;
3738
typedef tmr_t os_timer_t;
39+
typedef tick_t os_tick_t;
3840

3941
#ifdef __cplusplus
4042
}

src/windows/osal.c

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -74,24 +74,45 @@ os_thread_t * os_thread_create (
7474
return handle;
7575
}
7676

77-
uint32_t os_get_current_time_us (void)
77+
static uint64_t os_get_frequency_tick (void)
7878
{
79-
static LARGE_INTEGER performanceFrequency = {0};
80-
LARGE_INTEGER currentCount;
81-
uint64_t currentTime;
82-
83-
if (performanceFrequency.QuadPart == 0)
79+
static uint64_t frequency;
80+
if (frequency == 0)
8481
{
82+
LARGE_INTEGER performanceFrequency;
8583
timeBeginPeriod (URESOLUTION);
8684
QueryPerformanceFrequency (&performanceFrequency);
87-
performanceFrequency.QuadPart = performanceFrequency.QuadPart / (1000 * 1000);
85+
frequency = performanceFrequency.QuadPart;
8886
}
87+
return frequency;
88+
}
8989

90+
uint32_t os_get_current_time_us (void)
91+
{
92+
LARGE_INTEGER currentCount;
93+
uint64_t currentTime;
9094
QueryPerformanceCounter (&currentCount);
91-
currentTime = currentCount.QuadPart / performanceFrequency.QuadPart;
95+
currentTime = 1000000 * currentCount.QuadPart / os_get_frequency_tick();
9296
return (uint32_t)(currentTime & UINT32_MAX);
9397
}
9498

99+
os_tick_t os_tick_current (void)
100+
{
101+
LARGE_INTEGER currentCount;
102+
QueryPerformanceCounter (&currentCount);
103+
return currentCount.QuadPart;
104+
}
105+
106+
os_tick_t os_tick_from_us (uint32_t us)
107+
{
108+
return os_get_frequency_tick() * us / 1000000;
109+
}
110+
111+
void os_tick_sleep (os_tick_t tick)
112+
{
113+
Sleep (1000u * tick / os_get_frequency_tick());
114+
}
115+
95116
os_sem_t * os_sem_create (size_t count)
96117
{
97118
os_sem_t * sem;

src/windows/sys/osal_sys.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ extern "C" {
3030
#define OS_EVENT
3131
#define OS_MBOX
3232
#define OS_TIMER
33+
#define OS_TICK
3334

3435
typedef HANDLE os_thread_t;
3536
typedef CRITICAL_SECTION os_mutex_t;
@@ -68,6 +69,8 @@ typedef struct os_timer
6869
bool oneshot;
6970
} os_timer_t;
7071

72+
typedef uint64_t os_tick_t;
73+
7174
#ifdef __cplusplus
7275
}
7376
#endif

test/test_osal.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,3 +209,15 @@ TEST_F (Osal, CurrentTime)
209209

210210
EXPECT_NEAR (100 * 1000, t1 - t0, 1000);
211211
}
212+
213+
214+
TEST_F (Osal, Tick)
215+
{
216+
uint32_t t0, t1;
217+
218+
t0 = os_tick_current();
219+
os_usleep (100 * 1000);
220+
t1 = os_tick_current();
221+
222+
EXPECT_NEAR (os_tick_from_us (100 * 1000), t1 - t0, os_tick_from_us (1000));
223+
}

0 commit comments

Comments
 (0)