驅動程式 - Linux Device Driver (LDD) - 使用範例 - C/C++ (PocketBeagle) - KThread



Thread是執行的最小單位,在多核CPU上,產生的Thread可以同時的運作,這意謂著使用Thread技術可以用來改善效能,但是,每個Thread間的資料同步則是另一個課題

使用步驟:

1. kthread_create()
2. wake_up_process()
3. kthread_should_stop()
4. kthread_stop()

main.c

#include <linux/init.h>
#include <linux/device.h>
#include <linux/module.h>
#include <linux/delay.h>
#include <linux/kthread.h>

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Steward Fu");
MODULE_DESCRIPTION("Linux Driver");

struct task_struct *mykthread = NULL;

static int kthread_handler(void *data)
{
    printk("%s++\n", __func__);
    while (!kthread_should_stop()) {
        msleep(100);
    }
    printk("%s--\n", __func__);
    return 0;
}

int ldd_init(void)
{
    mykthread = kthread_create(kthread_handler, NULL, "mykthread");
    wake_up_process(mykthread);
    return 0;
}
 
void ldd_exit(void)
{
    kthread_stop(mykthread);
}
 
module_init(ldd_init);
module_exit(ldd_exit);

ldd_init: 產生多個Thread並且執行
kthread_handler: 列印字串
ldd_exit: 停止Thread執行

測試

# insmod /boot/main.ko
    kthread_handler++

# rmmod main
    kthread_handler--