當(dāng)前位置:首頁 > 嵌入式 > 嵌入式教程
[導(dǎo)讀]CAN通信卡的Linux設(shè)備驅(qū)動程序設(shè)計實現(xiàn)

目前,許多工業(yè)現(xiàn)場如電力系統(tǒng)、化工系統(tǒng)等大量使用控制器局部網(wǎng)(CAN——Controller Area Network)現(xiàn)場總線網(wǎng)絡(luò),CAN通信卡作為計算機(jī)的外設(shè)將計算機(jī)接入CAN網(wǎng)絡(luò)。市場上有不少CAN通信卡,但基本上都不帶Linux驅(qū)動程序,當(dāng)需要在Linux下使用CAN通信卡設(shè)備時,需自己開發(fā)Linux的驅(qū)動程序。開發(fā)Linux驅(qū)動程序不但要求程序員要非常熟悉Linux系統(tǒng),而且要熟悉Linux驅(qū)動程序開發(fā)的規(guī)范。本文將詳細(xì)介紹CAN通信卡的Linux驅(qū)動設(shè)備程序的設(shè)計和實現(xiàn)。

1 CAN通信卡的Linux設(shè)備驅(qū)動程序結(jié)構(gòu)
      Linux系統(tǒng)內(nèi)核通過設(shè)備驅(qū)動程序與外圍設(shè)備進(jìn)行交互,設(shè)備驅(qū)動程序是Linux內(nèi)核的一部分,它是一組數(shù)據(jù)結(jié)構(gòu)和函數(shù),這些數(shù)據(jù)結(jié)構(gòu)和函數(shù)通過定義的接口控制一個或多個設(shè)備。對用戶程序而言,設(shè)備驅(qū)動程序隱藏了設(shè)備的具體細(xì)節(jié),對各種不同設(shè)備提供一致的接口,一般來說是把設(shè)備映射為一個特殊的設(shè)備文件,用戶程序可以象對普通文件一樣對此設(shè)備文件進(jìn)行操作。

    Linux將每個設(shè)備看作一個文件,即可以像對待文件那樣使用read、write等系統(tǒng)調(diào)用進(jìn)行讀寫。Linux的設(shè)備文件分為兩類:一是字符設(shè)備,只能對該類設(shè)備進(jìn)行順序讀寫,對外提供字節(jié)流方式的操作;二是塊設(shè)備,可以對該類設(shè)備進(jìn)行隨機(jī)訪問,一般是磁盤設(shè)備等大容量存儲設(shè)備。CAN通信卡設(shè)備屬于字符型設(shè)備。

    對設(shè)備的訪問是由設(shè)備驅(qū)動程序提供的。Linux的設(shè)備驅(qū)動程序可以用模塊的方式加載入內(nèi)核,設(shè)備驅(qū)動程序與Linux系統(tǒng)的關(guān)系如圖1所示。

1.1  CAN通信卡設(shè)備的特點

    控制器局部網(wǎng)(CAN)屬于現(xiàn)場總線的范疇,它是一種有效支持分布式控制或?qū)崟r控制的串行通信網(wǎng)絡(luò)。由于其性能優(yōu)異、價格低廉,很快被推廣到工業(yè)測控現(xiàn)場。

    CAN通信卡硬件實現(xiàn)CAN定義的物理層和數(shù)據(jù)鏈路層功能,收發(fā)報文中數(shù)據(jù)長度為0~8個字節(jié),有2032個報文標(biāo)識符。工作時通過報文標(biāo)識符確定總線訪問優(yōu)先權(quán),高優(yōu)先級報文具有低延遲時間,數(shù)據(jù)傳送速率可編程(最高為1Mbps)。發(fā)送期間若丟失仲裁或由于出錯而遭破壞的報文可自動重發(fā)。具有成組和廣播報文功能。

    當(dāng)CAN通信卡接收到一個報文時,數(shù)據(jù)保存在CAN通信卡上的接收緩存器中,并產(chǎn)生一個接收中斷。當(dāng)一個報文被成功發(fā)送后,發(fā)送緩沖器可再次被訪問,產(chǎn)生一個發(fā)送中斷信號。CAN通信卡發(fā)送報文,將數(shù)據(jù)送入CAN通信卡上的發(fā)送緩存器中,CAN通信卡將數(shù)據(jù)串行化發(fā)到CAN總線上。

