一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

如何在Linux系統(tǒng)下自動(dòng)創(chuàng)建設(shè)備節(jié)點(diǎn)

嵌入式開發(fā)愛好者 ? 來源:嵌入式開發(fā)愛好者 ? 作者:嵌入式開發(fā)愛好者 ? 2022-11-06 20:18 ? 次閱讀

第一:自動(dòng)創(chuàng)建設(shè)備節(jié)點(diǎn)方法

1、使用 class_create 函數(shù)創(chuàng)建一個(gè)類。

2、使用 device_create 函數(shù)在我們創(chuàng)建的類下面創(chuàng)建一個(gè)設(shè)備。

第二:自動(dòng)創(chuàng)建設(shè)備節(jié)點(diǎn)簡(jiǎn)介

Linux驅(qū)動(dòng)實(shí)驗(yàn)中,通過使用insmod命令加載模塊后,需要通過mknod命令手動(dòng)創(chuàng)建設(shè)備節(jié)點(diǎn),這樣使用起來比較麻煩,并且不可能每個(gè)設(shè)備都這樣操作, Linux 系統(tǒng)的存在就是為了方便使用, 所以我們來看一下如何實(shí)現(xiàn)自動(dòng)創(chuàng)建設(shè)備節(jié)點(diǎn), 當(dāng)加載模塊時(shí), 在/dev 目錄下自動(dòng)創(chuàng)建相應(yīng)的設(shè)備文件。怎么自動(dòng)創(chuàng)建一個(gè)設(shè)備節(jié)點(diǎn)呢?在嵌入式 Linux 中使用 mdev 來實(shí)現(xiàn)設(shè)備節(jié)點(diǎn)文件的自動(dòng)創(chuàng)建和刪除。

udev 是一種工具, 它能夠根據(jù)系統(tǒng)中的硬件設(shè)備的狀態(tài)動(dòng)態(tài)更新設(shè)備文件, 包括設(shè)備文件的創(chuàng)建, 刪除等。設(shè)備文件通常放在/dev 目錄下。使用 udev 后, 在/dev 目錄下就只包含系統(tǒng)中真正存在的設(shè)備。而mdev 是 udev 的簡(jiǎn)化版本,是 busybox 中所帶的程序,最適合用在嵌入式系統(tǒng),而 udev 一般用在 PC 上的linux 中,相對(duì) mdev 來說要復(fù)雜些, 所以在嵌入式 Linux 中使用 mdev 來實(shí)現(xiàn)設(shè)備節(jié)點(diǎn)文件的自動(dòng)創(chuàng)建和刪除。

第三:創(chuàng)建和刪除類函數(shù)

內(nèi)核中定義了struct class結(jié)構(gòu)體,一個(gè)struct class結(jié)構(gòu)體類型變量對(duì)應(yīng)一個(gè)類,內(nèi)核同時(shí)提供了class_create用來創(chuàng)建一個(gè)類,這個(gè)類存放于 sysfs 下面, 一旦創(chuàng)建好了這個(gè)類, 再調(diào)用 device_create來在/dev 目錄下創(chuàng)建相應(yīng)的設(shè)備節(jié)點(diǎn)。這樣, 加載模塊的時(shí)候, 用戶空間中的 udev 會(huì)自動(dòng)響應(yīng) device_create,去/sysfs 下尋找對(duì)應(yīng)的類從而創(chuàng)建設(shè)備節(jié)點(diǎn)。

在 Linux 驅(qū)動(dòng)程序中一般通過 class_create 和 class_destroy 來完成設(shè)備節(jié)點(diǎn)的創(chuàng)建和刪除。首先要?jiǎng)?chuàng)建一個(gè) class 類結(jié)構(gòu)體, class 結(jié)構(gòu)體定義在 include/linux/device.h 里面。class_create 是個(gè)宏, 宏定義如下:#define class_create(owner, name)

({ 
static struct lock_class_key __key; 
__class_create(owner, name, &__key); 
})
 
struct class *__class_create(struct module *owner, const char *name,struct lock_class_key *key)

class_create一共有兩個(gè)參數(shù),參數(shù)owner 一般為 THIS_MODULE, 參數(shù) name 是類名字。返回值是個(gè)指向結(jié)構(gòu)體 class 的指針, 也就是創(chuàng)建的類。

