OpenHarmony平臺驅動使用(五),HDMI

OpenHarmony平臺驅動使用(五)


HDMI

概述

功能簡介

HDMI(High Definition Multimedia Interface),即高清多媒體接口,主要用于DVD、機頂盒等音視頻Source到TV、顯示器等Sink設備的傳輸。

HDMI以主從方式工作,通常有一個Source端和一個Sink端。

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

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

  • HDMI啟動/停止傳輸:啟動或停止HDMI傳輸。

  • HDMI控制器設置:設置音頻、視頻及HDR屬性,設置色彩深度、聲音圖像消隱等。

  • HDMI讀取EDID:讀取Sink端原始的EDID數據。

  • HDMI熱插拔:注冊/注銷熱插拔回調函數。

基本概念

HDMI是Hitachi、Panasonic、Philips、Silicon Image、Sony、Thomson、Toshiba共同發布的一款音視頻傳輸協議。傳輸過程遵循TMDS(Transition Minimized Differential Signaling)協議。

  • TMDS(Transition Minimized Differential signal):過渡調制差分信號,也被稱為最小化傳輸差分信號,用于發送音頻、視頻及各種輔助數據。

  • DDC(Display Data Channel):顯示數據通道,發送端與接收端可利用DDC通道得知彼此的發送與接收能力,但HDMI僅需單向獲知接收端(顯示器)的能力。

  • CEC(Consumer Electronics Control):消費電子控制,該功能應該能夠在連接HDMI的發送設備與接收設備之間實現交互操作。

  • FRL(Fixed Rate Link):TMDS 的架構進行訊號傳輸時,最高帶寬可達 18Gbps,而FRL模式的帶寬則提升到48 Gbps。

  • HDCP(High-bandwidth Digital Content Protection):即高帶寬數字內容保護技術,當用戶對高清晰信號進行非法復制時,該技術會進行干擾,降低復制出來的影像的質量,從而對內容進行保護。

  • EDID(Extended Display Identification Data):擴展顯示標識數據,通常存儲在顯示器的固件中,標識供應商信息、EDID版本信息、最大圖像大小、顏色設置、廠商預設置、頻率范圍的限制以及顯示器名和序列號的字符串。

運作機制

在HDF框架中,HDMI模塊接口適配模式擬采用獨立服務模式,如圖1所示。在這種模式下,每一個設備對象會獨立發布一個設備服務來處理外部訪問,設備管理器收到API的訪問請求之后,通過提取該請求的參數,達到調用實際設備對象的相應內部方法的目的。獨立服務模式可以直接借助HDF設備管理器的服務管理能力,但需要為每個設備單獨配置設備節點,增加內存占用。

獨立服務模式下,核心層不會統一發布一個服務供上層使用,因此這種模式下驅動要為每個控制器發布一個服務,具體表現為:

  • 驅動適配者需要實現HdfDriverEntry的Bind鉤子函數以綁定服務。

  • device_info.hcs文件中deviceNode的policy字段為1或2,不能為0。

圖 1 HDMI獨立服務模式結構圖

HDMI獨立服務模式結構圖

HDMI模塊各分層作用:

  • 接口層提供打開HDMI設備、啟動HDMI傳輸、停止HDMI傳輸、聲音圖像消隱設置、設置色彩深度、獲取色彩深度、設置視頻屬性、獲取視頻屬性、設置HDR屬性、讀取Sink端原始EDID數據、注冊HDMI熱插拔檢測回調函數、注銷HDMI熱插拔檢測回調函數、關閉HDMI設備的接口。

  • 核心層主要提供HDMI控制器的打開、關閉及管理的能力,通過鉤子函數與適配層交互。

  • 適配層主要是將鉤子函數的功能實例化,實現具體的功能。

HDMI的Source端提供+5V和GND,用于DDC和CEC通信。通過DDC通道,Source端可以讀取Sink端的各項參數,如接受能力等;CEC為可選通道,用于同步Source端與Sink端的控制信號,改善用戶體驗。TMDS通道有四組差分信號,TMDS Clock Channel為TMDS提供時鐘信號,其余三組傳輸音視頻數據及各種輔助數據;HDP為熱插拔檢測端口,當有Sink端接入時,Source端會通過中斷服務程序進行響應。