1.2 CAN通信卡設(shè)備驅(qū)動程序的任務(wù)

    由于CAN一幀的數(shù)據(jù)長度最大為8個字節(jié),可以用多幀的Hilon A協(xié)議來使CAN傳輸數(shù)據(jù)任意長。CAN通信卡驅(qū)動程序主要完成按照Hilon A協(xié)議解包接收和打包發(fā)送任務(wù),并要對接收的多幀進(jìn)行管理。

    CAN通信卡驅(qū)動程序應(yīng)該完成以下任務(wù):

    (1)為應(yīng)用程序提供通過CAN卡發(fā)送和接收任意長度數(shù)據(jù)的能力;

    (2)為應(yīng)用程序提供設(shè)置CAN卡上CAN控制器運行參數(shù)的能力;

    (3)以阻塞或非阻塞方式讀寫CAN設(shè)備文件;

    (4)允許CAN卡同時收發(fā)多路數(shù)據(jù)。

1.3 CAN通信卡驅(qū)動程序的處理流程

    用戶進(jìn)程通過系統(tǒng)調(diào)用向驅(qū)動程序傳送一幀任意長度的數(shù)據(jù),驅(qū)動程序中發(fā)送數(shù)據(jù)的程序按照Hilon A協(xié)議將該幀分段打包,放入發(fā)送隊列,并向CAN控制器請求發(fā)送,由中斷處理程序中發(fā)送部分負(fù)責(zé)發(fā)送完所有的數(shù)據(jù)包。

    當(dāng)CAN通信卡接收到數(shù)據(jù)時,產(chǎn)生接收中斷,啟動接收中斷處理程序上半部將CAN控制器中接收緩沖器中的內(nèi)容復(fù)制到接收隊列中,由中斷處理的下半部負(fù)責(zé)解包和組幀的任務(wù),并將處理完的幀放入幀隊列中,最后用戶使用系統(tǒng)調(diào)用從接收幀隊列中讀取完整的一幀。

    CAN通信卡設(shè)備驅(qū)動程序處理框架如圖2所示。

2 CAN通信卡設(shè)備驅(qū)動程序的模塊化程序設(shè)計

    根據(jù)Linux對設(shè)備驅(qū)動程序的要求,模塊化的CAN驅(qū)動程序軟件結(jié)構(gòu)如圖3。[!--empirenews.page--]

