在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Linux驅動開發-proc接口介紹

DS小龍哥-嵌入式技術 ? 2022-09-17 15:31 ? 次閱讀

【摘要】 Linux系統上的/proc目錄是一種文件系統,即proc文件系統。 與其它常見的文件系統不同的是,/proc是一種偽文件系統(也即虛擬文件系統),存儲的是當前內核運行狀態的一系列特殊文件,用戶可以通過這些文件查看有關系統硬件及當前正在運行進程的信息,甚至可以通過更改其中某些文件來改變內核的運行狀態。

1. 前言

Linux系統上的/proc目錄是一種文件系統,即proc文件系統。

與其它常見的文件系統不同的是,/proc是一種偽文件系統(也即虛擬文件系統),存儲的是當前內核運行狀態的一系列特殊文件,用戶可以通過這些文件查看有關系統硬件及當前正在運行進程的信息,甚至可以通過更改其中某些文件來改變內核的運行狀態。

當前的實驗平臺是嵌入式Linux開發板,根文件系統掛載成功后,進入命令就能看到proc目錄,這個目錄里正常情況下已經生成了很多文件。通過cat命令讀取這些文件,可以得到很多內核的信息。

比如:查看中斷有哪些注冊了,中斷從上電到現在響應了多少次,雜項設備注冊了哪些,幀緩沖節點有哪些,RTC時間查看,等等。

下面是proc目錄下文件的功能的詳細介紹(資源來源與網絡):

2.1、/proc/apm
高級電源管理(APM)版本信息及電池相關狀態信息,通常由apm命令使用;

2.2、/proc/buddyinfo
用于診斷內存碎片問題的相關信息文件;

2.3、/proc/cmdline
在啟動時傳遞至內核的相關參數信息,這些信息通常由lilo或grub等啟動管理工具進行傳遞;

2.4、/proc/cpuinfo
處理器的相關信息的文件;

2.5、/proc/crypto
系統上已安裝的內核使用的密碼算法及每個算法的詳細信息列表;

2.6、/proc/devices
系統已經加載的所有塊設備和字符設備的信息,包含主設備號和設備組(與主設備號對應的設備類型)名;

2.7、/proc/diskstats
每塊磁盤設備的磁盤I/O統計信息列表;(內核2.5.69以后的版本支持此功能)

2.8、/proc/dma
每個正在使用且注冊的ISA DMA通道的信息列表;

2.9、/proc/execdomains
內核當前支持的執行域(每種操作系統獨特“個性”)信息列表;

2.10、/proc/fb
幀緩沖設備列表文件,包含幀緩沖設備的設備號和相關驅動信息;

2.11、/proc/filesystems
當前被內核支持的文件系統類型列表文件,被標示為nodev的文件系統表示不需要塊設備的支持;通常mount一個設備時,如果沒有指定文件系統類型將通過此文件來決定其所需文件系統的類型;

2.12、/proc/interrupts
X86或X86_64體系架構系統上每個IRQ相關的中斷號列表;多路處理器平臺上每個CPU對于每個I/O設備均有自己的中斷號;

2.13、/proc/iomem
每個物理設備上的記憶體(RAM或者ROM)在系統內存中的映射信息;

2.14、/proc/ioports
當前正在使用且已經注冊過的與物理設備進行通訊的輸入-輸出端口范圍信息列表;如下面所示,第一列表示注冊的I/O端口范圍,其后表示相關的設備;

2.15、/proc/kallsyms
模塊管理工具用來動態鏈接或綁定可裝載模塊的符號定義,由內核輸出;(內核2.5.71以后的版本支持此功能);通常這個文件中的信息量相當大;

2.16、/proc/kcore
系統使用的物理內存,以ELF核心文件(core file)格式存儲,其文件大小為已使用的物理內存(RAM)加上4KB;這個文件用來檢查內核數據結構的當前狀態,因此,通常由GBD通常調試工具使用,但不能使用文件查看命令打開此文件;

2.17、/proc/kmsg
此文件用來保存由內核輸出的信息,通常由/sbin/klogd或/bin/dmsg等程序使用,不要試圖使用查看命令打開此文件;

