整體思想
- 假如A、B兩個線程優先級相同,A先啓動,只要A不主動讓出CPU,線程B就沒機會執行。
- 時間片就是爲了解決相同優先級下多線程的併發問題。
線程控制塊
- 添加
rt_ubase_t init_tick
屬性,remaining_tick
記錄剩餘的時間片。
struct rt_thread
{
char name[RT_NAME_MAX];
rt_uint8_t type;
rt_uint8_t flags;
rt_list_t list;
rt_list_t tlist;
void *sp;
void *entry;
void *parameter;
void *stack_addr;
rt_uint32_t stack_size;
rt_ubase_t init_tick;
rt_ubase_t remaining_tick;
rt_uint8_t current_priority;
rt_uint8_t init_priority;
rt_uint32_t number_mask;
rt_err_t error;
rt_uint8_t stat;
struct rt_timer thread_timer;
};
typedef struct rt_thread *rt_thread_t;
線程初始化函數修改
rt_thread_init( &rt_flag1_thread,
"rt_flag1_thread",
flag1_thread_entry,
RT_NULL,
&rt_flag1_thread_stack[0],
sizeof(rt_flag1_thread_stack),
2,
4);
時基更新函數修改
- 如果時間片到了就重置時間片,調用
rt_thread_yield()
讓出CPU。
void rt_tick_increase(void)
{
struct rt_thread *thread;
rt_tick ++;
thread = rt_thread_self();
--thread->remaining_tick;
if(thread->remaining_tick == 0){
thread->remaining_tick = thread->init_tick;
rt_thread_yield();
}
rt_timer_check();
}
- 函數rt_err_t rt_thread_yield(void)
rt_err_t rt_thread_yield(void)
{
register rt_base_t level;
struct rt_thread *thread;
level = rt_hw_interrupt_disable();
thread = rt_current_thread;
if ((thread->stat & RT_THREAD_STAT_MASK) == RT_THREAD_READY &&
thread->tlist.next != thread->tlist.prev)
{
rt_list_remove(&(thread->tlist));
rt_list_insert_before(&(rt_thread_priority_table[thread->current_priority]),
&(thread->tlist));
rt_hw_interrupt_enable(level);
rt_schedule();
return RT_EOK;
}
rt_hw_interrupt_enable(level);
return RT_EOK;
}
工程代碼
12_time_slice