2.1 初始化加載和卸載部分 

    如果設(shè)備驅(qū)動程序以模塊方式加入內(nèi)核,則一定會包括兩個模塊init_module和clear_module。init_module模塊用來加載設(shè)備,系統(tǒng)初始化時調(diào)用;clear_module模塊用來卸載設(shè)備,取消設(shè)備時調(diào)用。

    設(shè)備驅(qū)動程序是系統(tǒng)內(nèi)核的一部分。在任何程序使用設(shè)備驅(qū)動程序之前,設(shè)備驅(qū)動程序應(yīng)該向系統(tǒng)進(jìn)行登記,以便系統(tǒng)在適當(dāng)?shù)臅r候調(diào)用。Linux系統(tǒng)里,通過調(diào)用register_chrdev函數(shù)向系統(tǒng)注冊字符型設(shè)備驅(qū)動程序。register_chrdev定義為: 

    int register_chrdev(unsigned int major, const char *name, struct file_operations *fops); 

    其中,major是為設(shè)備驅(qū)動程序向系統(tǒng)申請的主設(shè)備號,如果為0則系統(tǒng)為此驅(qū)動程序動態(tài)分配一個主設(shè)備號;name是設(shè)備名;fops是對各個系統(tǒng)調(diào)用的入口點的說明。 

    CAN通信卡使用中斷與系統(tǒng)交換數(shù)據(jù),CAN設(shè)備驅(qū)動程序需要使用內(nèi)存來緩存接收到的數(shù)據(jù)和發(fā)送的數(shù)據(jù),中斷和內(nèi)存等資源是由Linux系統(tǒng)統(tǒng)一管理的,設(shè)備驅(qū)動程序在初始化時,需要申請資源。在資源不用的時候,應(yīng)該釋放它們,以利于資源的共享。在Linux系統(tǒng)里,對中斷的處理是屬于系統(tǒng)核心的部分,設(shè)備驅(qū)動程序通過調(diào)用request_irq()函數(shù)來申請中斷,通過free_irq()函數(shù)來釋放中斷。作為系統(tǒng)核心的一部分,設(shè)備驅(qū)動程序在申請和釋放內(nèi)存時不是調(diào)用malloc()函數(shù)和free()函數(shù),而代之以調(diào)用kmalloc函數(shù)和kfree()函數(shù)。

    在init_module模塊中,先檢查是否存在CAN通信卡,如果不存在則退出設(shè)備驅(qū)動程序的加載;如果存在,使用request_irq()函數(shù)為CAN通信卡申請系統(tǒng)中空閑的中斷,使用kmalloc()為設(shè)備驅(qū)動程序申請輸入輸出緩存隊列,如果這些資源申請不成功,則釋放已經(jīng)申請到的系統(tǒng)資源,然后退出設(shè)備驅(qū)動程序的加載,如果申請成功,使用register_chrdev()函數(shù)將CAN通信卡驅(qū)動程序注冊到Linux系統(tǒng)中,加載完成。

    在cleanup_module模塊中先使用free_irq()函數(shù)釋放init_module模塊中申請到的中斷,然后使用kfree()函數(shù)釋放init_module模塊中申請到的內(nèi)存空間,最后使用unregister_chrdev()函數(shù)釋放init_module模塊中注冊的設(shè)備驅(qū)動程序,卸載完成。

2.2  CAN通信卡設(shè)備驅(qū)動程序的中斷處理部分

    Linux中斷處理程序可以分為上半部和下半部。上半部即一般的中斷服務(wù)程序,由硬件中斷觸發(fā),它一般運行在關(guān)中斷的方式下,應(yīng)當(dāng)盡可能短小,處理盡可能快;而下半部是單獨的一段處理程序,一般將其掛入立即隊列中以便快速執(zhí)行。立即隊列中的任務(wù)在退出系統(tǒng)調(diào)用或調(diào)度器獲得運行時,將最優(yōu)先地被執(zhí)行。下半部運行在一個安全的環(huán)境,即開中斷和任務(wù)串行化,可以處理一些較花時間的任務(wù)。

    這樣,驅(qū)動程序上半部在處理完實時性很強(qiáng)的任務(wù)后,用queue_task()函數(shù)將下半部處理函數(shù)掛入立即隊列,并用mark_bh()函數(shù)來激活立即隊列,則下半部可以最優(yōu)先地被執(zhí)行。

    當(dāng)有接收中斷時,CAN通信卡設(shè)備驅(qū)動程序的中斷處理程序上半部首先獲取驅(qū)動程序接收緩存中的空閑塊,將CAN通信卡上的接收緩沖器中數(shù)據(jù)復(fù)制到驅(qū)動程序的接收緩存中,釋放CAN通信卡接收緩沖器,然后將下半部處理函數(shù)掛入立即隊列,最后激活立即隊列。

    當(dāng)有發(fā)送中斷時,CAN通信卡設(shè)備驅(qū)動程序的中斷處理程序上半部首先獲取發(fā)送緩沖隊列中的數(shù)據(jù),將需要發(fā)送的數(shù)據(jù)寫入CAN控制器的發(fā)送緩沖器,最后請求發(fā)送。

    CAN通信卡設(shè)備驅(qū)動程序的中斷處理程序下半部使用Hilon A協(xié)議對要傳送到CAN網(wǎng)絡(luò)上的數(shù)據(jù)打包,并對從CAN網(wǎng)絡(luò)上接收到的數(shù)據(jù)進(jìn)行解包和組幀。這樣中斷處理程序的上半部只需要從CAN通信卡的緩沖器中將數(shù)據(jù)復(fù)制到驅(qū)動程序的緩沖區(qū),系統(tǒng)開銷很小,但很費CPU時間;系統(tǒng)開銷較大的打包、解包和組幀處理則放在中斷處理程序的下半部,使用系統(tǒng)非中斷時間調(diào)度,可以使系統(tǒng)響應(yīng)中斷更快,通信更穩(wěn)定。

