Linux學習筆記(應用篇三)

基于I.MX6ULL-MINI開發板

  • LED學習
  • GPIO應用編程
  • 輸入設備

開發板中所有的設備(對象)都會在/sys/devices 體現出來,是 sysfs 文件系統中最重要的目錄結構

/sys下的子目錄說明
/sys/devices這是系統中所有設備存放的目錄,也就是系統中的所有設備在 sysfs 中的呈現、表達,也是 sysfs 管理設備的最重要的目錄結構。
/sys/block塊設備的存放目錄,這是一個過時的接口,按照 sysfs 的設計理念,系統所有的設備都存放在/sys/devices 目錄下,所以/sys/block 目錄下的文件通常是鏈接到/sys/devices 目錄下的文件。
/sys/bus這是系統中的所有設備按照總線類型分類放置的目錄結構,/sys/devices 目錄下每一種設備都是掛在某種總線下的,譬如 i2c 設備掛在 I2C 總線下。同樣,/sys/bus 目錄下的文件通常也是鏈接到了/sys/devices 目錄。
/sys/class這是系統中的所有設備按照其功能分類放置的目錄結構,同樣該目錄下的文件也是鏈接到了/sys/devices 目錄。按照設備的功能劃分組織在/sys/class 目錄下,譬如/sys/class/leds目錄中存放了所有的 LED 設備,/sys/class/input 目錄中存放了所有的輸入類設備。
/sys/dev這是按照設備號的方式放置的目錄結構,同樣該目錄下的文件也是鏈接到了/sys/devices 目錄。該目錄下有很多以主設備號:次設備號(major:minor)命名的文件,這些文件都是鏈接文件,鏈接到/sys/devices 目錄下對應的設備。
/sys/firmware描述了內核中的固件。
/sys/fs用于描述系統中所有文件系統,包括文件系統本身和按文件系統分類存放的已掛載點。
/sys/kernel這里是內核中所有可調參數的位置。
/sys/module這里有系統中所有模塊的信息。
/sys/power這里是系統中電源選項,有一些屬性可以用于控制整個系統的電源狀態。

應用層想要對底層硬件進行操控,通常可以通過兩種方式

  1. /dev/目錄下的設備文件(設備節點);
  2. /sys/目錄下設備的屬性文件。

LED學習

led設備路徑

/sys/class/leds/sys-led

在這里插入圖片描述

brightness:LED亮度,可讀可寫,0亮,非0滅
max_brightness:LED最大亮度,只讀
trigger:觸發模式,可讀可寫,模式如下:
none(無觸發)、mmc0(當對 mmc0 設備發起讀寫操作的時候 LED 會閃爍)、timer(LED 會有規律的一亮一滅,被定時器控制住)、heartbeat(心跳呼吸模式,LED 模仿人的心跳呼吸那樣亮滅變化)。

代碼

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>#define LED_TRIGGER "/sys/class/leds/sys-led/trigger"
#define LED_BRIGHTNESS "/sys/class/leds/sys-led/brightness"
/*
在 C 語言中,反斜杠 \ 的作用是 行連接符(line continuation character)。
它允許你在多個行中編寫一條連續的語句,而不需要寫成一行。
具體來說,反斜杠告訴編譯器:下一行是當前行的延續,繼續合并在一起,而不加上額外的換行符。
*/
#define USAGE()     fprintf(stderr,"usage:\n" \"    %s<on|off>\n"   \"    %s<trigger><type>\n",argv[0],argv[0])  //argv[0]存放程序的名稱或路徑int main(int argc, char *argv[])//argc參數個數,argv[]參數
{int fd1, fd2;//校驗傳參if(2>argc){USAGE();return 1;}// 打開sysfs中的trigger和brightness文件fd1 = open(LED_TRIGGER, O_RDWR);if (0 > fd1) {perror("open LED_TRIGGER error");return 1;}fd2 = open(LED_BRIGHTNESS, O_RDWR);if (0 > fd2) {perror("open LED_BRIGHTNESS error");close(fd1);return 1;}//根據傳參控制LEDif(!strcmp(argv[1],"on")){//判斷傳入的第一個參數是否是onwrite(fd1,"none",4);//往trigger寫入none,共4個字節,trigger設置為無觸發write(fd2,"1",1);//點亮LED}else if(!strcmp(argv[1],"off")){//判斷傳入的第一個參數是否是offwrite(fd1,"none",4);write(fd2,"0",1);//熄滅LED}else if(!strcmp(argv[1],"trigger")){//如果傳入的第一個參數是trigger但是參數個數不是三個,提示用法if(3!=argc){USAGE();return 1;}if(0 > write(fd1,argv[2],strlen(argv[2]))){//判斷寫入是否正確,將第三個參數即觸發模式傳給fd1 (none、mmc0、timer、heartbeat)perror("write error");return 1;}}elseUSAGE();return 0;
}

