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