整体思想
- 假如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