2.18、/proc/loadavg
保存關于CPU和磁盤I/O的負載平均值,其前三列分別表示每1秒鐘、每5秒鐘及每15秒的負載平均值,類似于uptime命令輸出的相關信息;第四列是由斜線隔開的兩個數值,前者表示當前正由內核調度的實體(進程和線程)的數目,后者表示系統當前存活的內核調度實體的數目;第五列表示此文件被查看前最近一個由內核創建的進程的PID;

2.19、/proc/locks
保存當前由內核鎖定的文件的相關信息,包含內核內部的調試數據;每個鎖定占據一行,且具有一個惟一的編號;如下輸出信息中每行的第二列表示當前鎖定使用的鎖定類別,POSIX表示目前較新類型的文件鎖,由lockf系統調用產生,FLOCK是傳統的UNIX文件鎖,由flock系統調用產生;第三列也通常由兩種類型,ADVISORY表示不允許其他用戶鎖定此文件,但允許讀取,MANDATORY表示此文件鎖定期間不允許其他用戶任何形式的訪問;

2.20、/proc/mdstat
保存RAID相關的多塊磁盤的當前狀態信息,在沒有使用RAID機器上,其顯示為如下狀態:

2.21、/proc/meminfo
系統中關于當前內存的利用狀況等的信息,常由free命令使用;可以使用文件查看命令直接讀取此文件,其內容顯示為兩列,前者為統計屬性,后者為對應的值;

2.22、/proc/mounts
在內核2.4.29版本以前,此文件的內容為系統當前掛載的所有文件系統,在2.4.19以后的內核中引進了每個進程使用獨立掛載名稱空間的方式,此文件則隨之變成了指向/proc/self/mounts(每個進程自身掛載名稱空間中的所有掛載點列表)文件的符號鏈接;/proc/self是一個獨特的目錄,后文中會對此目錄進行介紹;

2.23、/proc/modules
當前裝入內核的所有模塊名稱列表,可以由lsmod命令使用,也可以直接查看;如下所示,其中第一列表示模塊名,第二列表示此模塊占用內存空間大小,第三列表示此模塊有多少實例被裝入,第四列表示此模塊依賴于其它哪些模塊,第五列表示此模塊的裝載狀態(Live:已經裝入;Loading:正在裝入;Unloading:正在卸載),第六列表示此模塊在內核內存(kernel memory)中的偏移量;

2.24、/proc/partitions
塊設備每個分區的主設備號(major)和次設備號(minor)等信息,同時包括每個分區所包含的塊(block)數目(如下面輸出中第三列所示);

2.25、/proc/pci
內核初始化時發現的所有PCI設備及其配置信息列表,其配置信息多為某PCI設備相關IRQ信息,可讀性不高,可以用“/sbin/lspci –vb”命令獲得較易理解的相關信息;在2.6內核以后,此文件已為/proc/bus/pci目錄及其下的文件代替;

2.26、/proc/slabinfo
在內核中頻繁使用的對象(如inode、dentry等)都有自己的cache,即slab pool,而/proc/slabinfo文件列出了這些對象相關slap的信息;詳情可以參見內核文檔中slapinfo的手冊頁;

2.27、/proc/stat
實時追蹤自系統上次啟動以來的多種統計信息;如下所示,其中,
“cpu”行后的八個值分別表示以1/100(jiffies)秒為單位的統計值(包括系統運行于用戶模式、低優先級用戶模式,運系統模式、空閑模式、I/O等待模式的時間等);
“intr”行給出中斷的信息,第一個為自系統啟動以來,發生的所有的中斷的次數;然后每個數對應一個特定的中斷自系統啟動以來所發生的次數;
“ctxt”給出了自系統啟動以來CPU發生的上下文交換的次數。
“btime”給出了從系統啟動到現在為止的時間,單位為秒;
“processes (total_forks) 自系統啟動以來所創建的任務的個數目;
“procs_running”:當前運行隊列的任務的數目;
“procs_blocked”:當前被阻塞的任務的數目;

