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*10465441SEvalZerovoid 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*10465441SEvalZerort_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*10465441SEvalZerovoid 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*10465441SEvalZerovoid 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*10465441SEvalZeroint 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