RK3568DAYU開發板-平臺驅動開發:I2C驅動(原理、源碼、案例分析)

1、程序介紹

本程序是基于OpenHarmony標準系統編寫的平臺驅動案例:I2C

系統版本:openharmony5.0.0

開發板:dayu200

編譯環境:ubuntu22

部署路徑: //sample/04_platform_i2c

2、基礎知識

2.1、I2C簡介

I2C(Inter Integrated Circuit)總線是由Philips公司開發的一種簡單、雙向二線制同步串行總線。由于其硬件連接簡單、成本低廉,因此被廣泛應用于各種短距離通信的場景

I2C以主從方式工作,通常有一個主設備和一個或者多個從設備,主從設備通過SDA(SerialData)串行數據線以及SCL(SerialClock)串行時鐘線兩根線相連(如下圖)。

I2C數據的傳輸必須以一個起始信號作為開始條件,以一個結束信號作為傳輸的停止條件。數據傳輸以字節為單位,高位在前,逐個bit進行傳輸。

I2C總線上的每一個設備都可以作為主設備或者從設備,而且每一個設備都會對應一個唯一的地址,當主設備需要和某一個從設備通信時,通過廣播的方式,將從設備地址寫到總線上,如果某個從設備符合此地址,將會發出應答信號,建立傳輸。

I2C接口定義了完成I2C傳輸的通用方法集合,包括:

  • I2C控制器管理:打開或關閉I2C控制器

  • I2C消息傳輸:通過消息傳輸結構體數組進行自定義傳輸

I2C物理連線示意圖

在這里插入圖片描述

2.2、I2C驅動開發

I2C模塊各分層的作用為:

  • 接口層:提供打開設備,數據傳輸以及關閉設備的能力。
  • 核心層:主要負責服務綁定、初始化以及釋放管理器,并提供添加、刪除以及獲取控制器的能力。
  • 適配層:由驅動適配者實現與硬件相關的具體功能,如控制器的初始化等。

在這里插入圖片描述

2.2.1、I2C驅動開發接口

為了保證上層在調用I2C接口時能夠正確的操作硬件,核心層在//drivers/hdf_core/framework/support/platform/include/i2c/i2c_core.h中定義了以下鉤子函數。驅動適配者需要在適配層實現這些函數的具體功能,并與這些鉤子函數掛接,從而完成接口層與核心層的交互。

I2cMethod和I2cLockMethod定義:

struct I2cMethod {int32_t (*transfer)(struct I2cCntlr *cntlr, struct I2cMsg *msgs, int16_t count);
};struct I2cLockMethod { // 鎖機制操作結構體int32_t (*lock)(struct I2cCntlr *cntlr);void (*unlock)(struct I2cCntlr *cntlr);
};

在適配層中,I2cMethod必須被實現,I2cLockMethod可根據實際情況考慮是否實現。核心層提供了默認的I2cLockMethod,其中使用mutex作為保護臨界區的鎖:

static int32_t I2cCntlrLockDefault(struct I2cCntlr *cntlr)
{if (cntlr == NULL) {return HDF_ERR_INVALID_OBJECT;}return OsalMutexLock(&cntlr->lock);
}static void I2cCntlrUnlockDefault(struct I2cCntlr *cntlr)
{if (cntlr == NULL) {return;}(void)OsalMutexUnlock(&cntlr->lock);
}static const struct I2cLockMethod g_i2cLockOpsDefault = {.lock = I2cCntlrLockDefault,.unlock = I2cCntlrUnlockDefault,
};

若實際情況不允許使用mutex(例如使用者可能在中斷上下文調用I2C接口,mutex可能導致休眠,而中斷上下文不允許休眠)時,驅動適配者可以考慮使用其他類型的鎖來實現一個自定義的I2cLockMethod。一旦實現了自定義的I2cLockMethod,默認的I2cLockMethod將被覆蓋。

I2cMethod結構體成員函數功能說明:

函數成員入參出參返回值功能
transfercntlr:結構體指針,核心層I2C控制器。 msgs:結構體指針,用戶消息。 count:uint16_t,消息數量。HDF_STATUS相關狀態傳遞用戶消息

