Skip to content

Commit f3dd8af

Browse files
CopilotBernardXiong
andcommitted
[clock_time] Fix data type compatibility and add libc integration
- Changed hrtimer cnt types from rt_uint64_t to unsigned long for ktime compatibility - Added RT_USING_CLOCK_TIME support to libc/ctime.c - Added proper type definitions for ktime compatibility layer - Fixed all type casts and function signatures Co-authored-by: BernardXiong <[email protected]>
1 parent 32587a3 commit f3dd8af

File tree

4 files changed

+50
-37
lines changed

4 files changed

+50
-37
lines changed

components/drivers/clock_time/src/hrtimer.c

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ static void _insert_timer_to_list_locked(rt_clock_hrtimer_t timer)
8686
static void _hrtimer_process_locked(void)
8787
{
8888
rt_clock_hrtimer_t timer;
89-
rt_uint64_t current_cnt = rt_clock_time_getcnt();
89+
unsigned long current_cnt = (unsigned long)rt_clock_time_getcnt();
9090

9191
for (timer = _first_hrtimer();
9292
(timer != RT_NULL) && (timer->timeout_cnt <= current_cnt);
@@ -96,7 +96,7 @@ static void _hrtimer_process_locked(void)
9696

9797
if (timer->flag & RT_TIMER_FLAG_PERIODIC)
9898
{
99-
timer->timeout_cnt = timer->delay_cnt + rt_clock_time_getcnt();
99+
timer->timeout_cnt = timer->delay_cnt + (unsigned long)rt_clock_time_getcnt();
100100
_insert_timer_to_list_locked(timer);
101101
}
102102
else
@@ -111,10 +111,10 @@ static void _hrtimer_process_locked(void)
111111
}
112112
}
113113