2.28、/proc/swaps
當前系統上的交換分區及其空間利用信息,如果有多個交換分區的話,則會每個交換分區的信息分別存儲于/proc/swap目錄中的單獨文件中,而其優先級數字越低,被使用到的可能性越大;下面是作者系統中只有一個交換分區時的輸出信息;

2.29、/proc/uptime
系統上次啟動以來的運行時間,如下所示,其第一個數字表示系統運行時間,第二個數字表示系統空閑時間,單位是秒;

2.30、/proc/version
當前系統運行的內核版本號,在作者的RHEL5.3上還會顯示系統安裝的gcc版本,如下所示;

2.31、/proc/vmstat
當前系統虛擬內存的多種統計數據,信息量可能會比較大,這因系統而有所不同,可讀性較好;下面為作者機器上輸出信息的一個片段;(2.6以后的內核支持此文件)

2.32、/proc/zoneinfo
內存區域(zone)的詳細信息列表,信息量較大

2. 獲取CPU使用率

下面這份代碼是利用/proc/stat文件獲取當前CPU的占用率詳細信息,通過C語言代碼讀取數據后,進行分析,處理。

#include 
#include 
#include 

typedef struct cpu_occupy_          //定義一個cpu occupy的結構體
{
    char name[20];                  //定義一個char類型的數組名name有20個元素
    unsigned int user;              //定義一個無符號的int類型的user
    unsigned int nice;              //定義一個無符號的int類型的nice
    unsigned int system;            //定義一個無符號的int類型的system
    unsigned int idle;              //定義一個無符號的int類型的idle
    unsigned int iowait;
    unsigned int irq;
    unsigned int softirq;
}cpu_occupy_t;

double cal_cpuoccupy (cpu_occupy_t *o, cpu_occupy_t *n)
{
    double od, nd;
    double id, sd;
    double cpu_use ;

    od = (double) (o->user + o->nice + o->system +o->idle+o->softirq+o->iowait+o->irq);//第一次(用戶+優先級+系統+空閑)的時間再賦給od
    nd = (double) (n->user + n->nice + n->system +n->idle+n->softirq+n->iowait+n->irq);//第二次(用戶+優先級+系統+空閑)的時間再賦給od

    id = (double) (n->idle);    //用戶第一次和第二次的時間之差再賦給id
    sd = (double) (o->idle) ;    //系統第一次和第二次的時間之差再賦給sd
    if((nd-od) != 0)
        cpu_use =100.0 - ((id-sd))/(nd-od)*100.00; //((用戶+系統)乖100)除(第一次和第二次的時間差)再賦給g_cpu_used
    else 
        cpu_use = 0;
    return cpu_use;
}

void get_cpuoccupy (cpu_occupy_t *cpust)
{
    FILE *fd;
    int n;
    char buff[256];
    cpu_occupy_t *cpu_occupy;
    cpu_occupy=cpust;

    fd = fopen ("/proc/stat", "r");
    if(fd == NULL)
    {
            perror("fopen:");
            exit (0);
    }
    fgets (buff, sizeof(buff), fd);

    sscanf (buff, "%s %u %u %u %u %u %u %u", cpu_occupy->name, &cpu_occupy->user, &cpu_occupy->nice,&cpu_occupy->system, &cpu_occupy->idle ,&cpu_occupy->iowait,&cpu_occupy->irq,&cpu_occupy->softirq);

    fclose(fd);
}

double get_sysCpuUsage()
{
    cpu_occupy_t cpu_stat1;
    cpu_occupy_t cpu_stat2;
    double cpu;
    get_cpuoccupy((cpu_occupy_t *)&cpu_stat1);
    sleep(1);
    //第二次獲取cpu使用情況
    get_cpuoccupy((cpu_occupy_t *)&cpu_stat2);

    //計算cpu使用率
    cpu = cal_cpuoccupy ((cpu_occupy_t *)&cpu_stat1, (cpu_occupy_t *)&cpu_stat2);

    return cpu;
}

int main(int argc,char **argv)
{
    while(1)
    {
        printf("CPU占用率:%f\n",get_sysCpuUsage());
    }
    return 0;
}

