对源码中优先级处理和定时器的两个疑问?

发布于 2020-08-12 19:26:27

有两个源码上的小问题想请教下大家:
问题1:

#if RT_THREAD_PRIORITY_MAX > 32
        rt_thread_ready_table[thread->number] &= ~thread->high_mask;
        if (rt_thread_ready_table[thread->number] == 0)
        {
            rt_thread_ready_priority_group &= ~thread->number_mask;
        }
#else
        rt_thread_ready_priority_group &= ~thread->number_mask;
#endif

这里一个线程挂起之后,要将rt_thread_ready_priority_group对应优先级的位清0,但是一个优先级有其他的线程。如果清0不就无法访问到其他线程了吗?

问题2:

    /*
     * get timeout tick,
     * the max timeout tick shall not great than RT_TICK_MAX/2
     */
    RT_ASSERT(timer->init_tick < RT_TICK_MAX / 2);
    timer->timeout_tick = rt_tick_get() + timer->init_tick;

这里的 RT_TICK_MAX / 2要怎么理解呢?

查看更多

关注者
0
被浏览
264
geniusgogo
geniusgogo 认证专家 2020-08-13
这里一个线程挂起之后,要将rt_thread_ready_priority_group对应优先级的位清0,但是一个优先级有其他的线程。如果清0不就无法访问到其他线程了吗?
你的截图上并不是将一个任务的优先级清0,是当这个优先级组没有任务就绪的情况下才会清0.注意这里的组划分。

这里的 RT_TICK_MAX / 2要怎么理解呢?
这里的RT_TICK_MAX是rt_tick_t类型最大的数值取值。通常是无符号类型,那么一个rt_tick_t变量取值就是从0到RT_TICK_MAX。为了判断是否超时,通常系统里就限制定时器的超时设定不能大于这个数值范围的一半。然后这样在判断超时的时候就可以这样判断 if (rt_tick_get() - timer->timeout_tick < (RT_TICK_MAX / 2)) 超时了; else 没超时,或者超时太久太久了,定时器都跑超时一圈了。 所以通常情况下系统不会阻塞到太久太久以至于超时一圈了。

2 个回答
李子成
李子成 2020-08-13

问题1:同优先级的线程有时间片的。

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览