Bladeren bron

[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 <1241087+BernardXiong@users.noreply.github.com>
copilot-swe-agent[bot] 2 maanden geleden
bovenliggende
commit
f3dd8afc7d

+ 20 - 20
components/drivers/clock_time/src/hrtimer.c

@@ -86,7 +86,7 @@ static void _insert_timer_to_list_locked(rt_clock_hrtimer_t timer)
 static void _hrtimer_process_locked(void)
 {
     rt_clock_hrtimer_t timer;
-    rt_uint64_t current_cnt = rt_clock_time_getcnt();
+    unsigned long current_cnt = (unsigned long)rt_clock_time_getcnt();
     
     for (timer = _first_hrtimer();
          (timer != RT_NULL) && (timer->timeout_cnt <= current_cnt);
@@ -96,7 +96,7 @@ static void _hrtimer_process_locked(void)
         
         if (timer->flag & RT_TIMER_FLAG_PERIODIC)
         {
-            timer->timeout_cnt = timer->delay_cnt + rt_clock_time_getcnt();
+            timer->timeout_cnt = timer->delay_cnt + (unsigned long)rt_clock_time_getcnt();
             _insert_timer_to_list_locked(timer);
         }
         else
@@ -111,10 +111,10 @@ static void _hrtimer_process_locked(void)
     }
 }
 
-static rt_uint64_t _cnt_convert_to_hardware(rt_uint64_t target_cnt)
+static unsigned long _cnt_convert_to_hardware(unsigned long target_cnt)
 {
-    rt_uint64_t current_cnt = rt_clock_time_getcnt();
-    rt_uint64_t delta = target_cnt - current_cnt;
+    unsigned long current_cnt = (unsigned long)rt_clock_time_getcnt();
+    unsigned long delta = target_cnt - current_cnt;
     
     /* Check for overflow or already expired */
     if (delta > (_HRTIMER_MAX_CNT / 2))
@@ -129,7 +129,7 @@ static rt_uint64_t _cnt_convert_to_hardware(rt_uint64_t target_cnt)
 static void _set_next_timeout_locked(void)
 {
     rt_clock_hrtimer_t timer;
-    rt_uint64_t next_timeout_cnt;
+    unsigned long next_timeout_cnt;
     rt_bool_t find_next;
     
     do
@@ -182,7 +182,7 @@ void rt_clock_hrtimer_init(rt_clock_hrtimer_t timer,
     rt_completion_init(&timer->completion);
 }
 
-rt_err_t rt_clock_hrtimer_start(rt_clock_hrtimer_t timer, rt_uint64_t delay_cnt)
+rt_err_t rt_clock_hrtimer_start(rt_clock_hrtimer_t timer, unsigned long delay_cnt)
 {
     rt_base_t level;
     
@@ -242,13 +242,13 @@ rt_err_t rt_clock_hrtimer_control(rt_clock_hrtimer_t timer, int cmd, void *arg)
     switch (cmd)
     {
     case RT_TIMER_CTRL_GET_TIME:
-        *(rt_uint64_t *)arg = timer->delay_cnt;
+        *(unsigned long *)arg = timer->delay_cnt;
         break;
         
     case RT_TIMER_CTRL_SET_TIME:
-        RT_ASSERT((*(rt_uint64_t *)arg) < (_HRTIMER_MAX_CNT / 2));
-        timer->delay_cnt = *(rt_uint64_t *)arg;
-        timer->timeout_cnt = *(rt_uint64_t *)arg + rt_clock_time_getcnt();
+        RT_ASSERT((*(unsigned long *)arg) < (_HRTIMER_MAX_CNT / 2));
+        timer->delay_cnt = *(unsigned long *)arg;
+        timer->timeout_cnt = *(unsigned long *)arg + rt_clock_time_getcnt();
         break;
         
     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)
         break;
         
     case RT_TIMER_CTRL_GET_REMAIN_TIME:
-        *(rt_uint64_t *)arg = timer->timeout_cnt;
+        *(unsigned long *)arg = timer->timeout_cnt;
         break;
         
     case RT_TIMER_CTRL_GET_FUNC:
@@ -330,7 +330,7 @@ static void _sleep_timeout(void *parameter)
     rt_completion_done(&timer->completion);
 }
 
-rt_err_t rt_clock_hrtimer_sleep(rt_clock_hrtimer_t timer, rt_uint64_t cnt)
+rt_err_t rt_clock_hrtimer_sleep(rt_clock_hrtimer_t timer, unsigned long cnt)
 {
     RT_ASSERT(timer != RT_NULL);
     
@@ -354,37 +354,37 @@ rt_err_t rt_clock_hrtimer_sleep(rt_clock_hrtimer_t timer, rt_uint64_t cnt)
     return RT_EOK;
 }
 
-rt_err_t rt_clock_hrtimer_ndelay(rt_clock_hrtimer_t timer, rt_uint64_t ns)
+rt_err_t rt_clock_hrtimer_ndelay(rt_clock_hrtimer_t timer, unsigned long ns)
 {
-    rt_uint64_t cnt = rt_clock_time_ns_to_cnt(ns);
+    unsigned long cnt = (unsigned long)rt_clock_time_ns_to_cnt(ns);
     return rt_clock_hrtimer_sleep(timer, cnt);
 }
 
-rt_err_t rt_clock_hrtimer_udelay(rt_clock_hrtimer_t timer, rt_uint64_t us)
+rt_err_t rt_clock_hrtimer_udelay(rt_clock_hrtimer_t timer, unsigned long us)
 {
     return rt_clock_hrtimer_ndelay(timer, us * 1000);
 }
 
-rt_err_t rt_clock_hrtimer_mdelay(rt_clock_hrtimer_t timer, rt_uint64_t ms)
+rt_err_t rt_clock_hrtimer_mdelay(rt_clock_hrtimer_t timer, unsigned long ms)
 {
     return rt_clock_hrtimer_ndelay(timer, ms * 1000 * 1000);
 }
 
 /* Simple delay functions with internal timer */
 
-rt_err_t rt_clock_ndelay(rt_uint64_t ns)
+rt_err_t rt_clock_ndelay(unsigned long ns)
 {
     struct rt_clock_hrtimer timer;
     return rt_clock_hrtimer_ndelay(&timer, ns);
 }
 
-rt_err_t rt_clock_udelay(rt_uint64_t us)
+rt_err_t rt_clock_udelay(unsigned long us)
 {
     struct rt_clock_hrtimer timer;
     return rt_clock_hrtimer_udelay(&timer, us);
 }
 
-rt_err_t rt_clock_mdelay(rt_uint64_t ms)
+rt_err_t rt_clock_mdelay(unsigned long ms)
 {
     struct rt_clock_hrtimer timer;
     return rt_clock_hrtimer_mdelay(&timer, ms);

+ 3 - 0
components/drivers/clock_time/src/ktime_compat.c

@@ -10,6 +10,9 @@
 
 #include <rtdevice.h>
 #include <rthw.h>
+#include <sys/time.h>
+#include <drivers/clock_time.h>
+#include <ktime.h>
 
 /* Legacy ktime API wrappers */
 

+ 18 - 10
components/drivers/include/drivers/clock_time.h

@@ -132,14 +132,22 @@ struct rt_clock_hrtimer
     char                 name[RT_NAME_MAX];        /* Timer name */
     rt_list_t            node;                      /* List node */
     void                *parameter;                 /* User parameter */
-    rt_uint64_t          delay_cnt;                /* Delay in counter ticks */
-    rt_uint64_t          timeout_cnt;              /* Absolute timeout counter value */
+    unsigned long        delay_cnt;                /* Delay in counter ticks */
+    unsigned long        timeout_cnt;              /* Absolute timeout counter value */
     rt_err_t             error;                     /* Error code */
     struct rt_completion completion;                /* Completion for blocking waits */
     void (*timeout_func)(void *parameter);         /* Timeout callback */
 };
 typedef struct rt_clock_hrtimer *rt_clock_hrtimer_t;
 
+/* Compatibility typedefs for legacy ktime APIs */
+#ifdef RT_CLOCK_TIME_COMPAT_KTIME
+struct rt_ktime_hrtimer;
+typedef struct rt_clock_hrtimer rt_ktime_hrtimer;
+typedef struct rt_clock_hrtimer *rt_ktime_hrtimer_t;
+#define RT_KTIME_RESMUL RT_CLOCK_TIME_RESMUL
+#endif
+
 /**
  * @brief Initialize a high-resolution timer
  * 
@@ -162,7 +170,7 @@ void rt_clock_hrtimer_init(rt_clock_hrtimer_t timer,
  * @param delay_cnt Delay in counter ticks
  * @return RT_EOK on success, error code otherwise
  */
-rt_err_t rt_clock_hrtimer_start(rt_clock_hrtimer_t timer, rt_uint64_t delay_cnt);
+rt_err_t rt_clock_hrtimer_start(rt_clock_hrtimer_t timer, unsigned long delay_cnt);
 
 /**
  * @brief Stop a high-resolution timer
@@ -193,17 +201,17 @@ rt_err_t rt_clock_hrtimer_detach(rt_clock_hrtimer_t timer);
 /**
  * @brief High-precision delay functions
  */
-rt_err_t rt_clock_hrtimer_sleep(rt_clock_hrtimer_t timer, rt_uint64_t cnt);
-rt_err_t rt_clock_hrtimer_ndelay(rt_clock_hrtimer_t timer, rt_uint64_t ns);
-rt_err_t rt_clock_hrtimer_udelay(rt_clock_hrtimer_t timer, rt_uint64_t us);
-rt_err_t rt_clock_hrtimer_mdelay(rt_clock_hrtimer_t timer, rt_uint64_t ms);
+rt_err_t rt_clock_hrtimer_sleep(rt_clock_hrtimer_t timer, unsigned long cnt);
+rt_err_t rt_clock_hrtimer_ndelay(rt_clock_hrtimer_t timer, unsigned long ns);
+rt_err_t rt_clock_hrtimer_udelay(rt_clock_hrtimer_t timer, unsigned long us);
+rt_err_t rt_clock_hrtimer_mdelay(rt_clock_hrtimer_t timer, unsigned long ms);
 
 /**
  * @brief Simple delay functions (use internal timer)
  */
-rt_err_t rt_clock_ndelay(rt_uint64_t ns);
-rt_err_t rt_clock_udelay(rt_uint64_t us);
-rt_err_t rt_clock_mdelay(rt_uint64_t ms);
+rt_err_t rt_clock_ndelay(unsigned long ns);
+rt_err_t rt_clock_udelay(unsigned long us);
+rt_err_t rt_clock_mdelay(unsigned long ms);
 
 /**
  * @brief Process hrtimer timeouts (called from device driver ISR)

+ 9 - 7
components/libc/compilers/common/ctime.c

@@ -42,7 +42,9 @@
 #ifdef RT_USING_POSIX_DELAY
 #include <delay.h>
 #endif
-#ifdef RT_USING_KTIME
+#ifdef RT_USING_CLOCK_TIME
+#include <drivers/clock_time.h>
+#elif defined(RT_USING_KTIME)
 #include <ktime.h>
 #endif
 
@@ -535,7 +537,7 @@ int settimeofday(const struct timeval *tv, const struct timezone *tz)
 }
 RTM_EXPORT(settimeofday);
 
-#if defined(RT_USING_POSIX_DELAY) && defined(RT_USING_KTIME)
+#if defined(RT_USING_POSIX_DELAY) && (defined(RT_USING_KTIME) || defined(RT_USING_CLOCK_TIME))
 int nanosleep(const struct timespec *rqtp, struct timespec *rmtp)
 {
     struct timespec old_ts = {0};
@@ -588,9 +590,9 @@ int nanosleep(const struct timespec *rqtp, struct timespec *rmtp)
     return 0;
 }
 RTM_EXPORT(nanosleep);
-#endif /* RT_USING_POSIX_DELAY && RT_USING_KTIME */
+#endif /* RT_USING_POSIX_DELAY && (RT_USING_KTIME || RT_USING_CLOCK_TIME) */
 
-#if defined(RT_USING_POSIX_CLOCK) && defined(RT_USING_KTIME)
+#if defined(RT_USING_POSIX_CLOCK) && (defined(RT_USING_KTIME) || defined(RT_USING_CLOCK_TIME))
 
 int clock_getres(clockid_t clockid, struct timespec *res)
 {
@@ -789,9 +791,9 @@ int rt_timespec_to_tick(const struct timespec *time)
 }
 RTM_EXPORT(rt_timespec_to_tick);
 
-#endif /* RT_USING_POSIX_CLOCK && RT_USING_KTIME */
+#endif /* RT_USING_POSIX_CLOCK && (RT_USING_KTIME || RT_USING_CLOCK_TIME) */
 
-#if defined(RT_USING_POSIX_TIMER) && defined(RT_USING_KTIME)
+#if defined(RT_USING_POSIX_TIMER) && (defined(RT_USING_KTIME) || defined(RT_USING_CLOCK_TIME))
 
 #include <resource_id.h>
 
@@ -1250,4 +1252,4 @@ int timer_settime(timer_t timerid, int flags, const struct itimerspec *value,
     return 0;
 }
 RTM_EXPORT(timer_settime);
-#endif /* RT_USING_POSIX_TIMER && RT_USING_KTIME */
+#endif /* RT_USING_POSIX_TIMER && (RT_USING_KTIME || RT_USING_CLOCK_TIME) */