3. proc驅動相關接口

Proc文件接口,主要用于驅動代碼調試,獲取內核信息,可以直接使用cat命令訪問proc目錄下的對應文件接口即可。

需要使用的頭文件:

#include 
#include 

下面介紹內核里proc接口實現的相關函數接口:

1.	在proc目錄下創建子目錄函數
static inline struct proc_dir_entry *proc_mkdir(const char *name,struct proc_dir_entry *parent)
示例: //注意只能創建單層目錄
//在proc目錄下創建aaa文件夾
proc_mkdir("aaa",NULL);

2.	在proc目錄下創建文件
static inline struct proc_dir_entry *proc_create(const char *name,    //文件名稱
umode_t mode,      //模式,默認為0
struct proc_dir_entry *parent,   //父目錄結構
const struct file_operations *proc_fops)  //文件集合
示例:
//在proc目錄下創建一個文件
proc_create("aaa/tiny4412_proc_test", 0, NULL, &fops_proc);

3.	刪除proc目錄下之前創建的文件或者目錄
void remove_proc_entry(const char *name,   //文件的路徑
struct proc_dir_entry *parent  //父目錄結構
)
示例:
remove_proc_entry("aaa/tiny4412_proc_test", NULL);
注意: 如果是刪除目錄,需要先把目錄下的文件刪除掉,每次刪除必須保證目錄是空的。

4. 編寫proc接口測試驅動

4.1 案例1

下面驅動代碼注冊之后,會在proc目錄下創建一個tiny4412_proc文件,通過cat讀取這個文件,可以打印驅動代碼里設置好的信息。驅動卸載時會刪除這個tiny4412_proc文件。

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

static int tiny4412_open(struct inode *inode, struct file *file)
{   
    printk("tiny4412_open ok\n");
    return 0;
}

static ssize_t tiny4412_read(struct file *file, char __user *buf, size_t cnt, loff_t *loff)
{
    copy_to_user(buf,"123456",6);
    printk("tiny4412_read調用成功.\n");
    return 0;
}

static int tiny4412_release(struct inode *inode, struct file *file)
{
    return 0;
}

static struct file_operations tiny4412_fops=
{
    .open=tiny4412_open,
    .read=tiny4412_read,
    .release=tiny4412_release,
};

static int __init tiny4412_init(void)
{
    proc_mkdir("wbyq",0);
    /*創建內核接口: proc  存放內核信息*/
    proc_create("wbyq/tiny4412_proc",0, NULL, &tiny4412_fops);
    
    printk("驅動安裝成功.\n");
    return 0;
}

static void __exit tiny4412_exit(void)
{
    remove_proc_entry("wbyq/tiny4412_proc", NULL);
    remove_proc_entry("wbyq", NULL);
    printk("驅動卸載成功.\n");
}

/*驅動的入口:insmod xxx.ko*/
module_init(tiny4412_init);
/*驅動的出口: rmmod xxx.ko*/
module_exit(tiny4412_exit);
/*模塊的許可證*/
MODULE_LICENSE("GPL");
/*模塊的作者*/
MODULE_AUTHOR("wbyq");

4.2 案例2

下面這份代碼是在字符設備框架代碼里增加了proc接口,驅動安裝之后,會在proc目錄下創建tiny4412_proc文件,通過cat命令讀取tiny4412_proc文件,可以打印出當前主設備號下所有的子設備信息。

#include  
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
static struct class *tiny4412_beep_class;
static unsigned int major=0; //主設備號

static LIST_HEAD(tiny4412_beep_list);   //鏈表頭
static DEFINE_MUTEX(tiny4412_beep_mtx); //互斥鎖

#define DYNAMIC_MINORS 64 /* like dynamic majors */
static DECLARE_BITMAP(beep_minors, DYNAMIC_MINORS);

struct tiny4412_beep_device
{
    int minor;   /*次設備號*/
    const char *name; /*設備節點的名稱*/
    const struct file_operations *fops; /*文件操作集合*/
    struct list_head list; //鏈表
};