卸載驅(qū)動(dòng)程序的時(shí)候需要?jiǎng)h除掉類,類刪除函數(shù)為class_destroy, 函數(shù)原型如下:
void class_destroy(struct class *cls);//參數(shù) cls 就是要?jiǎng)h除的類。
第四:創(chuàng)建設(shè)備函數(shù)

當(dāng)使用上節(jié)的函數(shù)創(chuàng)建完成一個(gè)類后,使用device_create 函數(shù)在這個(gè)類下創(chuàng)建一個(gè)設(shè)備。

device_create函數(shù)原型如下:
struct device *device_create(struct class *class,
struct device *parent,
dev_t devt,
void *drvdata,
const char *fmt, ...)

device_create是個(gè)可變參數(shù)函數(shù),參數(shù)class就是設(shè)備要?jiǎng)?chuàng)建哪個(gè)類下面;參數(shù)parent是父設(shè)備,一般為NULL,也就是沒有父設(shè)備;參數(shù)devt是設(shè)備號(hào);參數(shù)drvdata是設(shè)備可能會(huì)使用的一些數(shù)據(jù),一般為NULL;參數(shù)fmt是設(shè)備名字,如果設(shè)置fmt=xxx的話,就會(huì)生成/dev/xxx這個(gè)設(shè)備文件。返回值就是創(chuàng)建好的設(shè)備。同樣的, 卸載驅(qū)動(dòng)的時(shí)候需要?jiǎng)h除掉創(chuàng)建的設(shè)備, 設(shè)備刪除函數(shù)為 device_destroy, 函數(shù)原型如下:

void device_destroy(struct class *class, dev_t devt)
參數(shù)class是要?jiǎng)h除的設(shè)備所處的類,參數(shù)devt是要?jiǎng)h除的設(shè)備號(hào)。

第五:創(chuàng)建類函數(shù)

chrdev.c文件完整代碼如下所示:

#include  //初始化頭文件
#include  //最基本的文件, 支持動(dòng)態(tài)添加和卸載模塊。
#include  //包含了文件操作相關(guān) struct 的定義, 例如大名鼎鼎的struct file_operations
#include 
#include  //對(duì)字符設(shè)備結(jié)構(gòu) cdev 以及一系列的操作函數(shù)的定義。 
                        //包含了 cdev 結(jié)構(gòu)及相關(guān)函數(shù)的定義。
 
#define DEVICE_NUMBER 1 //定義次設(shè)備號(hào)的個(gè)數(shù)
#define DEVICE_SNAME "schrdev" //定義靜態(tài)注冊(cè)設(shè)備的名稱
#define DEVICE_ANAME "achrdev" //定義動(dòng)態(tài)注冊(cè)設(shè)備的名稱
#define DEVICE_MINOR_NUMBER 0 //定義次設(shè)備號(hào)的起始地址
 
#include  //包含了 device、 class 等結(jié)構(gòu)的定義
 
#define DEVICE_CLASS_NAME "chrdev_class" //宏定義類名
 
static int major_num, minor_num; //定義主設(shè)備號(hào)和次設(shè)備號(hào)
struct class *class; //定義類
struct cdev cdev;//定義一個(gè) cdev 結(jié)構(gòu)體
 
module_param(major_num, int, S_IRUSR); //驅(qū)動(dòng)模塊傳入普通參數(shù) major_num
module_param(minor_num, int, S_IRUSR); //驅(qū)動(dòng)模塊傳入普通參數(shù) minor_num
 
dev_t dev_num;
 
