xref: /nrf52832-nimble/rt-thread/src/clock.c (revision 104654410c56c573564690304ae786df310c91fc)
1*10465441SEvalZero /*
2*10465441SEvalZero  * Copyright (c) 2006-2018, RT-Thread Development Team
3*10465441SEvalZero  *
4*10465441SEvalZero  * SPDX-License-Identifier: Apache-2.0
5*10465441SEvalZero  *
6*10465441SEvalZero  * Change Logs:
7*10465441SEvalZero  * Date           Author       Notes
8*10465441SEvalZero  * 2006-03-12     Bernard      first version
9*10465441SEvalZero  * 2006-05-27     Bernard      add support for same priority thread schedule
10*10465441SEvalZero  * 2006-08-10     Bernard      remove the last rt_schedule in rt_tick_increase
11*10465441SEvalZero  * 2010-03-08     Bernard      remove rt_passed_second
12*10465441SEvalZero  * 2010-05-20     Bernard      fix the tick exceeds the maximum limits
13*10465441SEvalZero  * 2010-07-13     Bernard      fix rt_tick_from_millisecond issue found by kuronca
14*10465441SEvalZero  * 2011-06-26     Bernard      add rt_tick_set function.
15*10465441SEvalZero  * 2018-11-22     Jesven       add per cpu tick
16*10465441SEvalZero  */
17*10465441SEvalZero 
18*10465441SEvalZero #include <rthw.h>
19*10465441SEvalZero #include <rtthread.h>
20*10465441SEvalZero 
21*10465441SEvalZero #ifdef RT_USING_SMP
22*10465441SEvalZero #define rt_tick rt_cpu_index(0)->tick
23*10465441SEvalZero #else
24*10465441SEvalZero static rt_tick_t rt_tick = 0;
25*10465441SEvalZero #endif
26*10465441SEvalZero 
27*10465441SEvalZero extern void rt_timer_check(void);
28*10465441SEvalZero 
29*10465441SEvalZero /**
30*10465441SEvalZero  * This function will init system tick and set it to zero.
31*10465441SEvalZero  * @ingroup SystemInit
32*10465441SEvalZero  *
33*10465441SEvalZero  * @deprecated since 1.1.0, this function does not need to be invoked
34*10465441SEvalZero  * in the system initialization.
35*10465441SEvalZero  */
rt_system_tick_init(void)36*10465441SEvalZero void rt_system_tick_init(void)
37*10465441SEvalZero {
38*10465441SEvalZero }
39*10465441SEvalZero 
40*10465441SEvalZero /**
41*10465441SEvalZero  * @addtogroup Clock
42*10465441SEvalZero  */
43*10465441SEvalZero 
44*10465441SEvalZero /**@{*/
45*10465441SEvalZero 
46*10465441SEvalZero /**
47*10465441SEvalZero  * This function will return current tick from operating system startup
48*10465441SEvalZero  *
49*10465441SEvalZero  * @return current tick
50*10465441SEvalZero  */
rt_tick_get(void)51*10465441SEvalZero rt_tick_t rt_tick_get(void)
52*10465441SEvalZero {
53*10465441SEvalZero     /* return the global tick */
54*10465441SEvalZero     return rt_tick;
55*10465441SEvalZero }
56*10465441SEvalZero RTM_EXPORT(rt_tick_get);
57*10465441SEvalZero 
58*10465441SEvalZero /**
59*10465441SEvalZero  * This function will set current tick
60*10465441SEvalZero  */
rt_tick_set(rt_tick_t tick)61*10465441SEvalZero void rt_tick_set(rt_tick_t tick)
62*10465441SEvalZero {
63*10465441SEvalZero     rt_base_t level;
64*10465441SEvalZero 
65*10465441SEvalZero     level = rt_hw_interrupt_disable();
66*10465441SEvalZero     rt_tick = tick;
67*10465441SEvalZero     rt_hw_interrupt_enable(level);
68*10465441SEvalZero }
69*10465441SEvalZero 
70*10465441SEvalZero /**
71*10465441SEvalZero  * This function will notify kernel there is one tick passed. Normally,
72*10465441SEvalZero  * this function is invoked by clock ISR.
73*10465441SEvalZero  */
rt_tick_increase(void)74*10465441SEvalZero void rt_tick_increase(void)
75*10465441SEvalZero {
76*10465441SEvalZero     struct rt_thread *thread;
77*10465441SEvalZero 
78*10465441SEvalZero     /* increase the global tick */
79*10465441SEvalZero #ifdef RT_USING_SMP
80*10465441SEvalZero     rt_cpu_self()->tick ++;
81*10465441SEvalZero #else
82*10465441SEvalZero     ++ rt_tick;
83*10465441SEvalZero #endif
84*10465441SEvalZero 
85*10465441SEvalZero     /* check time slice */
86*10465441SEvalZero     thread = rt_thread_self();
87*10465441SEvalZero 
88*10465441SEvalZero     -- thread->remaining_tick;
89*10465441SEvalZero     if (thread->remaining_tick == 0)
90*10465441SEvalZero     {
91*10465441SEvalZero         /* change to initialized tick */
92*10465441SEvalZero         thread->remaining_tick = thread->init_tick;
93*10465441SEvalZero 
94*10465441SEvalZero         /* yield */
95*10465441SEvalZero         rt_thread_yield();
96*10465441SEvalZero     }
97*10465441SEvalZero 
98*10465441SEvalZero     /* check timer */
99*10465441SEvalZero     rt_timer_check();
100*10465441SEvalZero }
101*10465441SEvalZero 
102*10465441SEvalZero /**
103*10465441SEvalZero  * This function will calculate the tick from millisecond.
104*10465441SEvalZero  *
105*10465441SEvalZero  * @param ms the specified millisecond
106*10465441SEvalZero  *           - Negative Number wait forever
107*10465441SEvalZero  *           - Zero not wait
108*10465441SEvalZero  *           - Max 0x7fffffff
109*10465441SEvalZero  *
110*10465441SEvalZero  * @return the calculated tick
111*10465441SEvalZero  */
rt_tick_from_millisecond(rt_int32_t ms)112*10465441SEvalZero int rt_tick_from_millisecond(rt_int32_t ms)
113*10465441SEvalZero {
114*10465441SEvalZero     int tick;
115*10465441SEvalZero 
116*10465441SEvalZero     if (ms < 0)
117*10465441SEvalZero         tick = RT_WAITING_FOREVER;
118*10465441SEvalZero     else
119*10465441SEvalZero         tick = (RT_TICK_PER_SECOND * ms + 999) / 1000;
120*10465441SEvalZero 
121*10465441SEvalZero     /* return the calculated tick */
122*10465441SEvalZero     return tick;
123*10465441SEvalZero }
124*10465441SEvalZero RTM_EXPORT(rt_tick_from_millisecond);
125*10465441SEvalZero 
126*10465441SEvalZero /**@}*/
127*10465441SEvalZero 
128