2.3 緩沖區(qū)管理 [!--empirenews.page--]

    在CAN通信卡設(shè)備驅(qū)動程序中,為了增強(qiáng)CAN通信卡的通信能力、提高通信效率,根據(jù)CAN的特點,使用兩級緩沖區(qū)結(jié)構(gòu),即直接面向CAN通信卡的收發(fā)緩沖區(qū)和直接面向系統(tǒng)調(diào)用的接收幀緩沖區(qū)。

    通訊中的收發(fā)緩沖區(qū)一般采用環(huán)形隊列(或稱為FIFO隊列),使用環(huán)形的緩沖區(qū)可以使得讀寫并發(fā)執(zhí)行,讀進(jìn)程和寫進(jìn)程可以采用“生產(chǎn)者和消費者”的模型來訪問緩沖區(qū),從而方便了緩存的使用和管理。然而,環(huán)形緩沖區(qū)的執(zhí)行效率并不高,每讀一個字節(jié)之前,需要判斷緩沖區(qū)是否為空,并且移動尾指針時需要進(jìn)行“折行處理”(即當(dāng)指針指到緩沖區(qū)內(nèi)存的末尾時,需重新將其定向到緩沖區(qū)的首地址);每寫一個字節(jié)之前,需要判斷緩沖區(qū)是否為滿,并且移動尾指針時同樣需要進(jìn)行“折行處理”。程序大部分的執(zhí)行過程都是在處理個別極端的情況,只有小部分在進(jìn)行實際有效的操作。這就是軟件工程中所謂的“8比2”關(guān)系。結(jié)合CAN通訊的實際情況,在本設(shè)計中對環(huán)形隊列進(jìn)行了改進(jìn),可以較大地提高數(shù)據(jù)的收發(fā)效率。

    由于CAN通信卡上接收和發(fā)送緩沖器每次只接收一幀CAN數(shù)據(jù),而且根據(jù)CAN的通訊協(xié)議,CAN控制器的發(fā)送緩沖器由1個字節(jié)的標(biāo)識符、一個字節(jié)的RTR和DLC位及8個字節(jié)的數(shù)據(jù)區(qū)組成,共10個字節(jié);接收緩沖器與之類似,也有10個字節(jié)的寄存器。所以CAN控制器收發(fā)的數(shù)據(jù)是短小的定長幀(數(shù)據(jù)可以不滿8字節(jié))。

    于是,采用長度為10字節(jié)的數(shù)據(jù)塊來分配內(nèi)存比較方便,即每次需要內(nèi)存緩沖區(qū)時,直接分配10個字節(jié),由于這10個字節(jié)的地址是線性的,故不需要進(jìn)行 “折行” 處理。更重要的是,在向緩沖區(qū)中寫數(shù)據(jù)時,只需要判斷一次是否有空閑塊并獲取其塊首指針就可以了,從而減少了重復(fù)性的條件判斷,大大提高了程序的執(zhí)行效率;同樣在從緩沖隊列中讀取數(shù)據(jù)時,也是一次讀取10字節(jié)的數(shù)據(jù)塊,同樣減少了重復(fù)性的條件判斷。

    在CAN卡驅(qū)動程序中采用如下所示的稱為“Block_Ring_t”的數(shù)據(jù)結(jié)構(gòu)作為收發(fā)數(shù)據(jù)的緩沖區(qū):

        typedef struct {

    long signature;

    unsigned char *head_p;

    unsigned char *tail_p;

    unsigned char *begin_p;

    unsigned char *end_p;

    unsigned char buffer[BLOCK_RING_BUFFER_SIZE];

    int usedbytes;

    }Block_Ring_t;

    該數(shù)據(jù)結(jié)構(gòu)在通用的環(huán)形隊列上增加了一個數(shù)據(jù)成員usedbytes,它表示當(dāng)前緩沖區(qū)中有多少字節(jié)的空間被占用了。使用usedbytes,可以比較方便地進(jìn)行緩沖區(qū)滿或空的判斷。當(dāng)usedbytes=0時,緩沖區(qū)空;當(dāng)usedbyes=BLOCK_RING_BUFFER_SIZE時,緩沖區(qū)滿。

    本驅(qū)動程序除了收發(fā)緩沖區(qū)外,還有一個接收幀緩沖區(qū),接收幀隊列負(fù)責(zé)管理經(jīng)Hilon A協(xié)議解包后得到的數(shù)據(jù)幀。由于有可能要同時接收多個數(shù)據(jù)幀,而根據(jù)CAN總線的通訊協(xié)議,高優(yōu)先級的報文將搶占總線,則有可能在接收一個低優(yōu)先級且被分為好幾段發(fā)送的數(shù)據(jù)幀時,被一個優(yōu)先級高的數(shù)據(jù)幀打斷。這樣會出現(xiàn)同時接收到多個數(shù)據(jù)幀中的數(shù)據(jù)包,因而需要有一個接收隊列對同時接收的數(shù)據(jù)幀進(jìn)行管理。

    當(dāng)有新的數(shù)據(jù)包到來時,應(yīng)根據(jù)addr(通訊地址),mode(通訊方式),index(數(shù)據(jù)包的序號)來判斷是否是新的數(shù)據(jù)幀。如果是,則開辟新的frame_node;否則如果已有相應(yīng)的幀節(jié)點存在,則將數(shù)據(jù)附加到該幀的末尾;在插入數(shù)據(jù)的同時,應(yīng)該檢查接收包的序號是否正確,如不正確將丟棄這包數(shù)據(jù)。

    每次建立新的frame_node時,需要向frame_queue申請內(nèi)存空間;當(dāng)frame_queue已滿時,釋放掉隊首的節(jié)點(最早接收的但未完成的幀)并返回該節(jié)點的指針。 [!--empirenews.page--]

    當(dāng)系統(tǒng)調(diào)用讀取了接收幀后,釋放該節(jié)點空間,使設(shè)備驅(qū)動程序可以重新使用該節(jié)點。