int chrdev_open(struct inode *inode, struct file *file)
{
    printk("chrdev_open
");
    return 0;
} 
 
struct file_operations chrdev_ops = {
.owner = THIS_MODULE,
.open = chrdev_open
};
 
static int hello_init(void)
{
    int ret; //函數(shù)返回值
    if (major_num)
    {
         /*靜態(tài)注冊(cè)設(shè)備號(hào)*/
         printk("major_num = %d
", major_num); //打印傳入進(jìn)來的主設(shè)備號(hào)
         printk("minor_num = %d
", minor_num); //打印傳入進(jìn)來的次設(shè)備號(hào)
         //MKDEV 將主設(shè)備號(hào)和次設(shè)備號(hào)合并為一個(gè)設(shè)備號(hào)
         dev_num = MKDEV(major_num, minor_num);
         ret = register_chrdev_region(dev_num, DEVICE_NUMBER, DEVICE_SNAME); //注冊(cè)設(shè)備號(hào)
         if (ret < 0)
         {
              printk("register_chrdev_region error
");
         } 
         printk("register_chrdev_region ok
"); //靜態(tài)注冊(cè)設(shè)備號(hào)成功
    } 
    else
    {
         /*動(dòng)態(tài)注冊(cè)設(shè)備號(hào)*/
         ret = alloc_chrdev_region(&dev_num, DEVICE_MINOR_NUMBER, 1, DEVICE_ANAME);
         if (ret < 0)
         {
             printk("alloc_chrdev_region error
");
         } 
         printk("alloc_chrdev_region ok
"); //動(dòng)態(tài)注冊(cè)設(shè)備號(hào)成功
         major_num = MAJOR(dev_num); //將主設(shè)備號(hào)取出來
         minor_num = MINOR(dev_num); //將次設(shè)備號(hào)取出來
         printk("major_num = %d
", major_num); //打印傳入進(jìn)來的主設(shè)備號(hào)
         printk("minor_num = %d
", minor_num); //打印傳入進(jìn)來的次設(shè)備號(hào)
    } 
    cdev.owner = THIS_MODULE;
    //cdev_init 函數(shù)初始化 cdev 結(jié)構(gòu)體成員變量
    cdev_init(&cdev, &chrdev_ops);
    //完成字符設(shè)備注冊(cè)到內(nèi)核
    cdev_add(&cdev, dev_num, DEVICE_NUMBER);
    //創(chuàng)建類
    class = class_create(THIS_MODULE, DEVICE_CLASS_NAME);
    return 0;
}
 
static void hello_exit(void)
{
    unregister_chrdev_region(MKDEV(major_num, minor_num), DEVICE_NUMBER);
    //注銷設(shè)備號(hào)
    cdev_del(&cdev);
    //刪除類
    class_destroy(class);
   printk("gooodbye! 
");
}
 
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");

將代碼編譯成模塊,利用驅(qū)動(dòng)程序里面的Makefile文件。

編譯并加載,如果創(chuàng)建類成功以后,會(huì)在開發(fā)板的/sys/class/下面生成一個(gè)名為“chrdev_class”的類。現(xiàn)在沒有加載驅(qū)動(dòng)的情況,如下圖所示:ls /sys/class

第六:創(chuàng)建設(shè)備函數(shù)

在前面代碼的基礎(chǔ)上添加創(chuàng)建設(shè)備的代碼,如下所示:

#include  //初始化頭文件
#include  //最基本的文件, 支持動(dòng)態(tài)添加和卸載模塊。
#include  //包含了文件操作相關(guān) struct 的定義, 例如struct file_operations
#include 
 
#include  //對(duì)字符設(shè)備結(jié)構(gòu) cdev 以及一系列的操作函數(shù)的定義。
                        //包含了 cdev 結(jié)構(gòu)及相關(guān)函數(shù)的定義。
 
#define DEVICE_NUMBER 1 //定義次設(shè)備號(hào)的個(gè)數(shù)
#define DEVICE_SNAME "schrdev" //定義靜態(tài)注冊(cè)設(shè)備的名稱
#define DEVICE_ANAME "achrdev" //定義動(dòng)態(tài)注冊(cè)設(shè)備的名稱
#define DEVICE_MINOR_NUMBER 0 //定義次設(shè)備號(hào)的起始地址
 
#include  //包含了 device、 class 等結(jié)構(gòu)的定義
 
#define DEVICE_CLASS_NAME "chrdev_class"
#define DEVICE_NODE_NAME "chrdev_test" //宏定義設(shè)備節(jié)點(diǎn)的名字
 
static int major_num, minor_num; //定義主設(shè)備號(hào)和次設(shè)備號(hào)
struct class *class; /* 類 */
struct device *device; /* 設(shè)備 */
struct cdev cdev; //定義一個(gè) cdev 結(jié)構(gòu)體
 
module_param(major_num, int, S_IRUSR); //驅(qū)動(dòng)模塊傳入普通參數(shù) major_num
module_param(minor_num, int, S_IRUSR); //驅(qū)動(dòng)模塊傳入普通參數(shù) minor_num
dev_t dev_num; /* 設(shè)備號(hào) */
 
/***
* @description: 打開設(shè)備
* @param {structinode} *inode:傳遞給驅(qū)動(dòng)的 inode
* @param {structfile} *file:設(shè)備文件, file 結(jié)構(gòu)體有個(gè)叫做 private_data 的成員變量,
* 一般在 open 的時(shí)候?qū)?private_data 指向設(shè)備結(jié)構(gòu)體。
* @return: 0 成功;其他 失敗
*/
int chrdev_open(struct inode *inode, struct file *file)
{
    printk("chrdev_open
");
    return 0;
}
 
// 設(shè)備操作函數(shù)結(jié)構(gòu)體
struct file_operations chrdev_ops = {
.owner = THIS_MODULE,
.open = chrdev_open
};
 
/**
* @description: 驅(qū)動(dòng)入口函數(shù)
* @param {*}無
* @return {*} 0 成功;其他 失敗
*/
static int hello_init(void)
{
    int ret; //函數(shù)返回值
    if (major_num)
    {
        /*靜態(tài)注冊(cè)設(shè)備號(hào)*/
        printk("major_num = %d
", major_num); //打印傳入進(jìn)來的主設(shè)備號(hào)
        printk("minor_num = %d
", minor_num); //打印傳入進(jìn)來的次設(shè)備號(hào)
        dev_num = MKDEV(major_num, minor_num); 
        //MKDEV 將主設(shè)備號(hào)和次設(shè)備號(hào)合并為一個(gè)設(shè)備號(hào)
        ret = register_chrdev_region(dev_num, DEVICE_NUMBER, DEVICE_SNAME); //注冊(cè)設(shè)備號(hào)
        if (ret < 0)
        {
            printk("register_chrdev_region error
");
        } 
        printk("register_chrdev_region ok
"); //靜態(tài)注冊(cè)設(shè)備號(hào)成功
    } 
    else
    {
        /*動(dòng)態(tài)注冊(cè)設(shè)備號(hào)*/
        ret = alloc_chrdev_region(&dev_num, DEVICE_MINOR_NUMBER, 1, DEVICE_ANAME);
        if (ret < 0)
        {
            printk("alloc_chrdev_region error
");
        }
        printk("alloc_chrdev_region ok
"); //動(dòng)態(tài)注冊(cè)設(shè)備號(hào)成功
        major_num = MAJOR(dev_num); //將主設(shè)備號(hào)取出來
        minor_num = MINOR(dev_num); //將次設(shè)備號(hào)取出來
        printk("major_num = %d
", major_num); //打印傳入進(jìn)來的主設(shè)備號(hào)
        printk("minor_num = %d
", minor_num); //打印傳入進(jìn)來的次設(shè)備號(hào)
    } 
    // 初始化 cdev
    cdev.owner = THIS_MODULE;
    cdev_init(&cdev, &chrdev_ops);
    // 向系統(tǒng)注冊(cè)設(shè)備
    cdev_add(&cdev, dev_num, DEVICE_NUMBER);
    // 創(chuàng)建 class 類
    class = class_create(THIS_MODULE, DEVICE_CLASS_NAME);
    // 在 class 類下創(chuàng)建設(shè)備
    device = device_create(class, NULL, dev_num, NULL, DEVICE_NODE_NAME);
    return 0;
} 
 
/**
* @description: 驅(qū)動(dòng)出口函數(shù)
* @param {*}無
* @return {*}無
*/
static void hello_exit(void)
{
    //注銷設(shè)備號(hào)
    unregister_chrdev_region(MKDEV(major_num, minor_num), DEVICE_NUMBER);
    //刪除設(shè)備
    cdev_del(&cdev);
    //注銷設(shè)備
    device_destroy(class, dev_num);
    //刪除類
    class_destroy(class);
    printk("gooodbye! 
");
} 
 
// 將上面兩個(gè)函數(shù)指定為驅(qū)動(dòng)的入口和出口函數(shù)
module_init(hello_init);
module_exit(hello_exit);
// LICENSE 和作者信息
MODULE_LICENSE("GPL");
MODULE_AUTHOR("zuomu");

編寫應(yīng)用測(cè)試程序如下所示:

#include 
#include 
#include 
#include 
#include 
int main(int argc,char *argv[])
{
    int fd;
    char buf[64] = {0};
    fd = open("/dev/chrdev_test",O_RDWR); //打開設(shè)備節(jié)點(diǎn)
    if(fd < 0)
    {
         perror("open error 
");
         return fd;
    } 
    close(fd);
    return 0;
}

輸入命令編譯app.c ,利用驅(qū)動(dòng)里面的Makefile文件實(shí)現(xiàn)。

第七:具體效果如下:

將前面加載的驅(qū)動(dòng)卸載掉,再加載新編譯好的的驅(qū)動(dòng), 如下圖所示:
rmmod chrdev
insmod chrdev.ko

c2a2be98-5d1f-11ed-a3b6-dac502259ad0.png

輸入以下命令查看/sys/class 下面是否生成類, 如下圖所示:ls /sys/class/chrdev_class/

輸入以下命令查看下是否生成了設(shè)備節(jié)點(diǎn)ls /dev/chrdev_test

c2beedca-5d1f-11ed-a3b6-dac502259ad0.png

總結(jié):利用標(biāo)準(zhǔn)字符驅(qū)動(dòng)模型,自動(dòng)生成設(shè)備節(jié)點(diǎn),在開發(fā)過程具有重要意義。

審核編輯:郭婷


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 嵌入式
    +關(guān)注

    關(guān)注

    5125

    文章

    19438

    瀏覽量

    313199
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11420

    瀏覽量

    212361

原文標(biāo)題:Linux系統(tǒng)下自動(dòng)創(chuàng)建設(shè)備節(jié)點(diǎn)方法

文章出處:【微信號(hào):嵌入式開發(fā)愛好者,微信公眾號(hào):嵌入式開發(fā)愛好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    飛凌嵌入式ElfBoard ELF 1板卡-字符驅(qū)動(dòng)之自動(dòng)創(chuàng)建節(jié)點(diǎn)

    節(jié)點(diǎn),本節(jié)講解如何讓驅(qū)動(dòng)自動(dòng)在/dev目錄下生成設(shè)備節(jié)點(diǎn)。想要實(shí)現(xiàn)自動(dòng)創(chuàng)建
    發(fā)表于 03-18 09:48

    何在RakSmart服務(wù)器上用Linux系統(tǒng)部署DeepSeek

    Linux系統(tǒng) DeepSeek 部署方案,結(jié)合RakSmart 服務(wù)器硬件推薦及多場(chǎng)景適配建議,主機(jī)推薦小編為您整理發(fā)布如何在RakSmart服務(wù)器上用Linux
    的頭像 發(fā)表于 03-14 11:53 ?279次閱讀

    Linux中的用戶與創(chuàng)建

    Linux中的用戶與創(chuàng)建 用戶的類型 超級(jí)管理用戶: 權(quán)限最高的用戶(uid:0) #uid:是用戶的身份證號(hào),Linux系統(tǒng)只認(rèn)uid 普通用戶: 權(quán)限受限的用戶(uid:1000-
    的頭像 發(fā)表于 12-20 14:24 ?542次閱讀
    <b class='flag-5'>Linux</b>中的用戶與<b class='flag-5'>創(chuàng)建</b>

    何在Linux系統(tǒng)上設(shè)置站群服務(wù)器IP地址

    Linux系統(tǒng)上設(shè)置站群服務(wù)器的IP地址,可以通過以下步驟進(jìn)行,主機(jī)推薦小編為您整理發(fā)布如何在Linux系統(tǒng)上設(shè)置站群服務(wù)器IP地址。
    的頭像 發(fā)表于 12-11 10:05 ?389次閱讀

    何在TMS320C6727 DSP上創(chuàng)建基于延遲的音頻效果

    電子發(fā)燒友網(wǎng)站提供《如何在TMS320C6727 DSP上創(chuàng)建基于延遲的音頻效果.pdf》資料免費(fèi)下載
    發(fā)表于 10-16 10:35 ?0次下載
    如<b class='flag-5'>何在</b>TMS320C6727 DSP上<b class='flag-5'>創(chuàng)建</b>基于延遲的音頻效果

    自動(dòng)節(jié)點(diǎn)位置檢測(cè)(SNPD)

    電子發(fā)燒友網(wǎng)站提供《自動(dòng)節(jié)點(diǎn)位置檢測(cè)(SNPD).pdf》資料免費(fèi)下載
    發(fā)表于 09-30 09:35 ?3次下載
    <b class='flag-5'>自動(dòng)</b>從<b class='flag-5'>節(jié)點(diǎn)</b>位置檢測(cè)(SNPD)

    何在DRA821U上使用Linux實(shí)現(xiàn)快速引導(dǎo)

    電子發(fā)燒友網(wǎng)站提供《如何在DRA821U上使用Linux實(shí)現(xiàn)快速引導(dǎo).pdf》資料免費(fèi)下載
    發(fā)表于 09-03 10:11 ?0次下載
    如<b class='flag-5'>何在</b>DRA821U上使用<b class='flag-5'>Linux</b>實(shí)現(xiàn)快速引導(dǎo)

    linux系統(tǒng)設(shè)備驅(qū)動(dòng)一般分幾類

    Linux系統(tǒng)設(shè)備驅(qū)動(dòng)是操作系統(tǒng)與硬件設(shè)備之間的橋梁,負(fù)責(zé)實(shí)現(xiàn)操作系統(tǒng)與硬件
    的頭像 發(fā)表于 08-30 15:13 ?789次閱讀

    Linux設(shè)備驅(qū)動(dòng)程序分類有哪些

    Linux設(shè)備驅(qū)動(dòng)程序是操作系統(tǒng)與硬件設(shè)備之間的橋梁,負(fù)責(zé)實(shí)現(xiàn)硬件設(shè)備與操作系統(tǒng)之間的通信和控制
    的頭像 發(fā)表于 08-30 15:11 ?975次閱讀

    Linux操作系統(tǒng)運(yùn)行參數(shù)自動(dòng)調(diào)整技術(shù)

    Linux操作系統(tǒng)運(yùn)行參數(shù)的自動(dòng)調(diào)整是一個(gè)復(fù)雜而關(guān)鍵的技術(shù),它可以顯著提高系統(tǒng)性能、穩(wěn)定性和資源利用率。通過使用自適應(yīng)算法特別是內(nèi)核態(tài)的機(jī)器學(xué)習(xí)框架、性能監(jiān)控工具和配置管理工具,能夠在
    的頭像 發(fā)表于 08-22 09:53 ?633次閱讀
    <b class='flag-5'>Linux</b>操作<b class='flag-5'>系統(tǒng)</b>運(yùn)行參數(shù)<b class='flag-5'>自動(dòng)</b>調(diào)整技術(shù)

    Alphabet向旗下自動(dòng)駕駛企業(yè)Waymo注資50億美元

    7月24日,科技巨頭谷歌的母公司Alphabet宣布了一項(xiàng)重大投資決策,即向旗下自動(dòng)駕駛領(lǐng)域的先鋒企業(yè)Waymo注資50億美元,此舉標(biāo)志著Alphabet對(duì)自動(dòng)駕駛技術(shù)未來發(fā)展的堅(jiān)定承諾。
    的頭像 發(fā)表于 07-24 16:13 ?1504次閱讀

    何在SQL中創(chuàng)建觸發(fā)器

    的業(yè)務(wù)邏輯,以及執(zhí)行審計(jì)和記錄更改歷史等功能。下面,我將詳細(xì)解釋如何在SQL中創(chuàng)建觸發(fā)器,并附帶示例代碼。
    的頭像 發(fā)表于 07-18 16:01 ?2778次閱讀

    節(jié)點(diǎn)電壓法自動(dòng)滿足KCL還是KVL?

    。KVL是描述電路中電壓環(huán)路的定律,而基爾霍夫電流定律(Kirchhoff's Current Law,簡(jiǎn)稱KCL)則是描述電路中電流節(jié)點(diǎn)的定律。節(jié)點(diǎn)電壓法自動(dòng)滿足KVL,但并不自動(dòng)滿
    的頭像 發(fā)表于 07-12 09:23 ?3088次閱讀

    虹科干貨 |?多設(shè)備協(xié)同無憂:Linux環(huán)境下PCAN固定設(shè)備ID/通道分配指南

    在車輛網(wǎng)絡(luò)系統(tǒng)和工業(yè)自動(dòng)化等多設(shè)備環(huán)境中,確保設(shè)備識(shí)別的一致性對(duì)于維護(hù)系統(tǒng)穩(wěn)定性至關(guān)重要。虹科PCAN適配器提供了一種解決方案,允許用戶在
    的頭像 發(fā)表于 06-11 15:03 ?680次閱讀
    虹科干貨 |?多<b class='flag-5'>設(shè)備</b>協(xié)同無憂:<b class='flag-5'>Linux</b>環(huán)境下PCAN固定<b class='flag-5'>設(shè)備</b>ID/通道分配指南

    請(qǐng)問ESP Wroom 32板如何在LInux下使用?

    ESP Wroom 32板如何在LInux下使用。 我用的系統(tǒng)是統(tǒng)信UOS,如何使用ESP32板,開發(fā)Micropython啊 簡(jiǎn)單來說就是在ESP32上刷上micropython固件,然后編寫micropython代碼。 在
    發(fā)表于 06-05 06:22