I2cLockMethod結構體成員函數功能說明:

函數成員入參出參返回值功能
lockcntlr:結構體指針,核心層I2C控制器。HDF_STATUS相關狀態獲取臨界區鎖
unlockcntlr:結構體指針,核心層I2C控制器。HDF_STATUS相關狀態釋放臨界區鎖
2.2.2、I2C驅動開發步驟

I2C模塊適配HDF框架包含以下四個步驟:

  • 實例化驅動入口。
  • 配置屬性文件。
  • 實例化I2C控制器對象。
  • 驅動調試。

2.3、I2C應用開發

2.3.1、接口說明

I2C模塊提供的主要接口如表1所示,具體API詳見//drivers/hdf_core/framework/include/platform/i2c_if.h。

I2C驅動API接口功能介紹如下所示:

接口名接口描述
DevHandle I2cOpen(int16_t number)打開I2C控制器
void I2cClose(DevHandle handle)關閉I2C控制器
int32_t I2cTransfer(DevHandle handle, struct I2cMsg *msgs, int16_t count)自定義傳輸

(1)I2cOpen

在進行I2C通信前,首先要調用I2cOpen打開I2C控制器。

DevHandle I2cOpen(int16_t number);

I2cOpen參數定義如下:

參數參數描述
numberI2C控制器號

I2cOpen返回值定義如下:

返回值返回值描述
NULL打開I2C控制器失敗
設備句柄打開的I2C控制器設備句柄

假設系統中存在8個I2C控制器,編號從0到7,以下代碼示例為獲取3號控制器:

DevHandle i2cHandle = NULL;  /* I2C控制器句柄 //* 打開I2C控制器 */
i2cHandle = I2cOpen(3);
if (i2cHandle == NULL) {HDF_LOGE("I2cOpen: failed\n");return;
}

(2)I2cClose

I2C通信完成之后,需要關閉I2C控制器。

void I2cClose(DevHandle handle); 

I2cClose參數定義如下:

參數參數描述
handleI2C控制器設備句柄

(3)I2cTransfer

i2c消息傳輸。

int32_t I2cTransfer(DevHandle handle, struct I2cMsg \*msgs, int16_t count);

I2cTransfer參數定義如下:

參數參數描述
handleI2C控制器設備句柄
msgs待傳輸數據的消息結構體數組
count消息數組長度

I2cTransfer返回值定義如下:

返回值返回值描述
正整數成功傳輸的消息結構體數目
負數執行失敗

I2C傳輸消息類型為I2cMsg,每個傳輸消息結構體表示一次讀或寫,通過一個消息數組,可以執行若干次的讀寫組合操作。組合讀寫示例:

int32_t ret;
uint8_t wbuff[2] = { 0x12, 0x13 };
uint8_t rbuff[2] = { 0 };
struct I2cMsg msgs[2]; /* 自定義傳輸的消息結構體數組 */
msgs[0].buf = wbuff;    /* 寫入的數據 */
msgs[0].len = 2;        /* 寫入數據長度為2 */
msgs[0].addr = 0x5A;    /* 寫入設備地址為0x5A */
msgs[0].flags = 0;      /* 傳輸標記為0,默認為寫 */
msgs[1].buf = rbuff;    /* 要讀取的數據 */
msgs[1].len = 2;        /* 讀取數據長度為2 */
msgs[1].addr = 0x5A;    /* 讀取設備地址為0x5A */
msgs[1].flags = I2C_FLAG_READ /* I2C_FLAG_READ置位 */
/* 進行一次自定義傳輸,傳輸的消息個數為2 */
ret = I2cTransfer(i2cHandle, msgs, 2);
if (ret != 2) {HDF_LOGE("I2cTransfer: failed, ret %d\n", ret);return;
}
2.2.2、開發流程

使用I2C設備的一般流程如下圖所示:

在這里插入圖片描述

3、程序解析

3.1、源碼目錄

在這里插入圖片描述

3.2、接口流程梳理

  • I2cOpen執行流程