114-
static rt_uint64_t _cnt_convert_to_hardware(rt_uint64_t target_cnt)
114+
static unsigned long _cnt_convert_to_hardware(unsigned long target_cnt)
115115
{
116-
rt_uint64_t current_cnt = rt_clock_time_getcnt();
117-
rt_uint64_t delta = target_cnt - current_cnt;
116+
unsigned long current_cnt = (unsigned long)rt_clock_time_getcnt();
117+
unsigned long delta = target_cnt - current_cnt;
118118

119119
/* Check for overflow or already expired */
120120
if (delta > (_HRTIMER_MAX_CNT / 2))
@@ -129,7 +129,7 @@ static rt_uint64_t _cnt_convert_to_hardware(rt_uint64_t target_cnt)
129129
static void _set_next_timeout_locked(void)
130130
{
131131
rt_clock_hrtimer_t timer;
132-
rt_uint64_t next_timeout_cnt;
132+
unsigned long next_timeout_cnt;
133133
rt_bool_t find_next;
134134

135135
do
@@ -182,7 +182,7 @@ void rt_clock_hrtimer_init(rt_clock_hrtimer_t timer,
182182
rt_completion_init(&timer->completion);
183183
}
184184

185-
rt_err_t rt_clock_hrtimer_start(rt_clock_hrtimer_t timer, rt_uint64_t delay_cnt)
185+
rt_err_t rt_clock_hrtimer_start(rt_clock_hrtimer_t timer, unsigned long delay_cnt)
186186
{
187187
rt_base_t level;
188188

@@ -242,13 +242,13 @@ rt_err_t rt_clock_hrtimer_control(rt_clock_hrtimer_t timer, int cmd, void *arg)
242242
switch (cmd)
243243
{
244244
case RT_TIMER_CTRL_GET_TIME:
245-
*(rt_uint64_t *)arg = timer->delay_cnt;
245+
*(unsigned long *)arg = timer->delay_cnt;
246246
break;
247247

248248
case RT_TIMER_CTRL_SET_TIME:
249-
RT_ASSERT((*(rt_uint64_t *)arg) < (_HRTIMER_MAX_CNT / 2));
250-
timer->delay_cnt = *(rt_uint64_t *)arg;
251-
timer->timeout_cnt = *(rt_uint64_t *)arg + rt_clock_time_getcnt();
249+
RT_ASSERT((*(unsigned long *)arg) < (_HRTIMER_MAX_CNT / 2));
250+
timer->delay_cnt = *(unsigned long *)arg;
251+
timer->timeout_cnt = *(unsigned long *)arg + rt_clock_time_getcnt();
252252
break;
253253

254254
case RT_TIMER_CTRL_SET_ONESHOT:
@@ -271,7 +271,7 @@ rt_err_t rt_clock_hrtimer_control(rt_clock_hrtimer_t timer, int cmd, void *arg)
271271
break;
272272

273273
case RT_TIMER_CTRL_GET_REMAIN_TIME:
274-
*(rt_uint64_t *)arg = timer->timeout_cnt;
274+
*(unsigned long *)arg = timer->timeout_cnt;
275275
break;
276276

277277
case RT_TIMER_CTRL_GET_FUNC:
@@ -330,7 +330,7 @@ static void _sleep_timeout(void *parameter)
330330
rt_completion_done(&timer->completion);
331331
}
332332

333-
rt_err_t rt_clock_hrtimer_sleep(rt_clock_hrtimer_t timer, rt_uint64_t cnt)
333+
rt_err_t rt_clock_hrtimer_sleep(rt_clock_hrtimer_t timer, unsigned long cnt)
334334
{
335335
RT_ASSERT(timer != RT_NULL);
336336

@@ -354,37 +354,37 @@ rt_err_t rt_clock_hrtimer_sleep(rt_clock_hrtimer_t timer, rt_uint64_t cnt)
354354
return RT_EOK;
355355
}
356356

357-
rt_err_t rt_clock_hrtimer_ndelay(rt_clock_hrtimer_t timer, rt_uint64_t ns)
357+
rt_err_t rt_clock_hrtimer_ndelay(rt_clock_hrtimer_t timer, unsigned long ns)
358358
{
359-
rt_uint64_t cnt = rt_clock_time_ns_to_cnt(ns);
359+
unsigned long cnt = (unsigned long)rt_clock_time_ns_to_cnt(ns);
360360
return rt_clock_hrtimer_sleep(timer, cnt);
361361
}
362362

363-
rt_err_t rt_clock_hrtimer_udelay(rt_clock_hrtimer_t timer, rt_uint64_t us)
363+
rt_err_t rt_clock_hrtimer_udelay(rt_clock_hrtimer_t timer, unsigned long us)
364364
{
365365
return rt_clock_hrtimer_ndelay(timer, us * 1000);
366366
}
367367

368-
rt_err_t rt_clock_hrtimer_mdelay(rt_clock_hrtimer_t timer, rt_uint64_t ms)
368+
rt_err_t rt_clock_hrtimer_mdelay(rt_clock_hrtimer_t timer, unsigned long ms)
369369
{
370370
return rt_clock_hrtimer_ndelay(timer, ms * 1000 * 1000);
371371
}
372372

373373
/* Simple delay functions with internal timer */
374374

375-
rt_err_t rt_clock_ndelay(rt_uint64_t ns)
375+
rt_err_t rt_clock_ndelay(unsigned long ns)
376376
{
377377
struct rt_clock_hrtimer timer;
378378
return rt_clock_hrtimer_ndelay(&timer, ns);
379379
}
380380

381-
rt_err_t rt_clock_udelay(rt_uint64_t us)
381+
rt_err_t rt_clock_udelay(unsigned long us)
382382
{
383383
struct rt_clock_hrtimer timer;
384384
return rt_clock_hrtimer_udelay(&timer, us);
385385
}
386386

387-
rt_err_t rt_clock_mdelay(rt_uint64_t ms)
387+
rt_err_t rt_clock_mdelay(unsigned long ms)
388388
{
389389
struct rt_clock_hrtimer timer;
390390
return rt_clock_hrtimer_mdelay(&timer, ms);

components/drivers/clock_time/src/ktime_compat.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@
1010

1111
#include <rtdevice.h>
1212
#include <rthw.h>
13+
#include <sys/time.h>
14+
#include <drivers/clock_time.h>
15+
#include <ktime.h>
1316

1417
/* Legacy ktime API wrappers */
1518

components/drivers/include/drivers/clock_time.h

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -132,14 +132,22 @@ struct rt_clock_hrtimer
132132
char name[RT_NAME_MAX]; /* Timer name */
133133
rt_list_t node; /* List node */
134134
void *parameter; /* User parameter */
135-
rt_uint64_t delay_cnt; /* Delay in counter ticks */
136-
rt_uint64_t timeout_cnt; /* Absolute timeout counter value */
135+
unsigned long delay_cnt; /* Delay in counter ticks */
136+
unsigned long timeout_cnt; /* Absolute timeout counter value */
137137
rt_err_t error; /* Error code */
138138
struct rt_completion completion; /* Completion for blocking waits */
139139
void (*timeout_func)(void *parameter); /* Timeout callback */
140140
};
141141
typedef struct rt_clock_hrtimer *rt_clock_hrtimer_t;
142142

143+
/* Compatibility typedefs for legacy ktime APIs */
144+
#ifdef RT_CLOCK_TIME_COMPAT_KTIME
145+
struct rt_ktime_hrtimer;
146+
typedef struct rt_clock_hrtimer rt_ktime_hrtimer;
147+
typedef struct rt_clock_hrtimer *rt_ktime_hrtimer_t;
148+
#define RT_KTIME_RESMUL RT_CLOCK_TIME_RESMUL
149+
#endif
150+
143151
/**
144152
* @brief Initialize a high-resolution timer
145153
*
@@ -162,7 +170,7 @@ void rt_clock_hrtimer_init(rt_clock_hrtimer_t timer,
162170
* @param delay_cnt Delay in counter ticks
163171
* @return RT_EOK on success, error code otherwise
164172
*/
165-
rt_err_t rt_clock_hrtimer_start(rt_clock_hrtimer_t timer, rt_uint64_t delay_cnt);
173+
rt_err_t rt_clock_hrtimer_start(rt_clock_hrtimer_t timer, unsigned long delay_cnt);
166174

167175
/**
168176
* @brief Stop a high-resolution timer
@@ -193,17 +201,17 @@ rt_err_t rt_clock_hrtimer_detach(rt_clock_hrtimer_t timer);
193201
/**
194202
* @brief High-precision delay functions
195203
*/
196-
rt_err_t rt_clock_hrtimer_sleep(rt_clock_hrtimer_t timer, rt_uint64_t cnt);
197-
rt_err_t rt_clock_hrtimer_ndelay(rt_clock_hrtimer_t timer, rt_uint64_t ns);
198-
rt_err_t rt_clock_hrtimer_udelay(rt_clock_hrtimer_t timer, rt_uint64_t us);
199-
rt_err_t rt_clock_hrtimer_mdelay(rt_clock_hrtimer_t timer, rt_uint64_t ms);
204+
rt_err_t rt_clock_hrtimer_sleep(rt_clock_hrtimer_t timer, unsigned long cnt);
205+
rt_err_t rt_clock_hrtimer_ndelay(rt_clock_hrtimer_t timer, unsigned long ns);
206+
rt_err_t rt_clock_hrtimer_udelay(rt_clock_hrtimer_t timer, unsigned long us);
207+
rt_err_t rt_clock_hrtimer_mdelay(rt_clock_hrtimer_t timer, unsigned long ms);
200208

201209
/**
202210
* @brief Simple delay functions (use internal timer)
203211
*/
204-
rt_err_t rt_clock_ndelay(rt_uint64_t ns);
205-
rt_err_t rt_clock_udelay(rt_uint64_t us);
206-
rt_err_t rt_clock_mdelay(rt_uint64_t ms);
212+
rt_err_t rt_clock_ndelay(unsigned long ns);
213+
rt_err_t rt_clock_udelay(unsigned long us);
214+
rt_err_t rt_clock_mdelay(unsigned long ms);
207215

208216
/**
209217
* @brief Process hrtimer timeouts (called from device driver ISR)

components/libc/compilers/common/ctime.c

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,9 @@
4242
#ifdef RT_USING_POSIX_DELAY
4343
#include <delay.h>
4444
#endif
45-
#ifdef RT_USING_KTIME
45+
#ifdef RT_USING_CLOCK_TIME
46+
#include <drivers/clock_time.h>
47+
#elif defined(RT_USING_KTIME)
4648
#include <ktime.h>
4749
#endif
4850

@@ -535,7 +537,7 @@ int settimeofday(const struct timeval *tv, const struct timezone *tz)
535537
}
536538
RTM_EXPORT(settimeofday);
537539

538-
#if defined(RT_USING_POSIX_DELAY) && defined(RT_USING_KTIME)
540+
#if defined(RT_USING_POSIX_DELAY) && (defined(RT_USING_KTIME) || defined(RT_USING_CLOCK_TIME))
539541
int nanosleep(const struct timespec *rqtp, struct timespec *rmtp)
540542
{
541543
struct timespec old_ts = {0};
@@ -588,9 +590,9 @@ int nanosleep(const struct timespec *rqtp, struct timespec *rmtp)
588590
return 0;
589591
}
590592
RTM_EXPORT(nanosleep);
591-
#endif /* RT_USING_POSIX_DELAY && RT_USING_KTIME */
593+
#endif /* RT_USING_POSIX_DELAY && (RT_USING_KTIME || RT_USING_CLOCK_TIME) */
592594

593-
#if defined(RT_USING_POSIX_CLOCK) && defined(RT_USING_KTIME)
595+
#if defined(RT_USING_POSIX_CLOCK) && (defined(RT_USING_KTIME) || defined(RT_USING_CLOCK_TIME))
594596

595597
int clock_getres(clockid_t clockid, struct timespec *res)
596598
{
@@ -789,9 +791,9 @@ int rt_timespec_to_tick(const struct timespec *time)
789791
}
790792
RTM_EXPORT(rt_timespec_to_tick);
791793

792-
#endif /* RT_USING_POSIX_CLOCK && RT_USING_KTIME */
794+
#endif /* RT_USING_POSIX_CLOCK && (RT_USING_KTIME || RT_USING_CLOCK_TIME) */
793795

794-
#if defined(RT_USING_POSIX_TIMER) && defined(RT_USING_KTIME)
796+
#if defined(RT_USING_POSIX_TIMER) && (defined(RT_USING_KTIME) || defined(RT_USING_CLOCK_TIME))
795797

796798
#include <resource_id.h>
797799

@@ -1250,4 +1252,4 @@ int timer_settime(timer_t timerid, int flags, const struct itimerspec *value,
12501252
return 0;
12511253
}
12521254
RTM_EXPORT(timer_settime);
1253-
#endif /* RT_USING_POSIX_TIMER && RT_USING_KTIME */
1255+
#endif /* RT_USING_POSIX_TIMER && (RT_USING_KTIME || RT_USING_CLOCK_TIME) */

0 commit comments

Comments
 (0)