int tiny4412_beep_register(struct tiny4412_beep_device *beep_dev)
{
    struct tiny4412_beep_device *c;
    dev_t dev;
    
    INIT_LIST_HEAD(&beep_dev->list);
    
    mutex_lock(&tiny4412_beep_mtx);

    //查找傳入的次設備號是否沖突
    list_for_each_entry(c, &tiny4412_beep_list, list)
    {
        if(c->minor == beep_dev->minor)
        {
            mutex_unlock(&tiny4412_beep_mtx);
            return -EBUSY;
        }
    }
    
    //自動分配
    if(beep_dev->minor == MISC_DYNAMIC_MINOR) 
    {
        int i = find_first_zero_bit(beep_minors,DYNAMIC_MINORS);
        if (i >= DYNAMIC_MINORS)
        {
            mutex_unlock(&tiny4412_beep_mtx);
            return -EBUSY;
        }
        beep_dev->minor = DYNAMIC_MINORS - i - 1;
        set_bit(i,beep_minors);
    }

    //合成設備號
    dev = MKDEV(major, beep_dev->minor);

    //創建設備節點
    device_create(tiny4412_beep_class,NULL,dev,NULL,"%s", beep_dev->name);
    
    list_add(&beep_dev->list,&tiny4412_beep_list);
    
    //解鎖
    mutex_unlock(&tiny4412_beep_mtx);
    return 0;
}

int tiny4412_beep_deregister(struct tiny4412_beep_device *beep_dev)
{
    int i = DYNAMIC_MINORS - beep_dev->minor - 1;

    mutex_lock(&tiny4412_beep_mtx);
    list_del(&beep_dev->list);

    //將dev目錄下的文件刪除掉
    device_destroy(tiny4412_beep_class, MKDEV(major, beep_dev->minor));
    if (i < DYNAMIC_MINORS && i >= 0)
        clear_bit(i, beep_minors);
    mutex_unlock(&tiny4412_beep_mtx);
    return 0;
}

EXPORT_SYMBOL_GPL(tiny4412_beep_register); 
EXPORT_SYMBOL_GPL(tiny4412_beep_deregister); 

//底層open函數
static int tiny4412_beep_open(struct inode * inode, struct file * file)
{
    //得到次設備號
    int minor = iminor(inode);
    
    struct tiny4412_beep_device *c;
    struct file_operations *new_fops,*old_fops;
    mutex_lock(&tiny4412_beep_mtx);
    //遍歷鏈表--找到鏈表里相同的次設備號
    list_for_each_entry(c,&tiny4412_beep_list, list) 
    {
        if (c->minor == minor)
        {
            new_fops = fops_get(c->fops);    //得到47次設備號對應的結構體地址 
            break;
        }
    }
    file->f_op = new_fops; //改變指向--文件操作集合的指向
    if(file->f_op->open)
    {
        file->f_op->open(inode,file);
    }
    fops_put(old_fops);
    mutex_unlock(&tiny4412_beep_mtx);
    return 0;
}

static const struct file_operations tiny4412_beep_fops =
{
    .owner      = THIS_MODULE,
    .open       = tiny4412_beep_open,
};

static ssize_t tiny4412_read(struct file *file, char __user *buf, size_t cnt, loff_t *loff)
{
    struct tiny4412_beep_device *c;
    //遍歷鏈表--找到鏈表里相同的次設備號
    list_for_each_entry(c,&tiny4412_beep_list, list) 
    {
        printk("%d %s\n",c->minor,c->name);
    }
    return 0;
}

static struct file_operations tiny4412_fops=
{
    .read=tiny4412_read,
};

static int __init tiny4412_beep_class_init(void)
{
    /*1. 創建設備類*/
    tiny4412_beep_class=class_create(THIS_MODULE,"tiny4412_beep");
    /*2. 注冊字符設備*/
    major=register_chrdev(0,"tiny4412_beep",&tiny4412_beep_fops);
    
    proc_mkdir("wbyq",0);
    /*創建內核接口: proc  存放內核信息*/
    proc_create("wbyq/tiny4412_proc",0, NULL, &tiny4412_fops);
    
    return 0;
}