//drivers\hdf_core\framework\support\platform\src\i2c\i2c_if.c
DevHandle I2cOpen(int16_t number)
|-->return (DevHandle)I2cCntlrGet(number);|-->return I2cManagerFindCntlr(number);|-->struct I2cCntlr *cntlr = g_i2cManager->cntlrs[number];|-->return cntlr
  • I2cTransfer執行流程
//drivers\hdf_core\framework\support\platform\src\i2c\i2c_if.c
int32_t I2cTransfer(DevHandle handle, struct I2cMsg *msgs, int16_t count)
|-->return I2cCntlrTransfer((struct I2cCntlr *)handle, msgs, count);|-->return cntlr->ops->transfer(cntlr, msgs, count);

由上可見設備節點由全局變量g_i2cManager提供,此變量由下文中平臺驅動linux_i2c_adapter(drivers\hdf_core\adapter\khdf\linux\platform\i2c\i2c_adapter.c)進行設置。

3.3、平臺驅動說明

  • 驅動實例化驅動入口

I2C控制器會出現很多個設備掛接的情況,因而在HDF框架中首先會為此類型的設備創建一個管理器對象,并同時對外發布一個管理器服務來統一處理外部訪問。這樣,用戶需要打開某個設備時,會先獲取到管理器服務,然后管理器服務根據用戶指定參數查找到指定設備

I2C管理器服務的驅動由核心層實現,驅動適配者不需要關注這部分內容的實現,但在實現Init函數的時候需要調用核心層的I2cCntlrAdd函數,它會實現相應功能。

I2C驅動入口開發參考:

struct HdfDriverEntry g_i2cLinuxDriverEntry = {.moduleVersion = 1,.Bind = LinuxI2cBind,.Init = LinuxI2cInit,.Release = LinuxI2cRelease,.moduleName = "linux_i2c_adapter",		// 【必要且與device_info.hcs文件里面匹配】
};
HDF_INIT(g_i2cLinuxDriverEntry);			// 調用HDF_INIT將驅動入口注冊到HDF框架中/* 核心層i2c_core.c管理器服務的驅動入口 */
struct HdfDriverEntry g_i2cManagerEntry = {.moduleVersion = 1,.Bind = I2cManagerBind,.Init = I2cManagerInit,.Release = I2cManagerRelease,.moduleName = "HDF_PLATFORM_I2C_MANAGER", // 這與device_info.hcs文件中device0對應
};
HDF_INIT(g_i2cManagerEntry);
  • 配置屬性文件

deviceNode信息與驅動入口注冊相關,器件屬性值對于驅動適配者的驅動實現以及核心層I2cCntlr相關成員的默認值或限制范圍有密切關系。

統一服務模式的特點是device_info.hcs文件中第一個設備節點必須為I2C管理器,其各項參數如下所示:

成員名
moduleName固定為HDF_PLATFORM_I2C_MANAGER
serviceName固定為HDF_PLATFORM_I2C_MANAGER
policy具體配置為1或2取決于是否對用戶態可見
deviceMatchAttr沒有使用,可忽略

從第二個節點開始配置具體I2C控制器信息,此節點并不表示某一路I2C控制器,而是代表一個資源性質設備,用于描述一類I2C控制器的信息。多個控制器之間相互區分的參數是busId和reg_pbase,這在i2c_config.hcs文件中有所體現。如下:

//vendor/hihope/rk3568/hdf_config/khdf/device_info/device_info.hcs已定義好,具體如下:

在這里插入圖片描述

注意:

  • device1是rk3568原有的配置,也是我們需要的,作為OpenHarmony的i2c配置。
  • moduleName定義為linux_i2c_adapter,表示該節點對應于//drivers/hdf_core/adapter/khdf/linux/platform/i2c/i2c_adapter.c,該驅動是對接Linux i2c子系統。

在//vendor/hihope/rk3568/hdf_config/khdf/platform/i2c_config.hcs,具體內容如下:

在這里插入圖片描述

注意:

  • controller_0x120b2000是為i2c2準備的。
  • bus用于確定Linux i2c控制器序號。

具體執行流程如下:

//drivers\hdf_core\adapter\khdf\linux\platform\i2c\i2c_adapter.c
// 定義I2cMethod結構體變量g_method,實現i2c相應接口
static struct I2cMethod g_method = {.transfer = LinuxI2cTransfer,
};
static int32_t LinuxI2cInit(struct HdfDeviceObject *device)
|-->struct I2cCntlr *cntlr = (struct I2cCntlr *)OsalMemCalloc(sizeof(*cntlr));//為I2cCntlr對象分配內存
|-->cntlr->ops = &g_method;//分配i2c相應接口
|-->ret = I2cCntlrAdd(cntlr);//添加新創建的I2cCntlr對象到全局變量g_i2cManager中|-->ret = I2cManagerAddCntlr(cntlr);|-->manager->cntlrs[cntlr->busId] = cntlr;

由HDF驅動框架通過init和bind調用此驅動入口,注冊之后,下一步就是以核心層I2cCntlr對象的初始化為核心,包括驅動適配者自定義結構體(傳遞參數和數據),實例化I2cCntlr成員I2cMethod(讓用戶可以通過接口來調用驅動底層函數),實現HdfDriverEntry成員函數(Bind,Init,Release)。

3.4、應用程序

3.4.1、i2c_test.c

i2c相關頭文件如下所示:

#include "i2c_if.h"                 // i2c標準接口頭文件

主函數負責i2c讀寫操作。

其中,讀操作源代碼具體如下:

int main(int argc, char* argv[])
{DevHandle handle = NULL;int32_t ret = 0;struct I2cMsg msgs[2];      // 消息結構體數組int16_t msgs_count = 0;uint8_t wbuff[STRING_MAXSIZE] = { 0 };uint8_t rbuff[STRING_MAXSIZE] = { 0 };// 解析參數......// 打開i2c控制器handle = I2cOpen(m_i2c_number);if (handle == NULL) {PRINT_ERROR("I2cOpen failed\n");return -1;}if (m_i2c_flags_read == 1) {// 讀操作// 設置msgs數組有效數目msgs_count = 2;// 初始化msgs[0],該部分為主設備發送從設備的i2c內容msgs[0].addr = m_i2c_slave_address;msgs[0].flags = toI2cFlags(0, m_i2c_flags_addr_10bit, m_i2c_flags_read_no_ack, m_i2c_flags_ignore_no_ack, m_i2c_flags_no_start, m_i2c_flags_stop);msgs[0].len = 1;wbuff[0] = m_i2c_reg_address;           // 本案例的i2c從設備是第1字節是寄存器地址msgs[0].buf = wbuff;// 初始化msgs[1],該部分為主設備讀取從設備發送的i2c內容msgs[1].addr = m_i2c_slave_address;msgs[1].flags = toI2cFlags(1, m_i2c_flags_addr_10bit, m_i2c_flags_read_no_ack, m_i2c_flags_ignore_no_ack, m_i2c_flags_no_start, m_i2c_flags_stop);msgs[1].len = m_i2c_read_data_length;msgs[1].buf = rbuff;// i2c數據傳輸,傳輸次數為2次ret = I2cTransfer(handle, msgs, msgs_count);if (ret != msgs_count) {PRINT_ERROR("I2cTransfer(read) failed and ret = %d\n", ret);goto out;}printf("I2cTransfer success and read data length = %d\n", strlen((char *)rbuff));for (uint32_t i = 0; i < strlen((char *)rbuff); i++) {printf("rbuff[%d] = 0x%x\n", i, rbuff[i]);}} else {......}out:// 關閉i2c控制器I2cClose(handle);return ret;
}

寫操作源代碼如下所示:

int main(int argc, char* argv[])
{DevHandle handle = NULL;int32_t ret = 0;struct I2cMsg msgs[2];      // 消息結構體數組int16_t msgs_count = 0;uint8_t wbuff[STRING_MAXSIZE] = { 0 };uint8_t rbuff[STRING_MAXSIZE] = { 0 };// 解析參數......// 打開i2c控制器handle = I2cOpen(m_i2c_number);if (handle == NULL) {PRINT_ERROR("I2cOpen failed\n");return -1;}if (m_i2c_flags_read == 1) {......} else {// 寫操作// 設置msgs數組有效數目msgs_count = 1;// 初始化msgs[0],該部分為主設備發送從設備的i2c內容msgs[0].addr = m_i2c_slave_address;msgs[0].flags = toI2cFlags(0, m_i2c_flags_addr_10bit, m_i2c_flags_read_no_ack, m_i2c_flags_ignore_no_ack, m_i2c_flags_no_start, m_i2c_flags_stop);msgs[0].len = 2;wbuff[0] = m_i2c_reg_address;       // 本案例的i2c從設備是第1字節是寄存器地址wbuff[1] = m_i2c_reg_value;         // 本案例的i2c從設備是第2字節是寄存器數值msgs[0].buf = wbuff;// i2c數據傳輸,傳輸次數為2次ret = I2cTransfer(handle, msgs, msgs_count);if (ret != msgs_count) {PRINT_ERROR("I2cTransfer(write) failed and ret = %d\n", ret);goto out;}printf("I2cTransfer success and write reg(%d), data(%d)\n", m_i2c_reg_address, m_i2c_reg_value);}out:// 關閉i2c控制器I2cClose(handle);return ret;
}
3.4.2、BUILD.gn

編寫應用程序的BUILD.gn,具體內容如下:

import("//build/ohos.gni")
import("//drivers/hdf_core/adapter/uhdf2/uhdf.gni")print("samples: compile rk3568_i2c_test")
ohos_executable("rk3568_i2c_test") {sources = [ "i2c_test.c" ]include_dirs = ["$hdf_framework_path/include","$hdf_framework_path/include/core","$hdf_framework_path/include/osal","$hdf_framework_path/include/platform","$hdf_framework_path/include/utils","$hdf_uhdf_path/osal/include","$hdf_uhdf_path/ipc/include","//base/hiviewdfx/hilog/interfaces/native/kits/include","//third_party/bounds_checking_function/include",]deps = ["$hdf_uhdf_path/platform:libhdf_platform","$hdf_uhdf_path/utils:libhdf_utils","//base/hiviewdfx/hilog/interfaces/native/innerkits:libhilog",]cflags = ["-Wall","-Wextra","-Werror","-Wno-format","-Wno-format-extra-args",]part_name = "rk3568_i2c_test"install_enable = true
}
3.4.3、bundle.json

編寫應用程序的bundle.json,具體內容如下:

{"name": "@ohos/i2c_test","description": "rk3568_i2c_test example.","version": "3.1","license": "Apache License 2.0","publishAs": "code-segment","segment": {"destPath": "sample/04_platform_i2c"},"dirs": {},"scripts": {},"component": {"name": "rk3568_i2c_test","subsystem": "sample","syscap": [],"features": [],"adapted_system_type": ["mini","small","standard"],"rom": "10KB","ram": "10KB","deps": {"components": ["hdf_core","hilog"],"third_party": []},"build": {"sub_component": ["//sample/04_platform_i2c:rk3568_i2c_test"],"inner_kits": [],"test": []}}
}

4、程序編譯

sudo ./build.sh --product-name rk3568 --build-target rk3568_i2c_test

5、運行結果

通過i2cdetect命令查看發現I2C 5中包含地址為0x15的設備,所以直接通過此設備進行測試了。

在i2c調試過程中,OpenHarmony還提供Linux i2c-tools工具,具體使用方法可以參考這篇。
在這里插入圖片描述

運行如下:

在這里插入圖片描述

上述命令為:查看i2c 5控制器,從設備地址21(即0x15,該地址為開發板外接i2c芯片),讀取寄存器地址0,數據長度為3。

6.參考資料

  • I2C平臺驅動開發
  • I2C應用程序開發
  • OpenHarmony平臺驅動案例–I2C

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

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

相關文章

在UniApp中開發微信小程序實現圖片、音頻和視頻下載功能

隨著微信小程序的迅猛發展&#xff0c;越來越多的開發者選擇通過UniApp框架來進行跨平臺應用開發。UniApp能夠讓開發者在一個代碼庫中同時發布iOS、Android和小程序等多平臺應用。而在實際開發過程中&#xff0c;很多應用都需要實現一些常見的下載功能&#xff0c;例如圖片、音…