在這里插入圖片描述

GPIO應用編程

GPIO目錄

/sys/class/gpio

一共包含了 5 個 GPIO控制器,分別為 GPIO1、GPIO2、GPIO3、GPIO4、GPIO5,在這里分別對應 gpiochip0、gpiochip32、gpiochip64、gpiochip96、gpiochip128 這 5 個文件夾,每一個 gpiochipX 文件夾用來管理一組 GPIO

在這里插入圖片描述
每一個gpiochipX文件夾里面有以下內容

在這里插入圖片描述

base:與 gpiochipX 中的 X 相同,表示該控制器所管理的這組 GPIO 引腳中最小的編號,如gpiochip32的base就是32
label:該組 GPIO 對應的標簽,也就是名字
ngpio:該控制器所管理的 GPIO 引腳的數量,引腳編號范圍是:base ~ base+ngpio-1

GPIO5_IO10在sysfs中對應的編號:128+10=138

export

export:用于將指定編號的 GPIO 引腳導出。在使用 GPIO 引腳之前,需要將其導出,導出成功之后才能使用它。注意 export 文件是只寫文件,不能讀取,將一個指定的編號寫入到 export 文件中即可將對應的 GPIO 引腳導出

如下圖,這個文件夾就是導出來的 GPIO 引腳對應的文件夾,用于管理、控制該 GPIO 引腳

在這里插入圖片描述

unexport

unexport:將導出的 GPIO 引腳刪除。當使用完 GPIO 引腳之后,我們需要將導出的引腳刪除,同樣該文件也是只寫文件、不可讀

在這里插入圖片描述

gpioX文件夾里的文件
在這里插入圖片描述

direction:配置 GPIO 引腳為輸入或輸出模式。該文件可讀、可寫,讀表示查看 GPIO 當前是輸入還是輸出模式,寫表示將 GPIO 配置為輸入或輸出模式;讀取或寫入操作可取的值為"out"(輸出模式)和"in"(輸入模式)
在這里插入圖片描述
value:在 GPIO 配置為輸出模式下,向 value 文件寫入"0"控制 GPIO 引腳輸出低電平,寫入"1"則控制 GPIO 引腳輸出高電平。在輸入模式下,讀取 value 文件獲取 GPIO 引腳當前的輸入電平狀態。
active_low:這個屬性文件用于控制極性,可讀可寫,默認情況下為 0,如果設置為1,則邏輯1為低電平,邏輯0為高電平
edge:控制中斷的觸發模式,該文件可讀可寫。在配置 GPIO 引腳的中斷觸發模式之前,需將其設置為輸入模式
非中斷引腳echo "none" > edge
上升沿觸發echo "rising" > edge
下降沿觸發echo "falling" > edge
邊沿觸發 echo "both" > edge

輸出代碼

