91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Linux驅(qū)動(dòng)開(kāi)發(fā)-內(nèi)核共享工作隊(duì)列

DS小龍哥-嵌入式技術(shù) ? 2022-09-17 15:03 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

【摘要】 在工作隊(duì)列里,我們把推后執(zhí)行的任務(wù)叫做工作(work),描述它的數(shù)據(jù)結(jié)構(gòu)為work_struct,這些工作以隊(duì)列結(jié)構(gòu)組織成工作隊(duì)列(workqueue),其數(shù)據(jù)結(jié)構(gòu)為workqueue_struct,而工作線程就是負(fù)責(zé)執(zhí)行工作隊(duì)列中的工作。系統(tǒng)有默認(rèn)的工作者線程,自己也可以創(chuàng)建自己的工作者線程。

1. 內(nèi)核工作隊(duì)列

工作隊(duì)列常見(jiàn)的使用形式是配合中斷使用,在中斷的服務(wù)函數(shù)里無(wú)法調(diào)用會(huì)導(dǎo)致休眠的相關(guān)函數(shù)代碼,有了工作隊(duì)列機(jī)制以后,可以將需要執(zhí)行的邏輯代碼放在工作隊(duì)列里執(zhí)行,只需要在中斷服務(wù)函數(shù)里觸發(fā)即可,工作隊(duì)列是允許被重新調(diào)度、睡眠。

在工作隊(duì)列里,我們把推后執(zhí)行的任務(wù)叫做工作(work),描述它的數(shù)據(jù)結(jié)構(gòu)為work_struct,這些工作以隊(duì)列結(jié)構(gòu)組織成工作隊(duì)列(workqueue),其數(shù)據(jù)結(jié)構(gòu)為workqueue_struct,而工作線程就是負(fù)責(zé)執(zhí)行工作隊(duì)列中的工作。系統(tǒng)有默認(rèn)的工作者線程,自己也可以創(chuàng)建自己的工作者線程。

2. 相關(guān)函數(shù)、結(jié)構(gòu)介紹

2.1 工作結(jié)構(gòu)

定義文件:
Workqueue.h (linux-3.5\include\Linux)

原型:
struct work_struct {
		atomic_long_t data;    
		struct list_head entry;
		work_func_t func;      /* 工作函數(shù)指針 */
	#ifdef CONFIG_LOCKDEP
		struct lockdep_map lockdep_map;
	#endif
	};

在工作結(jié)構(gòu)體里,只需要關(guān)心一個(gè)成員函數(shù):work_func_t func;
這個(gè)成員函數(shù)是一個(gè)函數(shù)指針,指向工作函數(shù)的指針;內(nèi)核使用這個(gè)結(jié)構(gòu)來(lái)描述一個(gè)工作,一個(gè)工作簡(jiǎn)單理解就是對(duì)應(yīng)于一個(gè)函數(shù),可以通過(guò)內(nèi)核調(diào)度函數(shù)來(lái)調(diào)用work_struct中func指針?biāo)赶虻暮瘮?shù)。

2.2 工作函數(shù)介紹

定義文件   Workqueue.h (linux-3.5\include\linux)
函數(shù)原型   typedef void (*work_func_t)(struct work_struct *work);
功能	    這是指向工作函數(shù)地址的函數(shù)指針,編寫(xiě)一個(gè)工作的函數(shù)。
參數(shù)	   struct work_struct *work,這個(gè)參數(shù),指向struct work_struct結(jié)構(gòu)變量本身。

示例:

struct work_struct work;
INIT_WORK(&work, work_func);
初始化一個(gè)work結(jié)構(gòu),work_func工作函數(shù)的參數(shù)就是指向work結(jié)構(gòu)。

2.3 初始化宏

1)初始化一個(gè)work結(jié)構(gòu):
INIT_WORK(_work, _func)	     
_work: struct work_struct work結(jié)構(gòu)指針。
_func:用來(lái)填充work_struct work結(jié)構(gòu)的fun成員,就是工作函數(shù)指針。

2)共享工作隊(duì)列調(diào)度宏:
schedule_work(_work)
它也是一個(gè)宏,作用是調(diào)度一個(gè)工作_work。
_work:要調(diào)度工作的結(jié)構(gòu)指針;
示例:
schedule_work(&work)

2.4 使用共享工作隊(duì)列的步驟

