kernel 进阶API

1. 

#define cond_resched() ({            \
    ___might_sleep(__FILE__, __LINE__, 0);    \
    _cond_resched();            \
})

        int __sched _cond_resched(void)
        {
            if (should_resched(0)) {
                preempt_schedule_common();
                return 1;
            }
            return 0;
        }
        
                static __always_inline bool should_resched(int preempt_offset)
                {
                    return unlikely(preempt_count() == preempt_offset &&
                            tif_need_resched());
                }

                        #define tif_need_resched() test_thread_flag(TIF_NEED_RESCHED)

一个A进程, 在用户态时, 时间滴答如果选出新的高优先级B进程的话, 会立即进程切换, 如果A进程处于
内核态时,滴答不能立即切换B进程, 只是在A进程的thread_info.flag标志 TIF_NEED_RESCHED , 然后A进程
从内核态返回用户态时, 系统判断如果有这个TIF_NEED_RESCHED标志, 就立马切换到B进程,所以内核态的程序
(驱动)如果while(1); 除了中断会得到执行, 其他代码都没机会运行, 因此一个驱动处理完事情尽快返回用户态,
或者主动调用sleep(), 先休眠, 如果既想贪心执行, 又脸皮薄怕其他进程等太久, 可以通过cond_resched() 判断
一下自身有没有TIF_NEED_RESCHED, 有的话说明有更急的进程需要执行, 那就切换, 否则就心安理得的跑(不是我不让, 是你们没叫我让)

 

2.

cd->health_thread = kthread_run(genwqe_health_thread, cd, GENWQE_DEVNAME "%d_health", cd->card_idx);

kthread_stop(cd->health_thread);

static int genwqe_health_thread(void *data)
{

    while (!kthread_should_stop()) {
        rc = wait_event_interruptible_timeout(cd->health_waitq,
             (genwqe_health_check_cond(cd, &gfir) ||
              (should_stop = kthread_should_stop())),
                genwqe_health_check_interval * HZ);

    }
}

    如果一个线程可以一直做某事就直接while(1) 否则就增加一个判断条件

 

3.

#include <stdio.h>

void test(int a)
{
        switch(a) {
        case 1: printf("1\n"); break;
        default: printf("default\n"); break;
        case 0: printf("0\n"); break;
        }
}

void main()
{
        test(5);
        printf("==============\n");
        test(0);
}

default
==============
0

 

posted @ 2019-04-29 17:26  Vedic  阅读(343)  评论(0编辑  收藏  举报