#include <stdio.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>static char gpio_path[100];//存放gpio設備文件路徑//修改GPIO的狀態
static int gpio_config(const char *attr, const char *value)//attr:修改的選項(direction、active_value、value)value:傳入的值
{char file_path[100];int fd;int len;sprintf(file_path, "%s/%s", gpio_path, attr);//將/sys/class/gpio/gpiox/(direction或active_value或value)傳給file_pathif(0 > (fd = open(file_path,O_WRONLY))){perror("open error");return fd;}len = strlen(value);if(len!= write(fd,value,len))//向file_path寫入value,即修改gpio的狀態{perror("write error");close(fd);return 1;}close(fd);return 0;
}int main(int argc, char *argv[])
{//判斷傳參是否正確if(3!=argc){fprintf(stderr,"usage: %s<gpio><value>\n", argv[0]);return 1;}//判斷gpiox文件是否導出sprintf(gpio_path,"/sys/class/gpio/gpio%s",argv[1]);if(access(gpio_path,F_OK))//判斷路徑是否存在,不存在則創建,F_OK參數用于判斷文件是否存在{int fd;int len;if(0 > (fd = open("/sys/class/gpio/export",O_WRONLY)))//打開export文件并將路徑存放在fd,準備寫入{perror("open error");return 1;}len = strlen(argv[1]);if(len != write(fd,argv[1],len))//向export寫入gpio號,即導出gpio文件{perror("write error");close(fd);return 1;}close(fd);//關閉文件}//修改gpio的狀態if(gpio_config("direction","out"))//配置為輸出模式{return 1;}if(gpio_config("active_low","0"))//默認極性{return 1;}if(gpio_config("value",argv[2]))//控制GPIO高低電平{return 1;}//退出程序return 0;}

中斷輸入代碼

#include <stdio.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <poll.h>static char gpio_path[100];//存放gpio設備文件路徑//修改GPIO的狀態
static int gpio_config(const char *attr, const char *value)//attr:修改的選項(direction、active_low、value)value:傳入的值
{char file_path[100];int fd;int len;sprintf(file_path, "%s/%s", gpio_path, attr);//將/sys/class/gpio/gpiox/(direction或active_low或value)傳給file_pathif(0 > (fd = open(file_path,O_WRONLY))){perror("open error");return fd;}len = strlen(value);if(len!= write(fd,value,len))//向file_path寫入value,即修改gpio的狀態{perror("write error");close(fd);return 1;}close(fd);return 0;
}int main(int argc, char *argv[])
{struct pollfd pfd;//用于poll調用來監視文件描述符的事件,記得包含頭文件poll.hchar file_path[100];//存儲/sys/class/gpio/gpiox/value的路徑int ret;            //poll函數的返回值char value;         //從GPIO引腳讀取的值//判斷傳參是否正確if(2!=argc){fprintf(stderr,"usage: %s<gpio> <value>\n", argv[0]);return 1;}//判斷gpiox文件是否導出sprintf(gpio_path,"/sys/class/gpio/gpio%s",argv[1]);if(access(gpio_path,F_OK))//判斷路徑是否存在,不存在則創建,F_OK參數用于判斷文件是否存在{int fd;int len;if(0 > (fd = open("/sys/class/gpio/export",O_WRONLY)))//打開export文件并將路徑存放在fd,準備寫入{perror("open error");return 1;}len = strlen(argv[1]);if(len != write(fd,argv[1],len))//向export寫入gpio號,即導出gpio文件{perror("write error");return 1;}close(fd);//關閉文件}//修改gpio的狀態if(gpio_config("direction","in"))//配置為輸入模式{return 1;}if(gpio_config("active_low","0"))//默認極性{return 1;}if(gpio_config("edge","both"))//設置中斷觸發方式,both是邊沿觸發{return 1;}//打開value屬性文件sprintf(file_path,"%s/%s",gpio_path,"value");if(0 > (pfd.fd = open(file_path,O_RDONLY)))//用pfd.fd存儲vlaue的文件路徑{perror("open error");return 1;}/*調用pollstruct pollfd{int fd;         //文件描述符short events;   //等待的事件short revents;  //返回的事件}*/pfd.events = POLLPRI;//只關心高優先級數據可讀(中斷)read(pfd.fd,&value, 1);//在進入循環之前,先讀取一次GPIO狀態,以清除先前的狀態for( ; ; ){ret = poll(&pfd,1,-1);//調用poll,阻塞直到事件發生if(0 > ret){perror("poll error");return 1;}else if(0 == ret){fprintf(stderr,"poll timeout.\n");continue;}//校驗高優先級數據是否可讀if(pfd.revents & POLLPRI){if(0 > lseek(pfd.fd,0,SEEK_SET))//使用lseek重置文件指針,確保每次讀取最新的GPIO狀態{perror("lseek error");return 1;}if(0 > read(pfd.fd,&value,1)){perror("read error");return 1;}printf("gpio中斷觸發<value=%c\n",value);}}//退出程序return 0;
}

poll函數復習

int poll(struct pollfd *fds, nfds_t nfds, int timeout);
/*
fds:指向一個 struct pollfd 類型的數組,儲存關心的文件描述符
nfds:fds數組中元素的個數
timeout:決定poll函數的阻塞行為-1:一直阻塞,直到有信號來0:不阻塞>0:阻塞時間上限
*///struct pollfd 結構體
struct pollfd {int fd;        /* 文件描述符 */short events;  /* 等待的事件 */short revents; /* 返回的事件 */
};

在這里插入圖片描述

輸入設備

讀取輸入設備時,應用程序打開輸入設備對應的設備文件,向其發起讀操作,每一次 read 操作獲取的都是一個 structinput_event 結構體類型數據,該結構體定義在<linux/input.h>頭文件中

struct input_event {struct timeval time;__u16 type;		//描述發生了哪一種類型的時間__u16 code;		//該類事件具體是哪個事件,如鍵盤上不同的按鍵1、2、3...__s32 value;		
/*
內核每次上報事件都會向應用層發送一個數據 value,對 value 值的解釋隨著 code 的變化而變化。譬如對于按鍵事件(type=1)來說,如果 code=2(鍵盤上的數字鍵 1,也就是 KEY_1),那么如果 value 等于 1,則表示 KEY_1 鍵按下;value 等于 0 表示 KEY_1 鍵松開,如果 value 等于 2則表示 KEY_1 鍵長按。再比如,在絕對位移事件中(type=3),如果 code=0(觸摸點 X 坐標 ABS_X),那么 value 值就等于觸摸點的 X 軸坐標值;同理,如果 code=1(觸摸點 Y 坐標 ABS_Y),此時value 值便等于觸摸點的 Y 軸坐標值;所以對 value 值的解釋需要根據不同的 code 值而定
*/
};

type
在這里插入圖片描述

code
Key

在這里插入圖片描述

相對位移

在這里插入圖片描述

絕對位移

在這里插入圖片描述

通過數據同步使得應用程序得知本輪已經讀取到完整的數據同步類事件有如下,所有的輸入設備都需要上報同步事件,上報的同步事件通常是SYN_REPORT,而 value 值通常為 0
在這里插入圖片描述

查看輸入設備是哪個設備節點

cat /proc/bus/input/devices

在這里插入圖片描述

輸入設備代碼

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <linux/input.h>int main(int argc, char *argv[])
{struct input_event in_ev = {0};int fd = -1;int value = -1;//校驗傳參if(2 != argc){fprintf(stderr, "Usage: %s <input_dev>\n", argv[0]);return 1;}// 打開輸入事件文件if(0 > (fd = open(argv[1], O_RDONLY))){perror("open error");return 1;}for( ; ; ){// 讀取輸入事件if(sizeof(struct input_event) != (read(fd, &in_ev, sizeof(struct input_event)))){perror("read error");break;}// 按鍵輸入的類型if(EV_KEY == in_ev.type){switch (in_ev.value){case 0:printf("code<%d>:松開\n", in_ev.code);break;case 1:printf("code<%d>:按下\n", in_ev.code);break;  case 2:printf("code<%d>:長按\n", in_ev.code);break;                       }}}
}

開發板KEY0按鍵測試

在這里插入圖片描述
鍵盤測試

接入鍵盤,我使用的是2.4G連接方式
在這里插入圖片描述

查看設備時發現有兩個

在這里插入圖片描述

event3是鍵盤上的按鍵

在這里插入圖片描述

event4是鍵盤上的旋鈕
由此可知這兩個東西不是同一個設備

在這里插入圖片描述

鼠標測試

在這里插入圖片描述
在這里插入圖片描述

只能讀取鼠標的左、右和滾輪的按下和松開

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/73509.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/73509.shtml
英文地址,請注明出處:http://en.pswp.cn/web/73509.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【圖論】網絡流算法入門

&#xff08;決定狠狠加訓圖論了&#xff0c;從一直想學但沒啟動的網絡流算法開始。&#xff09; 網絡流問題 ? 問題定義&#xff1a;在帶權有向圖 G ( V , E ) G(V, E) G(V,E) 中&#xff0c;每條邊 e ( u , v ) e(u, v) e(u,v) 有容量 c ( u , v ) c(u, v) c(u,v)&am…

遞歸、搜索與回溯第四講:floodfill算法

遞歸、搜索與回溯第四講&#xff1a;floodfill算法 1.Floodfill算法介紹2.圖像渲染3.島嶼數量4.島嶼的最大面積5.被圍繞的區域6.太平洋大西洋水流問題7.掃雷游戲8.衣櫥整理 1.Floodfill算法介紹 2.圖像渲染 3.島嶼數量 4.島嶼的最大面積 5.被圍繞的區域 6.太平洋大西洋水流問題…

【深度學習與實戰】2.3、線性回歸模型與梯度下降法先導案例--最小二乘法(向量形式求解)

為了求解損失函數 對 的導數&#xff0c;并利用最小二乘法向量形式求解 的值? 這是?線性回歸?的平方誤差損失函數&#xff0c;目標是最小化預測值 與真實值 之間的差距。 ?損失函數?&#xff1a; 考慮多個樣本的情況&#xff0c;損失函數為所有樣本的平方誤差之和&a…

氣象可視化衛星云圖的方式:方法與架構詳解

氣象衛星云圖是氣象預報和氣候研究的重要數據來源。通過可視化技術,我們可以將衛星云圖數據轉化為直觀的圖像或動畫,幫助用戶更好地理解氣象變化。本文將詳細介紹衛星云圖可視化的方法、架構和代碼實現。 一、衛星云圖可視化方法 1. 數據獲取與預處理 衛星云圖數據通常來源…

瀏覽器渲染原理與優化詳解

一、瀏覽器渲染基礎原理 瀏覽器渲染流程主要包括以下步驟&#xff08;也稱為"關鍵渲染路徑"&#xff09;&#xff1a; 構建DOM樹&#xff1a;將HTML解析為DOM&#xff08;文檔對象模型&#xff09;樹構建CSSOM樹&#xff1a;將CSS解析為CSSOM&#xff08;CSS對象模…

基于Spring Boot的成績管理系統后臺實現

下面是一個完整的成績管理系統后臺實現&#xff0c;使用Spring Boot框架&#xff0c;包含學生管理、課程管理和成績管理功能。 1. 項目結構 src/main/java/com/example/grademanagement/ ├── config/ # 配置類 ├── controller/ # 控制器 ├── dto/ …

實現極限網關(INFINI Gateway)配置動態加載

還在停機更新 Gateway 配置&#xff0c;OUT 了。 今天和大家分享一個 Gateway 的功能&#xff1a;動態加載配置&#xff08;也稱熱更新或熱加載&#xff09;。 這個功能可以在 Gateway 不停機的情況下更新配置并使之生效。 配置樣例如下&#xff1a; path.data: data path.…

Mean Shift 圖像分割與 Canny 邊緣檢測教程

1. Mean Shift 簡介 Mean Shift 是一種聚類算法&#xff0c;通過尋找圖像中顏色相似的區域來實現分割。它非常適合用于場景分割或物體檢測等任務。本教程將它與 Canny 邊緣檢測結合&#xff0c;突出分割區域的邊界。 2. 圖像分割流程 我們將按照以下步驟完成圖像分割和邊緣檢…

Day15 -實例 端口掃描工具 WAF識別工具的使用

一、端口掃描工具 1、zenmap 我這里user是漢字名&#xff0c;沒有解析成功。等后續換一個英文賬戶試一試。 魔改kali的nmap nmap -p8000-9000 8.140.159.19 2、masscan cmd啟動&#xff0c;拖入exe文件。然后先寫ip&#xff0c;會報錯給提示 尋路犬系統 我們去找一下他的…

如何解決高并發場景下的性能瓶頸?實踐分享

解決高并發性能瓶頸的核心方法包括優化系統架構、合理使用緩存技術、數據庫優化及擴展策略、負載均衡設計。 其中&#xff0c;優化系統架構是根本解決性能問題的關鍵所在。良好的系統架構能夠有效支撐業務高效穩定運行&#xff0c;避免性能瓶頸帶來的損失。企業可通過微服務架構…

自動駕駛背后的數學:ReLU,Sigmoid, Leaky ReLU, PReLU,Swish等激活函數解析

隨著自動駕駛技術的飛速發展&#xff0c;深度學習在其中扮演著至關重要的角色。而激活函數作為神經網絡中的關鍵組件&#xff0c;直接影響著模型的性能和效果。前面幾篇博客 自動駕駛背后的數學&#xff1a;特征提取中的線性變換與非線性激活 , 「自動駕駛背后的數學&#xff1…

性能測試、負載測試、壓力測試的全面解析

在軟件測試領域&#xff0c;性能測試、負載測試和壓力測試是評估系統穩定性和可靠性的關鍵手段。?它們各自關注不同的測試目標和應用場景&#xff0c;理解這些差異對于制定有效的測試策略至關重要。 本文對性能測試、負載測試和壓力測試進行深入分析&#xff0c;探討其定義、…

責任鏈模式-java

1、spring依賴注入模式 @Configuration public class ChainConfig {@Beanpublic ChainSpringFactory chainSpringFactory(List<IHandler<DemoOne,Boolean>> handlerList){return new ChainSpringFactory(handlerList);}} public class DemoOne { }public abstract…

學習本地部署DeepSeek的過程(基于LM Studio)

除了使用Ollama部署DeepSeek&#xff0c;還可以使用LM Studio部署DeepSeek&#xff0c;后者是一款允許用戶在本地計算機上運行大型語言模型&#xff08;LLMs&#xff09;的桌面應用程序&#xff0c;旨在簡化本地模型的使用&#xff0c;無需云端連接或復雜配置即可體驗 AI 功能。…

CSS 尺寸 (Dimension)

CSS 尺寸 (Dimension) 在網頁設計中&#xff0c;CSS&#xff08;層疊樣式表&#xff09;的尺寸屬性是控制元素大小和位置的關鍵。本文將詳細介紹CSS尺寸相關的概念、屬性及其應用。 1. CSS 尺寸概述 CSS尺寸主要包括寬度和高度&#xff0c;這些屬性可以應用于各種HTML元素&a…

【自學筆記】ELK基礎知識點總覽-持續更新

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 ELK基礎知識點總覽1. ELK簡介2. Elasticsearch基礎Elasticsearch配置示例&#xff08;elasticsearch.yml&#xff09; 3. Logstash基礎Logstash配置示例&#xff08…

等差數列公式推導

前言&#xff1a; 通過實踐而發現真理&#xff0c;又通過實踐而證實真理和發展真理。從感性認識而能動地發展到理性認識&#xff0c;又從理性認識而能動地指導革命實踐&#xff0c;改造主觀世界和客觀世界。實踐、認識、再實踐、再認識&#xff0c;這種形式&#xff0c;循環往…

【MySQL】用戶賬戶、角色、口令、PAM

目錄 查看用戶賬戶設置 連接 1.本地連接 2.遠程連接 賬戶 角色 操作用戶賬戶和角色 配置口令和賬戶有效期限 手工使口令過期 配置口令有效期限 PAM身份驗證插件 客戶端連接&#xff1a;使用 PAM 賬戶登錄 在連接到MySQL服務器并執行查詢時&#xff0c;會驗證你的身…

5種生成模型(VAE、GAN、AR、Flow 和 Diffusion)的對比梳理 + 易懂講解 + 代碼實現

目錄 1 變分自編碼器&#xff08;VAE&#xff09;? 1.1 概念 1.2 訓練損失 1.3 VAE 的實現 2 生成對抗網絡&#xff08;GAN&#xff09;? 2.1 概念 2.2 訓練損失 a. 判別器的損失函數 b. 生成器的損失函數 c. 對抗訓練的動態過程 2.3 GAN 的實現 3 自回歸模型&am…

印刷電路板 (PCB) 的影響何時重要?在模擬環境中導航

我和我的同事們經常被問到關于 PCB 效應的相同問題&#xff0c;例如&#xff1a; 仿真何時需要 PCB 效果&#xff1f; 為什么時域仿真需要 PCB 效應&#xff1f; 當 PCB 效應必須包含在仿真中時&#xff0c;頻率是否重要&#xff1f; 設計人員應該在多大程度上關注 VRM 模型中包…