鴻蒙5.0項目開發——接入有道大模型翻譯

鴻蒙5.0項目開發——接入有道大模型翻譯 【高心星出品】 項目效果圖 項目功能 文本翻譯功能 支持文本輸入和翻譯結果顯示 使用有道翻譯API進行翻譯 支持自動檢測語言&#xff08;auto&#xff09; 支持雙向翻譯&#xff08;源語言和目標語言可互換&#xff09; 文本操作…

Vim 中設置插入模式下輸入中文

在 Vim 中設置插入模式下輸入中文需要配置輸入法切換和 Vim 的相關設置。以下是詳細步驟&#xff1a; 1. 確保系統已安裝中文輸入法 在 Linux 系統中&#xff0c;常用的中文輸入法有&#xff1a; IBus&#xff08;推薦&#xff09;&#xff1a;支持拼音、五筆等Fcitx&#xf…

湖北理元理律師事務所:債務優化中的“生活錨點”設計

在債務重組領域&#xff0c;一個常被忽視的核心矛盾是&#xff1a;還款能力與生存需求的沖突。過度壓縮生活支出還債&#xff0c;可能導致收入中斷&#xff1b;放任債務膨脹&#xff0c;又加劇精神壓力。湖北理元理律師事務所通過“三步平衡法”&#xff0c;嘗試在法理框架內破…

Prometheus + Grafana 監控常用服務

一、引言 Prometheus監控常見服務的原理主要包括服務暴露指標和Prometheus抓取指標。一方面&#xff0c;被監控服務通過自身提供的監控接口或借助Exporter將服務的性能指標等數據以HTTP協議的方式暴露出來&#xff1b;另一方面&#xff0c;Prometheus根據配置好的采集任務&…

基于YOLOv8 的分類道路目標系統-PyTorch實現

本文源碼: https://download.csdn.net/download/shangjg03/90873939 1. 引言 在智能交通和自動駕駛領域,道路目標分類是一項關鍵技術。通過對攝像頭捕獲的圖像或視頻中的目標進行分類識別,可以幫助車輛或系統理解周圍環境,做出更安全的決策。本教程將介紹如何使用 PyTorch …

知識圖譜:AI時代語義認知的底層重構邏輯

在生成式人工智能&#xff08;GEO&#xff09;的技術架構中&#xff0c;知識圖譜已從輔助性工具演變為驅動機器認知的核心神經中樞。它通過結構化語義網絡的重構&#xff0c;正在突破傳統數據處理的線性邏輯&#xff0c;建立機器對復雜業務場景的深度理解能力。 一、語義解構&a…

如何使用 Python 的膠水語言特性

Python 作為“膠水語言”最核心的特性在于&#xff1a;跨語言集成能力強、支持豐富的 C/C 擴展模塊、嵌入式調用簡便、適配多種數據交換格式、擁有強大的封裝能力。其中&#xff0c;Python 對 C/C 模塊的快速封裝能力&#xff0c;使其能夠將底層高性能庫暴露為易用接口&#xf…

[網頁五子棋][匹配模塊]服務器開發、用戶管理器(創建匹配請求/響應對象、處理連接成功、處理下線)

文章目錄 MatchAPI 類用戶管理器創建匹配請求/響應對象處理連接成功—afterConnectionEstablished處理下線——handleTransportError/afterConnectionClosed MatchAPI 類 創建 api.MatchAPI&#xff0c;繼承自 TextWebSocketHandler 作為處理 WebSocket 請求的入口類 準備好一…

軟件測試的潛力與挑戰:從“質量守門員”到“工程效能催化劑”的進化

1. 潛力&#xff1a;為什么軟件測試的未來比想象中更廣闊&#xff1f; ? 行業趨勢驅動需求爆發 DevOps/持續交付&#xff1a;測試成為流水線的核心環節&#xff0c;自動化能力直接影響發布頻率&#xff08;案例&#xff1a;某頭部互聯網企業日均發布100次&#xff0c;依賴自動…