1)定義一個(gè)工作結(jié)構(gòu)變量
struct work_struct work; 

2)初始化工作結(jié)構(gòu)(重點(diǎn)func成員)。
先編寫(xiě)一個(gè)工作函數(shù):
void work_func(struct work_struct * dat)
{
   printk(“%p:”,dat);
   ……
}
初始化work:
INIT_WORK(&work, work_func);

3)在適當(dāng)?shù)牡胤秸{(diào)度工作
如果工作用于中斷底部代碼,則在中斷頂部調(diào)度。
	schedule_work(&work);
不是馬上執(zhí)行,而是等待CPU空閑才執(zhí)行work_func。

3. 案例代碼

3.1 共享工作隊(duì)列-按鍵驅(qū)動(dòng)

下面這份代碼是在一個(gè)按鍵驅(qū)動(dòng)代碼,在按鍵中斷服務(wù)函數(shù)里調(diào)度共享隊(duì)列,最終在工作函數(shù)里完成按鍵值的檢測(cè)打印。工作隊(duì)列采用的是共享工作隊(duì)列。

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

static struct work_struct work;

static struct m_key_info *key_info_p=NULL;

/*存放按鍵的信息*/
struct m_key_info
{
	int gpio;
	char name[50];
	int val;
	int irq;
};

struct m_key_info key_info[]=
{
	{EXYNOS4_GPX3(2),"key_irq_1",0x01},
	{EXYNOS4_GPX3(3),"key_irq_2",0x02},
	{EXYNOS4_GPX3(4),"key_irq_3",0x03},
	{EXYNOS4_GPX3(5),"key_irq_4",0x04},
};
/*
工作函數(shù)
*/
static void key_work_func(struct work_struct *work)
{
	msleep(50);
	//udelay(n);
	//mdelay(n);
	//msleep(unsigned int msecs);
	
	if(gpio_get_value(key_info_p->gpio)==0) //判斷按鍵是否按下
	{
		printk("按鍵值:%#x\n",key_info_p->val);
	}
	else
	{
		printk("按鍵值:%#x\n",key_info_p->val|0x80);
	}
}
/*
中斷服務(wù)函數(shù)
*/
static irqreturn_t key_irq_handler(int irq, void *dev)
{
    key_info_p=(struct m_key_info*)dev;

	/*調(diào)度工作----工作結(jié)構(gòu)體添加到系統(tǒng)共享工作隊(duì)列里*/
	schedule_work(&work);
	
	return IRQ_HANDLED;
}

static int __init tiny4412_interrupt_drv_init(void)
{
    /*初始化工作*/
	INIT_WORK(&work,key_work_func);
	
	int i;
	for(i=0;i
	3.2 自定義工作隊(duì)列-按鍵驅(qū)動(dòng)

工作隊(duì)列除了可以使用內(nèi)核共享隊(duì)列以外,也可以自己創(chuàng)建隊(duì)列,下面這份代碼就演示如何自己創(chuàng)建隊(duì)列,并完成初始化、調(diào)用。代碼原型還是一份按鍵驅(qū)動(dòng)代碼,與上面代碼相比,加了字符設(shè)備節(jié)點(diǎn)注冊(cè),替換系統(tǒng)共享工作隊(duì)列為自定義的工作隊(duì)列。

#include 
#include 
#include  /*雜項(xiàng)設(shè)備相關(guān)結(jié)構(gòu)體*/
#include          /*文件操作集合頭文件*/
#include     /*使用copy_to_user和copy_from_user*/
#include          /*使用IO端口映射*/
#include        
#include      /*設(shè)備*/
#include        /*標(biāo)準(zhǔn)字符設(shè)備--分配設(shè)備號(hào)*/
#include       /*ioctl操作*/
#include   /*注冊(cè)中斷相關(guān)*/
#include  		  /*中斷邊沿類(lèi)型定義*/
#include  	  /*中斷IO口定義*/
#include       /*內(nèi)核定時(shí)器相關(guān)*/
#include        /*等待隊(duì)列相關(guān)*/
#include       /*等待隊(duì)列相關(guān)*/
#include        /*POLL機(jī)制相關(guān)*/
#include  /*自旋鎖相關(guān)*/
#include        /*自旋鎖相關(guān)*/
#include           /*原子操作相關(guān)*/
#include          /*原子操作相關(guān)*/
#include           /*延時(shí)函數(shù)*/
#include 
#include          /*信號(hào)相關(guān)頭文件*/
#include       /*工作隊(duì)列相關(guān)*/

/*----------------------------------------------------
	創(chuàng)建自己的工作隊(duì)列creator_workqueue測(cè)試
-----------------------------------------------------*/

/*定義ioctl的命令*/
#define Cmd_LEDON  _IO('L',1)   //無(wú)方向    --開(kāi)燈
#define Cmd_LEDOFF  _IO('L',0)   //無(wú)方向  ---關(guān)燈

/*定義設(shè)備號(hào)注冊(cè)相關(guān)*/
static dev_t keydev;            //存放設(shè)備號(hào)
static struct cdev *keyCdev;    //定義cdev結(jié)構(gòu)體指針
static struct class *cls;       //定義類(lèi)結(jié)構(gòu)體指針

/*定義按鍵中斷相關(guān)*/
static unsigned int irq_buff[4]; /*存放中斷編號(hào)*/
static int key_value=0;          /*存放按鍵按下的鍵值*/

/*定時(shí)器相關(guān)*/
struct timer_list my_timer;

/*全局標(biāo)志*/
static int poll_flag=0;

struct mutex ; /*  互斥鎖  */

/*等待隊(duì)列相關(guān)*/
static DECLARE_WAIT_QUEUE_HEAD(wait);/*初始化等待隊(duì)列頭*/
static int condition=0;            /*喚醒隊(duì)列的條件-為假休眠-為真喚醒*/

/*異步通知助手相關(guān)*/
static struct fasync_struct *myfasync; 

/*信號(hào)量*/
static DEFINE_SEMAPHORE(name_sem);

/*內(nèi)核工作隊(duì)列相關(guān)結(jié)構(gòu)體*/
static struct work_struct my_work;

/*延時(shí)工作隊(duì)列相關(guān)結(jié)構(gòu)體*/
static struct delayed_work my_delay_work;

/*創(chuàng)建自己的工作隊(duì)列相關(guān)*/
struct workqueue_struct *my_work_queue;

struct Buttons_data
{
   char key_name[10]; /*按鍵的名字*/
   char key;           /*按鍵值*/
   int  GPIO;          /*GPIO口編號(hào)*/
};
/*工作隊(duì)列的處理函數(shù)*/
static void my_work_func(struct work_struct *work)
{
	static int count=0;
	printk("\n\n用戶(hù)創(chuàng)建的系統(tǒng)共享工作隊(duì)列調(diào)度成功%d 次\n\n",count++);
}

/*結(jié)構(gòu)體整體賦值*/
static struct Buttons_data Key_interrupt[4]=
{
	{"key1",0x01,EXYNOS4_GPX3(2)},
	{"key2",0x02,EXYNOS4_GPX3(3)},
	{"key3",0x03,EXYNOS4_GPX3(4)},
	{"key4",0x04,EXYNOS4_GPX3(5)},
};
/*按鍵中斷服務(wù)函數(shù)*/
static irqreturn_t irq_handler_function(int irq,void * dat)
{
   struct Buttons_data *p =(struct Buttons_data *)dat; /*強(qiáng)制轉(zhuǎn)換*/
   
   if(!gpio_get_value(p->GPIO))
   {
		key_value=p->key;            /*獲取按下按鍵值*/
   }
   else
   {
		key_value=p->key|0x80;      /*獲取松開(kāi)按鍵值*/
   }
   mod_timer(&my_timer,jiffies+1); /*修改超時(shí)時(shí)間*/
   return IRQ_HANDLED;
}
/*定時(shí)器中斷服務(wù)函數(shù)*/
static void timer_function(unsigned long data)
{
	printk("按鍵值讀取成功!!0x%x--->!\n",key_value);
    /*添加延時(shí)工作到系統(tǒng)工作隊(duì)列中等待執(zhí)行*/
   // schedule_delayed_work(&my_delay_work,HZ*5);
	//queue_work(my_work_queue,&my_work); /*調(diào)度共享工作隊(duì)列*/
	queue_delayed_work_on(-1,my_work_queue,&my_delay_work,HZ*5);
}

static int key_open(struct inode *my_inode, struct file *my_file)
{
    unsigned char i;
	for(i=0;i<4;i++)
	{
		//獲取中斷編號(hào)
	   irq_buff[i]=gpio_to_irq(EXYNOS4_GPX3(2+i));
	   request_irq(irq_buff[i],irq_handler_function,IRQ_TYPE_EDGE_BOTH,Key_interrupt[i].key_name,&Key_interrupt[i]);
	}

	/*定時(shí)器相關(guān)*/
	my_timer.expires=0;/*1秒鐘*/
    my_timer.function=timer_function;/*定時(shí)器中斷處理函數(shù)*/
    my_timer.data=888; /*傳遞給定時(shí)器中斷服務(wù)函數(shù)的參數(shù)-用于共享定時(shí)器*/
    init_timer(&my_timer);        /*初始化定時(shí)器*/
	add_timer(&my_timer);	       /*啟動(dòng)定時(shí)器*/
	
	printk("open ok !\n");
	return 0;
}

static ssize_t key_read(struct file *my_file, char __user *buf, size_t my_conut, loff_t * my_loff)
{
    int error=0;
	error=copy_to_user(buf,&key_value,my_conut); /*向應(yīng)用層拷貝按鍵值*/
	key_value=0;

	if(!error)
	{
		return 0;         /*沒(méi)有讀取成功*/
	}
	else
	{
		return my_conut; /*返回成功讀取的字節(jié)數(shù)*/
	}
}

static  ssize_t key_write(struct file *my_file, const char __user *buf, size_t my_conut, loff_t *my_loff)
{
    int error;
	printk("write ok !\n");
	return 1;
}
 
static long key_unlocked_ioctl(struct file *my_file, unsigned int cmd, unsigned long argv)
{
   int dat;
  /*只有傳遞地址的時(shí)候才需要轉(zhuǎn)換-----*/
	void __user *argv1=(void __user*)argv;          //強(qiáng)制轉(zhuǎn)換地址
     printk("argv1=%ld\n",*(unsigned long*)argv1);	//取出數(shù)據(jù)

	 argv=(unsigned long*)argv;  /*轉(zhuǎn)為指針形式*/
    
    switch(cmd)
	{
		case Cmd_LEDON:
			dat=100;
			copy_to_user(argv,&dat,4);
			printk("LEDON_----->OK\n");
			break;
	
		case Cmd_LEDOFF:
			dat=200;
			copy_to_user(argv,&dat,4);
			printk("LEDOFF_----->OK\n");
			break;
	}
	return 0;
}

/*poll--*/
unsigned int my_poll(struct file *my_file, struct poll_table_struct * p)
{ 
    /*喚醒休眠的進(jìn)程*/  
	poll_wait(my_file,&wait,p);/*添加等待隊(duì)列--不是立即休眠*/
	printk("<1>""8888\n");
	 if(condition==1)
	 {
	    printk("drive----poll ----ok!\n");
	    condition=0;   /*清除標(biāo)志*/
		return POLLIN;  /*返回事件*/  
	 }
	return 0;  /*返回事件*/  
}

/*異步通知助手*/
int key_fasync(int fd, struct file *my_file,int on)  //異步通知
{
	int error;
	printk("驅(qū)動(dòng)層收到的文件描述符:%d\n",fd);
	error=fasync_helper(fd,my_file,on,&myfasync);
	printk("驅(qū)動(dòng)層異步通知結(jié)構(gòu)體文件描述符:%d\n",myfasync->fa_fd);
	return error;
}

static int  key_release(struct inode *my_inode, struct file *my_file)
{
   int i;
	//釋放中斷
    for(i=0;i<4;i++)
   	{
   		free_irq(irq_buff[i],&Key_interrupt[i]); 
	}
	return 0;
}

/*定義一個(gè)文件操作集合結(jié)構(gòu)體*/
static struct file_operations ops_key={
   .owner = THIS_MODULE,
   .read=key_read,       /*讀函數(shù)-被應(yīng)用層read函數(shù)調(diào)用*/
   .write=key_write,     /*寫(xiě)函數(shù)-被應(yīng)用層write函數(shù)調(diào)用*/
   .open=key_open,       /*打開(kāi)函數(shù)-被應(yīng)用層open函數(shù)調(diào)用*/
   .release=key_release, /*釋放函數(shù)*/
   .unlocked_ioctl=key_unlocked_ioctl,  /*ioctl操作*/
   .poll=my_poll,         /*poll機(jī)制*/
   .fasync=key_fasync,    /*異步通知助手*/
};

static int __init key_init1(void)
{
  /*動(dòng)態(tài)分配一個(gè)設(shè)備號(hào)*/
   alloc_chrdev_region(&keydev,0,1,"mykey"); //我們可以讀取/proc/devices文件以獲得Linux內(nèi)核分配給設(shè)備的主設(shè)備號(hào)和設(shè)備名字
  /*動(dòng)態(tài)分配cdev結(jié)構(gòu)體,返個(gè)cdev結(jié)構(gòu);如果執(zhí)行失敗,將返回NULL。*/
   keyCdev = cdev_alloc();
  /*初始化Cdev結(jié)構(gòu)體*/
   cdev_init(keyCdev,&ops_key);
  /*注冊(cè)Cdev結(jié)構(gòu)體*/
   cdev_add(keyCdev,keydev,1);
  /*創(chuàng)建類(lèi)*/
   cls=class_create(THIS_MODULE,"my_key");
   /*在類(lèi)下面創(chuàng)建設(shè)備*/
    device_create(cls,NULL,keydev,NULL,"my_delaywork");//  /dev/

   /*創(chuàng)建自己的工作隊(duì)列*/
	my_work_queue =create_workqueue("my_workqueue");
	/*初始化延時(shí)工作隊(duì)列*/
	 INIT_DELAYED_WORK(&my_delay_work,my_work_func);

    /*初始化無(wú)延時(shí)的工作隊(duì)列*/
	// INIT_WORK(&my_work,my_work_func);
	
	 printk("<1>""key drive init OK!!-->__FILE__=%s  __LINE__=%d\n",__FILE__,__LINE__);
	return 0;
}

//KERN_EMERG
static void __exit key_exit(void)
{
	device_destroy(cls,keydev); 		   //注銷(xiāo)設(shè)備節(jié)點(diǎn)	
	class_destroy(cls);				   //注銷(xiāo)分配的類(lèi)	
	cdev_del(keyCdev);					   //注銷(xiāo)CDEV結(jié)構(gòu)體	
	unregister_chrdev_region(keydev,1); //注銷(xiāo)設(shè)備
	kfree(keyCdev);                      //釋放結(jié)構(gòu)體
    printk("<1>""key drive exit OK!! -->__FILE__=%s  __LINE__=%d\n",__FILE__,__LINE__);
}
//EXPORT_SYMBOL(key_init);
module_init(key_init1);  /*驅(qū)動(dòng)入口*/
module_exit(key_exit);  /*驅(qū)動(dòng)出口*/
MODULE_LICENSE("GPL");
(key_info)>(key_info)/sizeof(key_info[0]);i++)>
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 嵌入式
    +關(guān)注

    關(guān)注

    5199

    文章

    20454

    瀏覽量

    334229
  • 內(nèi)核
    +關(guān)注

    關(guān)注

    4

    文章

    1468

    瀏覽量

    42888
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4417

    瀏覽量

    67536
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    Linux內(nèi)核伙伴系統(tǒng)內(nèi)存申請(qǐng)函數(shù)詳解:從原理到實(shí)戰(zhàn)

    Linux 內(nèi)核中,內(nèi)存管理是整個(gè)系統(tǒng)穩(wěn)定運(yùn)行的基石,而伙伴系統(tǒng)(Buddy System) 作為內(nèi)核物理內(nèi)存分配的核心機(jī)制,更是驅(qū)動(dòng)開(kāi)發(fā)
    的頭像 發(fā)表于 02-10 16:58 ?3632次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>伙伴系統(tǒng)內(nèi)存申請(qǐng)函數(shù)詳解:從原理到實(shí)戰(zhàn)

    Linux內(nèi)核的“心跳”:jiffies如何為系統(tǒng)計(jì)時(shí)?

    Linux 內(nèi)核的世界里,有一個(gè)默默工作的 "計(jì)時(shí)器"——jiffies。它不像我們手機(jī)上的時(shí)鐘那樣顯示年月日,卻掌控著內(nèi)核中絕大多數(shù)時(shí)間相關(guān)的操作:從進(jìn)程調(diào)度到設(shè)備
    的頭像 發(fā)表于 02-04 16:27 ?828次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>的“心跳”:jiffies如何為系統(tǒng)計(jì)時(shí)?

    深度解析ES8389/ES8390/音頻芯片Linux驅(qū)動(dòng)Linux6.1內(nèi)核

    基于 Linux6.1 內(nèi)核,從驅(qū)動(dòng)架構(gòu)、寄存器配置、核心函數(shù)、數(shù)據(jù)流走向四個(gè)維度,完整拆解 ES8389 的 Linux 驅(qū)動(dòng)實(shí)現(xiàn),幫你吃
    的頭像 發(fā)表于 02-02 11:37 ?1403次閱讀
    深度解析ES8389/ES8390/音頻芯片<b class='flag-5'>Linux</b><b class='flag-5'>驅(qū)動(dòng)</b>(<b class='flag-5'>Linux</b>6.1<b class='flag-5'>內(nèi)核</b>)

    【「Linux 設(shè)備驅(qū)動(dòng)開(kāi)發(fā)(第 2 版)」閱讀體驗(yàn)】Linux內(nèi)核開(kāi)發(fā)基礎(chǔ)

    感謝電子發(fā)燒友論壇提供的《Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)(第2版)》閱讀機(jī)會(huì),測(cè)評(píng)將從Linux內(nèi)核開(kāi)發(fā)
    發(fā)表于 01-12 22:45

    【「Linux 設(shè)備驅(qū)動(dòng)開(kāi)發(fā)(第 2 版)」閱讀體驗(yàn)】+讀內(nèi)核處理的核心輔助函數(shù)

    上周收到《Linux 設(shè)備驅(qū)動(dòng)開(kāi)發(fā)(第 2 版)》書(shū)籍,這是一本介紹Linux內(nèi)核開(kāi)發(fā)的指導(dǎo)性書(shū)
    發(fā)表于 01-10 22:08

    Linux驅(qū)動(dòng)開(kāi)發(fā)的必備知識(shí)

    驅(qū)動(dòng)框架進(jìn)行開(kāi)發(fā)。 6、調(diào)試技能: 掌握內(nèi)核調(diào)試工具,如 KDB、KGDB、printk 等。 能夠分析內(nèi)核日志,定位驅(qū)動(dòng)程序中的問(wèn)
    發(fā)表于 12-04 07:58

    基于 DR1M90 的 Linux-RT 內(nèi)核開(kāi)發(fā):從編譯配置到 GPIO / 按鍵應(yīng)用實(shí)現(xiàn)(1)

    本手冊(cè)由創(chuàng)龍科技研發(fā),針對(duì) DR1M90,詳述 Linux-RT 實(shí)時(shí)內(nèi)核開(kāi)發(fā):含實(shí)時(shí)性測(cè)試(LinuxLinux-RT 對(duì)比、CPU
    的頭像 發(fā)表于 12-02 10:38 ?1189次閱讀
    基于 DR1M90 的 <b class='flag-5'>Linux</b>-RT <b class='flag-5'>內(nèi)核</b><b class='flag-5'>開(kāi)發(fā)</b>:從編譯配置到 GPIO / 按鍵應(yīng)用實(shí)現(xiàn)(1)

    【迅為工業(yè)RK3568穩(wěn)定可靠】itop-3568開(kāi)發(fā)Linux驅(qū)動(dòng)開(kāi)發(fā)實(shí)戰(zhàn):RK3568內(nèi)核模塊符號(hào)導(dǎo)出詳解

    【迅為工業(yè)RK3568穩(wěn)定可靠】itop-3568開(kāi)發(fā)Linux驅(qū)動(dòng)開(kāi)發(fā)實(shí)戰(zhàn):RK3568內(nèi)核模塊符號(hào)導(dǎo)出詳解
    的頭像 發(fā)表于 11-21 13:25 ?1225次閱讀
    【迅為工業(yè)RK3568穩(wěn)定可靠】itop-3568<b class='flag-5'>開(kāi)發(fā)</b>板<b class='flag-5'>Linux</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開(kāi)發(fā)</b>實(shí)戰(zhàn):RK3568<b class='flag-5'>內(nèi)核</b>模塊符號(hào)導(dǎo)出詳解

    Linux內(nèi)核printk日志級(jí)別全解析:從參數(shù)解讀到實(shí)操配置

    ”——?它直接決定了?printk(內(nèi)核打印函數(shù))的日志輸出行為。如果你是嵌入式開(kāi)發(fā)者、內(nèi)核調(diào)試工程師,或經(jīng)常需要排查驅(qū)動(dòng)?/?系統(tǒng)問(wèn)題,理解這串?dāng)?shù)字和?printk?輸出等級(jí),能讓你
    的頭像 發(fā)表于 11-20 15:54 ?1709次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>printk日志級(jí)別全解析:從參數(shù)解讀到實(shí)操配置

    重磅升級(jí)!迅為iTOP-Hi3403開(kāi)發(fā)板SDK全面升級(jí)至Linux?6.6內(nèi)核

    【重磅升級(jí)!迅為iTOP-Hi3403開(kāi)發(fā)板SDK全面升級(jí)至Linux?6.6內(nèi)核
    的頭像 發(fā)表于 11-18 13:34 ?1017次閱讀
    重磅升級(jí)!迅為iTOP-Hi3403<b class='flag-5'>開(kāi)發(fā)</b>板SDK全面升級(jí)至<b class='flag-5'>Linux</b>?6.6<b class='flag-5'>內(nèi)核</b>

    【免費(fèi)送書(shū)】成為硬核Linux開(kāi)發(fā)者:《Linux 設(shè)備驅(qū)動(dòng)開(kāi)發(fā)(第 2 版)》

    Linux系統(tǒng)的設(shè)備驅(qū)動(dòng)開(kāi)發(fā),一直給人門(mén)檻較高的印象,主要因內(nèi)核機(jī)制抽象、需深度理解硬件原理、開(kāi)發(fā)調(diào)試難度大所致。2021年,一本講解
    的頭像 發(fā)表于 11-18 08:06 ?1434次閱讀
    【免費(fèi)送書(shū)】成為硬核<b class='flag-5'>Linux</b><b class='flag-5'>開(kāi)發(fā)</b>者:《<b class='flag-5'>Linux</b> 設(shè)備<b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開(kāi)發(fā)</b>(第 2 版)》

    【書(shū)籍評(píng)測(cè)活動(dòng)NO.67】成為硬核Linux開(kāi)發(fā)者:《Linux 設(shè)備驅(qū)動(dòng)開(kāi)發(fā)(第 2 版)》

    )。成為硬核Linux開(kāi)發(fā)Linux系統(tǒng)的設(shè)備驅(qū)動(dòng)開(kāi)發(fā),一直給人門(mén)檻較高的印象,主要因內(nèi)核機(jī)制
    發(fā)表于 11-17 17:52

    deepin亮相2025中國(guó)Linux內(nèi)核開(kāi)發(fā)者大會(huì)

    11 月 1 日,第二十屆中國(guó) Linux 內(nèi)核開(kāi)發(fā)者大會(huì)(CLK)在深圳舉辦。CLK 作為國(guó)內(nèi) Linux 內(nèi)核領(lǐng)域極具影響力的峰會(huì),由清
    的頭像 發(fā)表于 11-05 17:59 ?831次閱讀

    RDMA簡(jiǎn)介5之RoCE V2隊(duì)列分析

    在RoCE v2協(xié)議中,RoCE v2隊(duì)列是數(shù)據(jù)傳輸?shù)淖畹讓涌刂茩C(jī)制,其由工作隊(duì)列(WQ)和完成隊(duì)列(CQ)共同組成。其中工作隊(duì)列采用雙向通道設(shè)計(jì),包含用于存儲(chǔ)即將發(fā)送數(shù)據(jù)的發(fā)送
    發(fā)表于 06-05 17:28

    北京迅為RK3568開(kāi)發(fā)板OpenHarmony系統(tǒng)南向驅(qū)動(dòng)開(kāi)發(fā)內(nèi)核HDF驅(qū)動(dòng)框架架構(gòu)

    北京迅為RK3568開(kāi)發(fā)板OpenHarmony系統(tǒng)南向驅(qū)動(dòng)開(kāi)發(fā)內(nèi)核HDF驅(qū)動(dòng)框架架構(gòu)
    的頭像 發(fā)表于 03-11 14:13 ?1865次閱讀
    北京迅為RK3568<b class='flag-5'>開(kāi)發(fā)</b>板OpenHarmony系統(tǒng)南向<b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開(kāi)發(fā)</b><b class='flag-5'>內(nèi)核</b>HDF<b class='flag-5'>驅(qū)動(dòng)</b>框架架構(gòu)