static void __exit tiny4412_beep_class_cleanup(void)
{
    remove_proc_entry("wbyq/tiny4412_proc", NULL);
    remove_proc_entry("wbyq", NULL);
    
    //注銷設備類
    class_destroy(tiny4412_beep_class);
    //注銷字符設備
    unregister_chrdev(major,"tiny4412_beep");
}

module_init(tiny4412_beep_class_init);
module_exit(tiny4412_beep_class_cleanup);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("wbyq");
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 接口
    +關注

    關注

    33

    文章

    8691

    瀏覽量

    151681
  • Linux
    +關注

    關注

    87

    文章

    11341

    瀏覽量

    210134
  • Proc
    +關注

    關注

    0

    文章

    12

    瀏覽量

    9019
收藏 人收藏

    評論

    相關推薦

    迅為RK3568開發驅動指南Linux中通用SPI設備驅動

    迅為RK3568開發驅動指南Linux中通用SPI設備驅動
    的頭像 發表于 01-23 11:02 ?350次閱讀
    迅為RK3568<b class='flag-5'>開發</b>板<b class='flag-5'>驅動</b>指南<b class='flag-5'>Linux</b>中通用SPI設備<b class='flag-5'>驅動</b>

    北京迅為RK3568開發板嵌入式學習之Linux驅動全新更新-CAN+

    北京迅為RK3568開發板嵌入式學習之Linux驅動全新更新-CAN+
    的頭像 發表于 09-04 15:29 ?589次閱讀
    北京迅為RK3568<b class='flag-5'>開發</b>板嵌入式學習之<b class='flag-5'>Linux</b><b class='flag-5'>驅動</b>全新更新-CAN+

    嵌入式linux開發的基本步驟有哪些?

    嵌入式Linux開發是一個復雜的過程,涉及到硬件選擇、操作系統移植、驅動開發、應用程序開發等多個方面。以下是嵌入式
    的頭像 發表于 09-02 09:11 ?593次閱讀

    嵌入式linux開發板怎么操作

    嵌入式Linux開發板是一種基于Linux操作系統的嵌入式系統開發平臺。它通常包括一個處理器、內存、存儲器、輸入/輸出接口等硬件組件,以及一
    的頭像 發表于 09-02 09:09 ?445次閱讀

    嵌入式linux開發板芯片的工作原理

    了處理器、存儲器、輸入/輸出接口等硬件資源的嵌入式系統開發平臺。它通常采用Linux操作系統作為底層軟件平臺,提供了豐富的開發工具和庫函數,方便開發
    的頭像 發表于 09-02 09:07 ?446次閱讀

    linux開發板與樹莓派的區別

    操作系統的微型計算機,主要用于教育、編程、媒體播放等領域。 硬件配置 Linux開發板:Linux開發板的硬件配置因廠商和型號而異,通常包括處理器、內存、存儲、網絡
    的頭像 發表于 08-30 15:34 ?1101次閱讀

    linux系統的設備驅動一般分幾類

    視頻設備驅動 USB設備驅動 其他設備驅動 下面將對這些設備驅動進行詳細的介紹。 字符設備驅動
    的頭像 發表于 08-30 15:13 ?515次閱讀

    linux驅動程序如何加載進內核

    Linux系統中,驅動程序是內核與硬件設備之間的橋梁。它們允許內核與硬件設備進行通信,從而實現對硬件設備的控制和管理。 驅動程序的編寫 驅動程序的編寫是
    的頭像 發表于 08-30 15:02 ?559次閱讀

    linux驅動程序的編譯方法是什么

    Linux驅動程序的編譯方法主要包括兩種: 與內核一起編譯 和 編譯成獨立的內核模塊 。以下是對這兩種方法的介紹: 一、與內核一起編譯 與內核一起編譯意味著將驅動程序的源代碼直接集成到
    的頭像 發表于 08-30 14:46 ?738次閱讀

    Linux 驅動開發與應用開發,你知道多少?

    一、Linux驅動開發與應用開發的區別開發層次不同:Linux
    的頭像 發表于 08-30 12:16 ?896次閱讀
    <b class='flag-5'>Linux</b> <b class='flag-5'>驅動</b><b class='flag-5'>開發</b>與應用<b class='flag-5'>開發</b>,你知道多少?

    虹科技術 全新Linux環境PCAN驅動程序發布!CAN/CAN FD通信體驗全面升級!

    全新8.17.0版本的PCAN-Linux驅動程序正式發布,專為CAN和CAN FD接口量身打造。無論是CAN 2.0 a/b還是CAN FD的PCAN硬件產品,都能在我們的新驅動下“
    的頭像 發表于 08-29 09:36 ?490次閱讀
    虹科技術 全新<b class='flag-5'>Linux</b>環境PCAN<b class='flag-5'>驅動</b>程序發布!CAN/CAN FD通信體驗全面升級!

    Linux中的proc介紹

    /proc 是一種偽文件系統(也即虛擬文件系統),存儲的是當前內核運行狀態的一系列特殊文件,用戶可以通過這些文件查看有關系統硬件及當前正在運行進程的信息,甚至可以通過更改其中某些文件來改變內核的運行狀態。
    的頭像 發表于 08-14 18:14 ?485次閱讀
    <b class='flag-5'>Linux</b>中的<b class='flag-5'>proc</b><b class='flag-5'>介紹</b>

    全新Linux環境PCAN驅動程序發布!CAN/CAN FD通信體驗全面升級!

    全新8.17.0版本的PCAN-Linux驅動程序正式發布,專為CAN和CAN FD接口量身打造。無論是CAN 2.0 a/b還是CAN FD的PCAN硬件產品,都能在我們的新驅動下“
    的頭像 發表于 04-19 10:38 ?1032次閱讀

    ArmSoM系列板卡 嵌入式Linux驅動開發實戰指南 之 字符設備驅動

    字符設備驅動 本章,我們將學習字符設備使用、字符設備驅動相關的概念,理解字符設備驅動程序的基本框架,并從源碼上分析字符設備驅動實現和管理等。 主要分為下面五部分:
    的頭像 發表于 04-10 09:53 ?1107次閱讀
    ArmSoM系列板卡 嵌入式<b class='flag-5'>Linux</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>實戰指南 之 字符設備<b class='flag-5'>驅動</b>

    fpga開發板與linux開發板區別

    FPGA開發板與Linux開發板是兩種不同的硬件開發平臺,各自具有不同的特點和應用場景。在以下的文章中,我將詳細介紹FPGA
    的頭像 發表于 02-01 17:09 ?2386次閱讀
    主站蜘蛛池模板: 日产精品卡二卡三卡四卡无卡乱码 | 午夜精品视频 | 免免费看片 | 欧美最猛性xxxx高清 | 亚洲乱淫| 色综合久久久久久久久五月性色 | 亚洲 欧美 精品专区 极品 | 婷婷色香五月激情综合2020 | 亚洲天堂最新地址 | 国产无套视频在线观看香蕉 | 黄字幕网 | 免费观看一级特黄欧美大片 | 午夜啪啪网站 | 黄色免费小视频 | 色天使在线视频 | 天天操夜夜草 | 天天干天天要 | 国产在线播放成人免费 | 欧美不卡视频在线 | eee在线播放成人免费 | 黑人边吃奶边扎下面激情视频 | 色婷婷激婷婷深爱五月老司机 | 性欧美精品 | 亚洲mv在线观看 | 男男h文小说阅 | 欧美黄区| 4438全国最大成人免费高清 | 97人人艹| 日本在线一区 | 日本又粗又长一进一出抽搐 | 久久精品福利 | 国产女主播在线 | 欧美色视频日本片高清在线观看 | 国内精品久久久久影 | 免费看啪啪的网站 | 天堂8资源在线官网资源 | 国产人免费人成免费视频 | 国产午夜视频高清 | 日本精品视频一视频高清 | 色宅男看片午夜大片免费看 | 天堂资源8中文最新版在线 天堂资源地址在线 |