indel_snp_ssr_primer

好的&#xff0c;我們可以逐步分析這個 Perl 腳本的每個部分。腳本的主要功能是基于給定的 VCF 文件和參考基因組文件&#xff0c;設計引物并進行電子 PCR&#xff08;e-PCR&#xff09;分析。我們將從腳本的頭部和初始化部分開始講解。 第一部分&#xff1a;腳本頭部和初始化…

2.4GHz 射頻前端芯片AT2401C

射頻前端芯片作為無線通信系統的核心組件&#xff0c;涵蓋功率放大器&#xff08;PA&#xff09;、濾波器、開關、低噪聲放大器&#xff08;LNA&#xff09;等關鍵器件&#xff0c;其性能直接影響通信質量、功耗及信號穩定性。 AT2401C是一款面向 Zigbee&#xff0c;無線傳感網…

Batch Normalization[[

error surface如果很崎嶇,那么就代表比較難train,我們有沒有辦法去改變這個landscape呢 可以用batch normalization. 如果 ( x_1 ) 的取值范圍很小&#xff08;如 1, 2&#xff09;&#xff0c;而 ( x_2 ) 的取值范圍很大&#xff08;如 100, 200&#xff09;&#xff0c;那么…

c++結構化綁定

author: hjjdebug date: 2025年 05月 28日 星期三 15:57:58 CST descrip: c結構化綁定: 結構化綁定: 名稱辨析: 名稱叫綁定好還是叫解綁好&#xff1f; 解綁意思是原來是一個整體,現在被分成了若干個部分,所以叫解. 綁定強調的意思是. 被分解的某個變量,綁定到了整體的某個變量…

大數據治理:理論、實踐與未來展望(一)

文章目錄 一、大數據治理的定義與重要性&#xff08;一&#xff09;定義&#xff08;二&#xff09;重要性 二、大數據治理的應用場景&#xff08;一&#xff09;金融行業&#xff08;二&#xff09;醫療行業&#xff08;三&#xff09;制造業&#xff08;四&#xff09;零售行…

AI系統化學習月計劃6月計劃

以下是為技術總監設計的 AI系統化學習月計劃&#xff08;每天投入2小時&#xff0c;共30天&#xff09;&#xff0c;結合戰略思維、技術基礎、實戰應用和行業趨勢&#xff0c;幫助您快速掌握AI的核心知識&#xff0c;并轉化為業務決策能力。 第一周&#xff1a;AI基礎與戰略思維…

詳解MySQL調優

目錄 1. SQL 語句優 1.1 避免低效查詢 1.2 索引優化 1.3 分析執行計劃 2. 數據庫配置優化 2.1 核心參數調整 2.2 表結構與存儲引擎 2.3 存儲引擎選擇 3. 事務與鎖優化 3.1 事務控制 3.2 鎖機制優化 3.3 批量操作優化 4. 其他優化手段 4.1 監控與分析工具 4.2 讀寫…

VScode單雙引號、分號格式

1、settings.json中添加&#xff1a; 1 2 3 "prettier.semi": false, // 取消自動加分號 "prettier.singleQuote": true, // 保持單引號&#xff0c;不自動變雙引號 "prettier.trailingComma": "none" // 去掉結尾的逗號 2、如上一步…

自動駕駛規劃控制教程——不確定環境下的決策規劃

引言:駕馭未知——不確定性下的自動駕駛決策挑戰 自動駕駛汽車 (Autonomous Vehicles, AVs) 的愿景是徹底改變交通運輸的面貌,提高道路安全、提升交通效率、改善駕乘體驗。然而,要將這一愿景安全可靠地付諸實踐,自動駕駛系統必須能夠在復雜、動態且充滿不確定性的真實世界…

電纜中性點概念

電纜中性點概念 電纜中性點(也稱“中性點”或“中性線”)是電力系統和電氣設備中一個非常重要的概念,尤其在三相電系統中。下面是對中性點概念的系統性解釋。 1. 基本定義 中性點:三相電纜(A/B/C相)的電壓矢量交匯點,理想情況下三相平衡時該點電壓為零。對于星形(Y形…