2.4 服務(wù)于I/O請求的設(shè)備驅(qū)動程序部分

    這部分實際上是應(yīng)用程序唯一可見的,應(yīng)用程序通過系統(tǒng)來調(diào)用這部分程序,是設(shè)備驅(qū)動程序?qū)?yīng)用程序的接口。本驅(qū)動程序提供文件操作接口。Linux系統(tǒng)中,字符型設(shè)備驅(qū)動程序提供的文件操作入口點由一個結(jié)構(gòu)來向系統(tǒng)說明,此結(jié)構(gòu)定義為: 

    struct file_operations { 

    int (*lseek)(struct inode *inode,struct file *filp, off_t off,int pos); 

    int (*read)(struct inode *inode,struct file *filp, char *buf, int count); 

    int (*write)(struct inode *inode,struct file *filp, char *buf,int count); 

    int (*readdir)(struct inode *inode,struct file *filp,struct dirent *dirent,int count); 

    int (*select)(struct inode *inode,struct file *filp, int sel_type,select_table *wait); 

    int (*ioctl) (struct inode *inode,struct file *filp, unsigned int cmd,unsigned int arg); 

    int (*mmap) (void); 

    int (*open) (struct inode *inode, struct file *filp); 

    void (*release) (struct inode *inode, struct file *filp);   int (*fsync) (struct inode *inode, struct file *filp); 

    };

    該結(jié)構(gòu)定義了10個操作入口點,但是驅(qū)動程序沒有必要對每個入口點進(jìn)行定義。根據(jù)需要,本驅(qū)動程序定義了如下的入口點。

    can_open(struct inode *inode, struct file *filp)入口點負(fù)責(zé)打開can設(shè)備,檢查can卡是否已被打開,完成can卡的初始化,設(shè)置設(shè)備的占用標(biāo)志。can_release(struct inode *inode, struct file *filp)入口點負(fù)責(zé)關(guān)閉can設(shè)備。

    can_read(struct inode *, struct file *, off_t, int) 入口點負(fù)責(zé)檢查設(shè)備有沒有接收到完整的幀,can_read函數(shù)只是判斷是否有完整的數(shù)據(jù)幀可讀。要獲取數(shù)據(jù)幀,可以使用ioctl 的CAN_READFRAME命令。can_write(struct inode*, struct file *, const char *, int) 入口點負(fù)責(zé)向CAN發(fā)送數(shù)據(jù)。如果發(fā)送隊列有足夠的空間,則向設(shè)備傳送數(shù)據(jù),也可以使用ioctl的CAN_WRITEFRAME命令來實現(xiàn)can_write。

    can_ioctl(struct inode *, struct file *, unsigned int cmd, unsigned long arg)入口點負(fù)責(zé)向CAN設(shè)備下發(fā)各種操作命令,命令代碼通過cmd參數(shù)傳送,命令參數(shù)通過arg參數(shù)傳送。本驅(qū)動程序提供了一些命令,配合can_read()和can_write() 可以實現(xiàn)對CAN通信卡的控制。CAN_IOCREADFRAME命令可以從CAN通信卡上讀取數(shù)據(jù)幀;CAN_IOCWRITEFRAME命令可以向CAN通信卡發(fā)送數(shù)據(jù);CAN_IOCSETCONF命令可以設(shè)置CAN通信卡的運行參數(shù);CAN_IOCGETCONF命令可以獲取CAN控制器的運行參數(shù);CAN_IOCQUERYBUSSTATE命令可以查詢CAN總線狀態(tài);CAN_IOCCLEARBUF命令可以清除CAN通信卡的收發(fā)緩沖區(qū)。

    本設(shè)備驅(qū)動程序考慮到CAN通信卡的特點和CAN網(wǎng)絡(luò)傳輸數(shù)據(jù)的特點,設(shè)計了合理的數(shù)據(jù)結(jié)構(gòu)和緩存管理方法,使得當(dāng)有大量數(shù)據(jù)進(jìn)出CAN通信卡時,既可以保證數(shù)據(jù)幀丟失和出錯幾率在允許范圍內(nèi),又可以保證數(shù)據(jù)幀能被快速下發(fā)和接收,實際應(yīng)用中性能很好。Linux擅長通信,支持大多數(shù)以太網(wǎng)卡。如果將CAN通信卡的設(shè)備驅(qū)動程序加入到Linux系統(tǒng),由于Linux的可裁減性和對硬件資源要求低的特點,可以用小硬盤、小內(nèi)存和低檔CPU構(gòu)成通信機(jī)連接高速以太網(wǎng)和低速現(xiàn)場總線CAN網(wǎng)絡(luò),經(jīng)濟(jì)實惠而且實用。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點: 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