HDMI物理連接如圖2所示:

圖 2 HDMI物理連線示意圖

HDMI物理連線示意圖

約束與限制

HDMI模塊當前僅支持輕量和小型系統內核(LiteOS),暫無實際適配驅動 。

使用指導

場景介紹

HDMI具有體積小,傳輸速率高,傳輸帶寬寬,兼容性好,能同時傳輸無壓縮音視頻信號等優點。與傳統的全模擬接口相比,HDMI不但增加了設備間接線的便捷性,還提供了一些HDMI特有的智能化功能,可用于小體積設備進行高質量音視頻傳輸的場景。

接口說明

HDMI模塊提供的主要接口如下所示,具體API詳見。

表 1 HDMI驅動API接口功能介紹

接口名描述
HdmiOpen打開HDMI控制器
HdmiClose關閉HDMI控制器
HdmiStart啟動HDMI傳輸
HdmiStop停止HDMI傳輸
HdmiAvmuteSet聲音圖像消隱設置
HdmiDeepColorSet設置色彩深度
HdmiDeepColorGet獲取色彩深度
HdmiSetVideoAttribute設置視頻屬性
HdmiSetAudioAttribute設置音頻屬性
HdmiSetHdrAttribute設置HDR屬性
HdmiReadSinkEdid讀取Sink端原始EDID數據
HdmiRegisterHpdCallbackFunc注冊HDMI熱插拔檢測回調函數
HdmiUnregisterHpdCallbackFunc注銷HDMI熱插拔檢測回調函數

開發步驟

使用HDMI設備的一般流程如圖3所示。

圖 3 HDMI設備使用流程圖

HDMI設備使用流程圖

打開HDMI控制器

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

DevHandle HdmiOpen(int16_t number);

表 2 HdmiOpen參數和返回值描述

參數參數描述
numberint16_t類型,HDMI控制器號
返回值返回值描述
NULL打開HDMI控制器失敗
控制器句柄打開的HDMI控制器句柄

假設系統中存在2個HDMI控制器,編號從0到1,以下代碼示例為獲取0號控制器:

DevHandle hdmiHandle = NULL;  // HDMI控制器句柄// 打開HDMI控制器
hdmiHandle = HdmiOpen(0);
if (hdmiHandle == NULL) {HDF_LOGE("HdmiOpen: hdmi open fail!\n");return NULL;
}
注冊熱插拔檢測回調函數
int32_t HdmiRegisterHpdCallbackFunc(DevHandle handle, struct HdmiHpdCallbackInfo *callback);

表 3 HdmiRegisterHpdCallbackFunc參數和返回值描述

參數參數描述
handleDevHandle類型,HDMI控制器句柄
callback結構體指針,熱插拔回調函數信息
返回值返回值描述
HDF_SUCCESS注冊成功
負數注冊失敗

注冊熱插拔檢測回調函數示例:

// 熱插拔檢測回調函數定義
static void HdmiHpdHandle(void *data, bool hpd)
{if (data == NULL) {HDF_LOGE("priv data is NULL");return;}if (hpd == true) {HDF_LOGD("HdmiHpdHandle: hot plug");// 調用者添加相關處理} else {HDF_LOGD("HdmiHpdHandle: hot unplug");// 調用者添加相關處理}
}// 熱插拔檢測回調函數注冊示例
struct HdmiHpdCallbackInfo info = {0};
info.data = handle;
info.callbackFunc = HdmiHpdHandle;
ret = HdmiRegisterHpdCallbackFunc(hdmiHandle, info);
if (ret != HDF_SUCCESS) {HDF_LOGE("HdmiRegisterHpdCallbackFunc: Register hpd callback func fail, ret:%d", ret);return ret;
}
讀取EDID
int32_t HdmiReadSinkEdid(DevHandle handle, uint8_t *buffer, uint32_t len);

表 4 HdmiReadSinkEdid參數和返回值描述

參數參數描述
handleDevHandle類型,HDMI控制器句柄
bufferuint8_t類型指針,數據緩沖區
lenuint32_t類型,數據長度
返回值返回值描述
正整數成功讀取的原始EDID數據
負數或0讀取失敗

讀取Sink端的原始EDID數據示例:

int32_t len;
uint8_t edid[HDMI_EDID_MAX_LEN] = {0};len = HdmiReadSinkEdid(hdmiHandle, edid, HDMI_EDID_MAX_LEN);
if (len <= 0) {HDF_LOGE("HdmiReadSinkEdid: hdmi read sink edid fail, len = %d.", len);return HDF_FAILURE;
}
設置音頻屬性
int32_t HdmiSetAudioAttribute(DevHandle handle, struct HdmiAudioAttr *attr);

表 5 HdmiSetAudioAttribute參數和返回值描述

參數參數描述
handleDevHandle類型,HDMI控制器句柄
attr結構體指針,音頻屬性
返回值返回值描述
HDF_SUCCESS設置成功
負數設置失敗

設置音頻屬性示例:

struct HdmiAudioAttr audioAttr = {0};
int32_t ret;audioAttr.codingType = HDMI_AUDIO_CODING_TYPE_MP3;
audioAttr.ifType = HDMI_AUDIO_IF_TYPE_I2S;
audioAttr.bitDepth = HDMI_ADIO_BIT_DEPTH_16;
audioAttr.sampleRate = HDMI_SAMPLE_RATE_8K;
audioAttr.channels = HDMI_AUDIO_FORMAT_CHANNEL_3;
ret = HdmiSetAudioAttribute(handle, &audioAttr);
if (ret != HDF_SUCCESS) {HDF_LOGE("HdmiSetAudioAttribute: hdmi set audio attribute fail!, ret:%d", ret);return ret;
}
設置視頻屬性
int32_t HdmiSetVideoAttribute(DevHandle handle, struct HdmiVideoAttr *attr);

表 6 HdmiSetVideoAttribute參數和返回值描述

參數參數描述
handleDevHandle類型,HDMI控制器句柄
attr結構體指針,視頻屬性
返回值返回值描述
HDF_SUCCESS設置成功
負數設置失敗

設置視頻屬性示例:

struct HdmiVideoAttr videoAttr = {0};
int32_t ret;videoAttr.colorSpace = HDMI_COLOR_SPACE_YCBCR444;
videoAttr.colorimetry = HDMI_COLORIMETRY_EXTENDED;
videoAttr.extColorimetry = HDMI_EXTENDED_COLORIMETRY_BT2020_CONST_LUM;
videoAttr.quantization = HDMI_QUANTIZATION_RANGE_FULL;
ret = HdmiSetVideoAttribute(handle, &videoAttr);
if (ret != HDF_SUCCESS) {HDF_LOGE("HdmiSetVideoAttribute: hdmi set video attribute fail, ret:%d.", ret);return ret;
}
設置HDR屬性
int32_t HdmiSetHdrAttribute(DevHandle handle, struct HdmiHdrAttr *attr);

表 7 HdmiSetHdrAttribute參數和返回值描述

參數參數描述
handleDevHandle類型,HDMI控制器句柄
attr結構體指針,HDR屬性
返回值返回值描述
HDF_SUCCESS設置成功
負數設置失敗

設置HDR屬性示例:

struct HdmiHdrAttr hdrAttr = {0};
int32_t ret;hdrAttr.mode = HDMI_HDR_MODE_CEA_861_3;
hdrAttr.userMode = HDMI_HDR_USERMODE_DOLBY;
hdrAttr.eotfType = HDMI_EOTF_SMPTE_ST_2048;
hdrAttr.metadataType = HDMI_DRM_STATIC_METADATA_TYPE_1;
hdrAttr.colorimetry = HDMI_HDR_EXTENDED_COLORIMETRY_XV_YCC_709;
ret = HdmiSetHdrAttribute(handle, &hdrAttr);
if (ret != HDF_SUCCESS) {HDF_LOGE("HdmiSetHdrAttribute: hdmi set hdr attribute fail, ret:%d", ret);return ret;
}
設置HDMI聲音圖像消隱
int32_t HdmiAvmuteSet(DevHandle handle, bool enable);

表 8 HdmiAvmuteSet參數和返回值描述

參數參數描述
handleDevHandle類型,HDMI控制器句柄
enable布爾值,使能/去使能avmute
返回值返回值描述
HDF_SUCCESS設置成功
負數設置失敗

設置聲音圖像消隱示例:

int32_t ret;ret = HdmiAvmuteSet(hdmiHandle, true);
if (ret != HDF_SUCCESS) {HDF_LOGE("HdmiAvmuteSet: hdmi avmute set fail, ret:%d", ret);return ret;
}
設置色彩深度
int32_t HdmiDeepColorSet(DevHandle handle, enum HdmiDeepColor color);

表 9 HdmiDeepColorSet參數和返回值描述

參數參數描述
handleDevHandle類型,HDMI控制器句柄
color枚舉類型,色彩深度
返回值返回值描述
HDF_SUCCESS設置成功
負數設置失敗

設置色彩深度示例:

int32_t ret;ret = HdmiDeepColorSet(handle, HDMI_DEEP_COLOR_48BITS);
if (ret != HDF_SUCCESS) {HDF_LOGE("HdmiDeepColorSet: hdmi deep color set fail, ret:%d.", ret);return ret;
}
獲取色彩深度
int32_t HdmiDeepColorGet(DevHandle handle, enum HdmiDeepColor *color);

表 10 HdmiDeepColorGet參數和返回值描述

參數參數描述
handleDevHandle類型,HDMI控制器句柄
color枚舉類型指針,色彩深度
返回值返回值描述
HDF_SUCCESS獲取成功
負數獲取失敗

獲取色彩深度示例:

enum HdmiDeepColor color;
int32_t ret;ret = HdmiDeepColorGet(handle, &color);
if (ret != HDF_SUCCESS) {HDF_LOGE("HdmiDeepColorGet: hdmi deep color get fail, ret:%d", ret);return ret;
}
啟動HDMI傳輸
int32_t HdmiStart(DevHandle handle);

表 11 HdmiStart參數和返回值描述

參數參數描述
handleDevHandle類型,HDMI控制器句柄
返回值返回值描述
HDF_SUCCESS啟動成功
負數啟動失敗

啟動HDMI傳輸示例:

int32_t ret;ret = HdmiStart(hdmiHandle);
if (ret != HDF_SUCCESS) {HDF_LOGE("HdmiStart: start transmission fail, ret:%d", ret);return ret;
}
停止HDMI傳輸
int32_t HdmiStop(DevHandle handle);

表 12 HdmiStop參數和返回值描述

參數參數描述
handleDevHandle類型,HDMI控制器句柄
返回值返回值描述
HDF_SUCCESS停止成功
負數停止失敗

停止HDMI傳輸示例:

int32_t ret;ret = HdmiStop(hdmiHandle);
if (ret != HDF_SUCCESS) {HDF_LOGE("HdmiStop: stop transmission fail, ret:%d.", ret);return ret;
}
注銷熱插拔檢測回調函數
int32_t HdmiUnregisterHpdCallbackFunc(DevHandle handle);

表 13 HdmiUnregisterHpdCallbackFunc參數和返回值描述

參數參數描述
handleDevHandle類型,HDMI控制器句柄
返回值返回值描述
HDF_SUCCESS注銷成功
負數注銷失敗

注銷熱插拔檢測回調函數示例:

int32_t ret;ret = HdmiUnregisterHpdCallbackFunc(hdmiHandle);
if (ret != HDF_SUCCESS) {HDF_LOGE("HdmiUnregisterHpdCallbackFunc:unregister fail, ret:%d.", ret);return ret;
}
關閉HDMI控制器
void HdmiClose(DevHandle handle);

表 14 HdmiClose參數和返回值描述

參數參數描述
handleDevHandle類型,HDMI控制器句柄

關閉HDMI控制器示例:

HdmiClose(hdmiHandle);

使用實例

本例程以操作開發板上的HDMI設備為例,詳細展示HDMI接口的完整使用流程。

本例擬在Hi3516DV300開發板上對虛擬驅動進行簡單的傳輸操作:

  • SOC:hi3516dv300。

  • HDMI控制器:使用0號HDMI控制器。

示例如下:

#include "hdmi_if.h"          /* HDMI標準接口頭文件 */
#include "hdf_log.h"         /* 標準日志打印頭文件 */
#include "osal_time.h"       /* 標準延遲&睡眠接口頭文件 *//* 熱插拔回調函數 */
static void HdmiHpdHandle(void *data, bool hpd)
{if (data == NULL) {HDF_LOGE("priv data is NULL");return;}if (hpd == true) {HDF_LOGD("HdmiHpdHandle: hot plug");/* 調用者添加相關處理 */} else {HDF_LOGD("HdmiHpdHandle: hot unplug");/* 調用者添加相關處理 */}
}/* 設置HDMI相關屬性 */
static int32_t TestHdmiSetAttr(DevHandle handle)
{enum HdmiDeepColor color;struct HdmiVideoAttr videoAttr = {0};struct HdmiAudioAttr audioAttr = {0};struct HdmiHdrAttr hdrAttr = {0};int32_t ret;ret = HdmiDeepColorSet(handle, HDMI_DEEP_COLOR_48BITS);if (ret != 0) {HDF_LOGE("HdmiDeepColorSet failed.");return ret;}ret = HdmiDeepColorGet(handle, &color);if (ret != 0) {HDF_LOGE("HdmiDeepColorGet failed.");return ret;}HDF_LOGE("HdmiDeepColorGet successful, color = %d.", color);videoAttr.colorSpace = HDMI_COLOR_SPACE_YCBCR444;videoAttr.colorimetry = HDMI_COLORIMETRY_EXTENDED;videoAttr.extColorimetry = HDMI_EXTENDED_COLORIMETRY_BT2020_CONST_LUM;videoAttr.quantization = HDMI_QUANTIZATION_RANGE_FULL;ret = HdmiSetVideoAttribute(handle, &videoAttr);if (ret != 0) {HDF_LOGE("HdmiSetVideoAttribute failed.");return ret;}audioAttr.codingType = HDMI_AUDIO_CODING_TYPE_MP3;audioAttr.ifType = HDMI_AUDIO_IF_TYPE_I2S;audioAttr.bitDepth = HDMI_ADIO_BIT_DEPTH_16;audioAttr.sampleRate = HDMI_SAMPLE_RATE_8K;audioAttr.channels = HDMI_AUDIO_FORMAT_CHANNEL_3;ret = HdmiSetAudioAttribute(handle, &audioAttr);if (ret != 0) {HDF_LOGE("HdmiSetAudioAttribute failed.");return ret;}hdrAttr.mode = HDMI_HDR_MODE_CEA_861_3;hdrAttr.userMode = HDMI_HDR_USERMODE_DOLBY;hdrAttr.eotfType = HDMI_EOTF_SMPTE_ST_2048;hdrAttr.metadataType = HDMI_DRM_STATIC_METADATA_TYPE_1;hdrAttr.colorimetry = HDMI_HDR_EXTENDED_COLORIMETRY_XV_YCC_709;ret = HdmiSetHdrAttribute(handle, &hdrAttr);if (ret != 0) {HDF_LOGE("HdmiSetHdrAttribute failed.");return ret;}return 0;
}/* HDMI例程總入口 */
static int32_t TestCaseHdmi(void)
{DevHandle handle = NULL;int32_t ret;struct HdmiHpdCallbackInfo info = {0};uint8_t data[128] = {0};HDF_LOGD("HdmiAdapterInit: successful.");handle = HdmiOpen(0);if (handle == NULL) {HDF_LOGE("HdmiOpen failed.");return ret;}info.data = handle;info.callbackFunc = HdmiHpdHandle;ret = HdmiRegisterHpdCallbackFunc(handle, &info);if (ret != 0) {HDF_LOGE("HdmiRegisterHpdCallbackFunc failed.");return ret;}ret = HdmiReadSinkEdid(handle, data, 128);if (ret <= 0) {HDF_LOGE("HdmiReadSinkEdid failed.");return ret;}HDF_LOGE("HdmiReadSinkEdid successful, data[6] = %d, data[8] = %d.", data[6], data[8]);ret = TestHdmiSetAttr(handle);if (ret != 0) {HDF_LOGE("TestHdmiSetAttr failed.");return ret;}ret = HdmiStart(handle);if (ret != 0) {HDF_LOGE("HdmiStart failed.");return ret;}OsalMSleep(1000);ret = HdmiStop(handle);if (ret != 0) {HDF_LOGE("HdmiStop failed.");return ret;}ret = HdmiUnregisterHpdCallbackFunc(handle);if (ret != 0) {HDF_LOGE("HdmiUnregisterHpdCallbackFunc failed.");return ret;}HdmiClose(handle);return 0;
}

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

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

相關文章

【Git】Commit Hash vs Change-Id

文章目錄 1、Commit 號2、Change-Id 號3、區別與聯系4、實際場景示例5、為什么需要兩者&#xff1f;6、總結附錄——Gerrit 在 Git 和代碼審查工具&#xff08;如 Gerrit&#xff09;中&#xff0c;Commit 號&#xff08;Commit Hash&#xff09; 和 Change-Id 號 是兩個不同的…

leetcode hot100刷題日記——21.不同路徑

和20題一樣的思路link 題解&#xff1a; class Solution { public:int dfs(int i,int j,vector<vector<int>>&memo){//超過了邊界&#xff0c;return 0if(i<0||j<0){return 0;}//從&#xff08;0&#xff0c;0&#xff09;到&#xff08;0&#xff0c;0…

day2 MySQL表數據操作

一&#xff1a;數據操作 注&#xff1a;在編寫MySQL代碼時可以不用區分大小寫 1.查看表結構 desc 表名; -- 查看表中的字段類型&#xff0c;長度&#xff0c;約束。 2.字段的增加 AFTER table 表名 add 字段名 數據類型; -- 默認末尾添加 after table 表名 add 字段名 …

GitAny - 無需登入的 GitHub 最新倉庫檢索工具

地址&#xff1a;https://github.com/MartinxMax/gitany GitAny - 無需登入的 GitHub 專案搜尋工具 GitAny 是一款基於 Python 的工具&#xff0c;允許你在無需登入的情況下搜尋當天最新的 GitHub 專案。它支援模糊搜尋、條件篩選以及倉庫資料的視覺化分析。 安裝依賴 $ pip…

格恩朗金屬管浮子流量計 高精度測量的不二之選?

在流量測量的復雜領域&#xff0c;精度就是生命線&#xff0c;直接關乎生產的穩定性、產品的質量以及資源的合理利用。大連格恩朗品牌的金屬管浮子流量計&#xff0c;憑借其卓越的精度表現&#xff0c;成為各行業在流量測量時的最佳之選。? 格恩朗金屬管浮子流量計運用經典的可…

【R語言編程繪圖-箱線圖】

基本箱線圖繪制 使用ggplot2繪制箱線圖的核心函數是geom_boxplot()。以下是一個基礎示例&#xff0c;展示如何用iris數據集繪制不同物種&#xff08;Species&#xff09;的萼片長度&#xff08;Sepal.Length&#xff09;分布&#xff1a; library(ggplot2) ggplot(iris, aes(…

深度學習能取代機器學習嗎?

在人工智能領域&#xff0c;“機器學習”和“深度學習”這兩個詞經常被混為一談。很多新手甚至以為只要跟 AI 有關的任務&#xff0c;都該用深度學習。但其實&#xff0c;它們并不是誰強誰弱的關系&#xff0c;而是適合不同場景的工具。 這篇文章就來幫你理清楚&#xff1a; 機…

UPS的工作原理和UPS系統中旁路的作用

UPS&#xff08;不間斷電源&#xff09;根據工作原理和適用場景的不同&#xff0c;主要分為以下三種類型&#xff0c;每種類型的特點和適用場景如下&#xff1a; 1. 后備式UPS&#xff08;Offline/Standby UPS&#xff09; 工作原理&#xff1a; 正常供電時&#xff0c;負載直接…

一級菜單401問題

正常代碼生成的前后臺文件&#xff0c;菜單類型是一級標題&#xff0c; 菜單路徑和前端組件的地址都正常寫的:/projects/xxx/xxx/xxx/XxxList 其他生成的新列表都能點進去&#xff0c;只有這個點進去就是顯示空白的像首頁那個頁面一樣&#xff0c; 問題就出現在我第一次建這…

ROS2 robot控制學習(一)

controller_position.yaml使用說明 ROS 2 的 controller_manager 用途典型工作流程示例關鍵服務與話題擴展功能JointTrajectoryController 參數詳解基本參數軌跡參數插值參數前饋控制代碼示例動態參數調試參數ForwardCommandController 概述參數解釋`joints``interface``allow_…

LightGBM的python實現及參數優化

文章目錄 1. LightGBM模型參數介紹2. 核心優勢3. python實現LightGBM3.1 基礎實現3.1.1 Scikit-learn接口示例3.1.2 Python API示例 3.2 模型調優3.2.1 GridSearchCV簡介3.2.2 LightGBM超參調優3.2.3 GridSearchCV尋優結果 在之前的文章 Boosting算法【AdaBoost、GBDT 、XGBoo…

Map集合(雙列集合)

Map結合也稱為“鍵值對集合”&#xff0c;格式&#xff1a;{key1value1&#xff0c;key2value2....} Map集合的特點&#xff1a; 鍵唯一&#xff1a;在Map集合中&#xff0c;鍵&#xff08;key&#xff09;是唯一的&#xff0c;不能有重復的鍵。如果嘗試插入一個已經存在的鍵…

springBoot項目測試時瀏覽器返回406問題解決方案

1. 如果基于最新版本的SpringBoot官方骨架創建的SpringBoot項目&#xff0c;在勾選了lombok的依賴之后&#xff0c;會在pom.xml中引入如下兩個插件&#xff1a; 2. 由于第一個插件 maven-compiler-plugin 的引入導致了這個問題&#xff0c;解決這個問題的方案呢&#xff0c;就是…

21.享元模式:思考與解讀

原文地址:享元模式&#xff1a;思考與解讀 更多內容請關注&#xff1a;深入思考與解讀設計模式 引言 在軟件開發中&#xff0c;特別是當你處理大量相似對象時&#xff0c;是否會遇到一個問題&#xff1a;大量的對象會占用大量的內存&#xff0c;而這些對象有許多相同的狀態&…

java方法重寫學習筆記

方法重寫介紹 子類和父類有兩個返回值&#xff0c;參數&#xff0c;名稱都一樣的方法&#xff0c; 子類的方法會覆蓋父類的方法。 調用 public class Overide01 {public static void main(String[] args) {Dog dog new Dog();dog.cry();} }Animal類 public class Animal {…

什么是ESLint?它有什么作用?

ESLint 是一個用于 靜態代碼分析 的工具,專門檢測 JavaScript/TypeScript 代碼中的潛在問題和風格違規。它通過預定義的規則集幫助開發者保持代碼的一致性和質量,是前端工程化的核心工具之一。 一、ESLint 的核心作用 1. 錯誤檢查(Error Detection) 識別語法錯誤、未定義變…

Docker的網絡介紹

網絡簡單介紹 在介紹 Docker 的網絡模式之前&#xff0c;先簡單說下我們在使用 Vmware 虛擬機中的網絡模式&#xff0c;形成對比&#xff0c;更好理解。 1、Vmware 中的網絡模式 1.1、VMnet0&#xff08;橋接模式&#xff09; 虛擬機通過宿主機的物理網卡直接連接到外部網絡…

Netty學習專欄(六):深度解析Netty核心參數——從參數配置到生產級優化

文章目錄 前言一、核心參數全景解析1.1 基礎網絡層參數1.2 內存管理參數1.3 水位線控制1.4 高級參數與系統級優化 二、生產級優化策略2.1 高并發場景優化2.2 低延遲場景優化 總結 前言 在分布式系統和高并發場景中&#xff0c;Netty作為高性能網絡通信框架的核心地位無可替代。…

計算機網絡學習(六)——UDP

一、UDP UDP&#xff08;User Datagram Protocol&#xff0c;用戶數據報協議&#xff09;是傳輸層的一種協議&#xff0c;和 TCP 并列。與 TCP 不同&#xff0c;UDP 是無連接、不可靠、面向報文的協議&#xff0c;它的設計目標是追求更快的數據傳輸速度和更小的開銷。 UDP 為…

vue3文本超出三行顯示省略號,點擊查看更多顯示全部文本

只有一行時&#xff08;不顯示展開按鈕&#xff09;&#xff1a; 話不多說&#xff0c;上碼 ~template <el-col :span"24"><el-form-item :label"$t(warningOrgNames_)"><div class"content-box" ref"contanierRef"…