RT-Thread - Clock

RT-Thread 2018-11-25 314

File: clock.c

取得當前 tick#

即回傳全域變數 rt_tick

功能 回傳值
取得當前的 system tick tick 值
41
42
43
44
45
46
47
48
49
50
51
/**
* This function will return current tick from operating system startup
*
* @return current tick
*/
rt_tick_t rt_tick_get(void)
{
/* return the global tick */
return rt_tick;
}
RTM_EXPORT(rt_tick_get);

設定當前 tick#

功能 回傳值 tick
修改 system tick void 欲修改的結果
  • 由於需要修改全域變數,因此這裡需要將中斷關閉進入 critical region
53
54
55
56
57
58
59
60
61
62
63
/**
* This function will set current tick
*/
void rt_tick_set(rt_tick_t tick)
{
rt_base_t level;

level = rt_hw_interrupt_disable();
rt_tick = tick;
rt_hw_interrupt_enable(level);
}

增加 tick#

  • 增加 tick 是由 ISR 所執行的動作,因此修改 rt_tick 值不需進入 critical region
  • 由於增加 tick 需要發出中斷,所以所有的 ISR 都不可以佔用太多時間(如果執行超過一個 tick 的時間,clock ISR 就無法在正確的時間發生中斷,時間就會不準)
功能 回傳值
增加 tick(clock ISR) void
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
/**
* This function will notify kernel there is one tick passed. Normally,
* this function is invoked by clock ISR.
*/
void rt_tick_increase(void)
{
struct rt_thread *thread;

/* increase the global tick */
++ rt_tick;

/* check time slice */
thread = rt_thread_self();

-- thread->remaining_tick;
if (thread->remaining_tick == 0)
{
/* change to initialized tick */
thread->remaining_tick = thread->init_tick;

/* yield */
rt_thread_yield();
}

/* check timer */
rt_timer_check();
}
  • 在增加 rt_tick 值的同時,也減少當前 thread 的剩餘 tick 值;當減至 0 時,重設剩餘 tick 並讓出處理器。
  • (rt_timer_check())