OpenHarmony支持HDMI接口声卡适配说明
高清多媒体接口(High Definition Multimedia Interface,HDMI )是一种全数字化视频和声音发送接口,可以发送未压缩的音频及视频信号。HDMI可用于机顶盒、DVD播放机、个人计算机、电视、游戏主机、综合扩大机、数字音响与电视机等设备。HDMI可以同时发送音频和视频信号,由于音频和视频信号采用同一条线材,大大简化系统线路的安装难度。这块是百度百科对HDMI的简单介绍,我们再看看HDMI不同版本对音频的支持情况:

当前我们使用最多的是2.0版本,本文介绍了OpenHarmony系统支持HDMI声卡的适配过程,带有HDMI声卡的设备包括电视、投影仪和一些带有音响的显示器。
1 功能描述
OpenHarmony系统中音频系统使用ADM框架,下面是ADM框架的组成:

ADM框架是基于HDF系统框架开发,Card Manager是用来管理多个声卡链表,Controller是声卡的控制模块包含了音量、静音、通路选择等控制功能。
Audio Control Dispath是控制功能的中转站负责接收HDI下发的控制命令和将控制命令转发给各个声卡组件。Audio Stream Dispatch是数据流的中转站,播放过程中负责接收HDI的数据流,在录音过程中负责上传声卡的录音数据流。
Run Time Device中包括的这些模块就是一个声卡工作需要的驱动服务。其中codec编解码模块驱动服务、dai数字音频接口驱动服务和platform片上系统也就是DMA模块驱动服务是大多数声卡所必须的。HDMI声卡和其他声卡一样由三个模块组成codec编解码模块、dai数字音频接口和platform片上系统也就是DMA模块。
HDMI的codec是集成在HDMI转换芯片内部的我们只需要将PCM音频流给到HDMI转换芯片就可以。DAI这块使用的是I2S总线连接HDMI芯片和platform。要实现对HDMI声卡的支持,就需要将这几个模块的驱动注册到ADM框架中。
本文基于3月1日的OpenHarmony master分支进行介绍。基于yangfan平台介绍,如适配其他平台相关配置根据具体平台进行修改。
OpenHarmony系统支持HDMI声卡的插拔识别,支持HDMI声卡的播放功能,包括启动、停止、暂停、恢复功能。
2 准备工作
2.1 查询物理连接

这是一个HDMI设备模块的逻辑试图,图中可以看到音频数据可以通过两种接口I2S或者SPIDIF将音频数据传给HDMI设备,此处我们使用的是I2S总线。

首先需要查看芯片手册HDMI模块和SOC是如何连接的,找到音频数据传输相应的I2S总线,这块是更具rk3568芯片查到的数据,I2S0连接的是HDMI。

2.2 查询寄存器地址
因为我们使用I2S总线就要对其进行配置所以我们需要找到I2S总线的基地址和I2S总线的寄存器说明。查看芯片手册找到I2S总线对应的寄存器基地址。

3 代码介绍
HDMI的驱动codec的代码ADM框架中已经实现了,我们只需要根据不同的单板平台修改平台下面的配置文件。Dai和platform的驱动代码需要根据各自平台自行开发。yangfan开发板Dai和platform驱动代码路径在device\board\isoftstone\yangfan\kernel\hdf\drivers\audio下面的dai和soc目录下面。
涉及到的配置文件如下:vendor/isoftstone/yangfan/hdf_config/khdf/audio$ tree
├── audio_config.hcs // 此配置文件配置声卡信息
├── codec_config.hcs // 此配置文件配置codec信息
├── dai_config.hcs // 此配置文件配置dai信息
└── dma_config.hcs // 此配置文件配置platform信息
vendor/isoftstone/yangfan/hdf_config/khdf/device_info/
device_info.hcs //此配置文件配置声卡驱动服务信息
修改涉及的代码仓:device_board_hihope、vendor_isoftstone和kernel_linux_config
4 构建开关
OpenHarmony系统要支持HDMI声卡首先要打开构建开关:在文件kernel/linux/config/linux-5.10/arch/arm64/configs/rockchip_standard_defconfig
添加:CONFIG_DRIVERS_HDF_AUDIO_HDMI=y
5 功能配置
HCS(HDF Configuration Source)是HDF驱动框架的配置描述源码,内容以Key-Value为主要形式。它实现了配置代码与驱动代码解耦,便于开发者进行配置管理。
5.1 配置文件:device_info.hcs 添加hdmi声卡节点信息。
文件路径:vendor/isoftstone/yangfan/hdf_config/khdf/device_info/
HDMI声卡插入后系统会根据此处配置的声卡节点加载HDMI声卡驱动。
audio :: host {
hostName = "audio_host";
priority = 110;
device_dai :: device {...
device_hdmi :: deviceNode {
policy = 1;
priority = 50;
preload = 0;
permission = 0666;
moduleName = "DAI_RK3568";
serviceName = "hdmi_dai_service";
deviceMatchAttr = "hdf_hdmi_dai_driver";}}
device_codec :: device {...
device_hdmi :: deviceNode {
policy = 1;
priority = 50;
preload = 0;
permission = 0666;
moduleName = "AUDIO_HDMI_CODEC";
serviceName = "codec_service_1";
deviceMatchAttr = "hdf_codec_driver_1";}
...}
...
device_dma :: device {...
device_hdmi :: deviceNode {
policy = 1;
priority = 50;
preload = 0;
permission = 0666;
moduleName = "DMA_RK3568";
serviceName = "hdmi_dma_service_0";
deviceMatchAttr = "hdf_hdmi_dma_driver";}
...} device_audio :: device {...
device_hdmi :: deviceNode {
policy = 2;
priority = 60;
preload = 2;
permission = 0666;
moduleName = "HDF_AUDIO";
deviceMatchAttr = "hdf_audio_driver_1";
serviceName = "hdf_audio_codec_hdmi_dev0";}
...}
...}
moduleName 配置组件名称,和驱动代码中的moduleName相对应,系统会根据此名称加载驱动。
deviceMatchAttr私有配置的属性名称,根据此名称可以找到相应的私有配置。
serviceName驱动服务名称,根据此名称可以使用对应的驱动。
preload 配置加载方式,2为动态加载,当HDMI声卡插入时加载HDMI声卡驱动。
此文件中首先配置了文件首先先配置了HDMI的dai、codec和dma驱动服务,最后配置了HDMI声卡设备。
5.2 配置文件:audio_config.hcs 添加hdmi声卡服务信息。
文件路径:vendor/isoftstone/yangfan/hdf_config/khdf/audio/
此处配置一个HDMI声卡驱动包括哪些驱动服务。
root {
platform {
...
controller_0x120c1001 :: card_controller {
match_attr = "hdf_audio_driver_1";
serviceName = "hdf_audio_codec_hdmi_dev0";
codecName = "codec_service_1";
platformName = "hdmi_dma_service_0";
cpuDaiName = "hdmi_dai_service";
codecDaiName = "hdmi_codec_dai";}
...}
}
card_controller配置项根据声卡包含的驱动服务进行配置,不同声卡包含的驱动服务可能不同,HDMI声卡包含platform、dai和codec所以需要配置codecName codec驱动服务名称,platformName platform驱动服务名称、cpuDaiName platform侧dai服务名称、codecDaiName codec侧驱动服务名称。
match_attr配置项名称和HDMI声卡设备的私有配置名称相匹配,声卡设备可以根据这个私有配置找到声卡对应的codec、dai、platform驱动服务。
serviceName HDMI声卡服务名称,声卡加载成功后会生成/dev/hdf_audio_codec_hdmi_dev0结点。
5.3 配置文件:dma_config.hcs 添加HDMI声卡硬件信息。
文件路径:vendor/isoftstone/yangfan/hdf_config/khdf/audio/
此文件配置和HDMI声卡连接的SOC侧的DMA信息。具体信息可以通过查看cpu芯片手册得到。
root {
platform {
template dma_controller {
match_attr = "";
serviceName = "";}
...
controller_0x120c1011 :: dma_controller {
match_attr = "hdf_hdmi_dma_driver";
serviceName = "hdmi_dma_service_0"; idInfo {
chipName = "/i2s@fe400000"; // 根据hdmi驱动芯片连接的I2S总线地址进行配置
chipIdRegister = 0xfe400000; // 根据hdmi驱动芯片连接的I2S总线地址进行配置
chipIdSize = 0x1000;}
regConfig {
daiStartupSeqConfig = [0x00, 0x00, 0, 0, 0, 0xFFFFFFFF, 0xFFFFFFFF, 0, 0x0, //Transmit Operation Init];}}}
}
此文件配置了HDMI声卡使用的dma信息。
match_attr配置项名称和HDMI声卡设备的dma服务私有配置名称相匹配。serviceName HDMI声卡dma驱动服务名称需要和device_info配置文件中HDMI声卡的dma驱动服务名称相同。
HDMI模块只需要配置idInfo配置项信息,其他配置项HDMI模块未使用。
5.4 配置文件:dai_config.hcs 添加HDMI声卡硬件信息。
文件路径:vendor/isoftstone/yangfan/hdf_config/khdf/audio/
此文件配置和HDMI声卡连接的SOC侧的i2s信息。具体信息可以通过查看cpu芯片手册得到。
root {
platform {
template dai_controller {
match_attr = "";
serviceName = "";}
...
controller_0x120c1021 :: dai_controller {
match_attr = "hdf_hdmi_dai_driver";
serviceName = "hdmi_dai_service"; idInfo {
chipName = "/i2s@fe400000"; // 根据hdmi驱动芯片连接的I2S总线地址进行配置
chipIdRegister = 0xfe400000; // 根据hdmi驱动芯片连接的I2S总线地址进行配置
chipIdSize = 0x1000;}
regConfig {
daiStartupSeqConfig = [0x00, 0x00, 0, 0, 0, 0xFFFFFFFF, 0xFFFFFFFF, 0, 0x0, //Transmit Operation Init];}}}
}
此文件配置了HDMI声卡使用的dai信息。match_attr配置项名称和HDMI声卡设备的dai服务私有配置名称相匹配。serviceName HDMI声卡dai驱动服务名称需要和device_info配置文件中HDMI声卡的dai驱动服务名称相同。
chipIdRegister HDMI驱动芯片连接的I2S总线地址,此信息可以通过cpu的芯片手册获取。
chipIdSize物理地址映射的虚拟地址大小。
5.5 配置文件:codec_config.hcs 添加HDMI声卡硬件信息。
文件路径:vendor/isoftstone/yangfan/hdf_config/khdf/audio/
此文件配置HDMI声卡信息。由于HDMI声卡只支持播放,此处只配置了播放的参数信息。
root {
platform {
template codec_controller {
match_attr = "";
serviceName = "";
codecDaiName = "";
}
...
controller_0x120c1031 :: codec_controller {
match_attr = "hdf_codec_driver_1";
serviceName = "codec_service_1";
codecDaiName = "hdmi_codec_dai"; hwInfo = [
/*
Playback/Captrue, formats, rates, rate_min, rate_max, channels_min, channels_max,
buffer_bytes_max, period_bytes_min, period_bytes_max, periods_min, periods_max
*/
1, 0xF, 0xFF, 8000, 96000, 1, 2, 1, 2, 3, 4, 5
];
}
...
}
此文件配置了HDMI声卡使用的codec信息。
match_attr配置项名称和HDMI声卡设备的codec服务私有配置名称相匹配。serviceName HDMI声卡codec驱动服务名称需要和device_info配置文件中HDMI声卡的codec驱动服务名称相同。
codecDaiName HDMI声卡使用的codec dai的设备名称,此处名称需要和audio_config配置文件中的codecDaiName名称相同。
hwInfo配置声卡的信息,包括声卡播放和录音支持的格式、采样率范围、通道范围、缓存buffer最大值、每个周期的字节范围、周期的范围。第一个配置项Playback对应的值为1,Captrue对应的值为2。其他配置项没有使用。
HDMI声卡只支持播放,这里只配置了播放,有些参数没有生效可以随便配置。
6 应用样例
audio_sample_render是用来测试录音功能的工具,audio_sample_capture是用来测试播放功能的工具,audio_sample_event是用来检测USB插拔事件上报的工具。这两个工具可以通过编译得到,编译命令如下:
./build.sh --product-name yangfan -T audio_sample_render -T audio_sample_capture -T audio_sample_event
hdc shell
cd /data/
./audio_sample_render YoungForYou.wav
7 功能验证
使用hdc工具推送audio_sample_render和audio_sample_event和wav音频文件到开发板data目录下:
hdc file send E:\audio_sample_render /data
hdc file send E:\audio_sample_event /data
hdc file send E:\xxx.wav /data
HDMI音频类设备插拔检测
进入shell端口进行一次HDMI设备插入、拔出流程。
hdc shell
# cd /data/# chmod +x audio_sample_event#./audio_sample_event
插入打印:
===============================================================================
@@@@@ serviceName: audio_hdi_pnp_service
@@@@@ deviceClass: 32
@@@@@ status : 1
@@@@@ info : EVENT_TYPE=0x1;DEVICE_TYPE=0x400
===============================================================================
拔出打印:
===============================================================================
@@@@@ serviceName: audio_hdi_pnp_service
@@@@@ deviceClass: 32
@@@@@ status : 1
@@@@@ info : EVENT_TYPE=0x2;DEVICE_TYPE=0x400
===============================================================================
HDMI音频类设备放音
进入shell端口进行一次完整的播放、停止、退出流程。
hdc shell
# cd /data/# chmod +x audio_sample_render## ./audio_sample_render YoungForYou.wav==================== Loading Mode ===================
| 1. Passthrough Loading |
| 2. IPC Loading |======================================================
Please enter your choice:
2================= Select Audio Card ==================1. primary2. primary13. hdmi4. usb5. a2dp======================================================
Please enter your choice:
3================== Play Render Menu ==================
| 1. Render Start |
| 2. Render Stop |
| 3. Render Resume |
| 4. Render Pause |
| 5. Render SetVolume |
| 6. Render GetGain |
| 7. Render SetMute |
| 8. Render SetAttributes |
| 9. Render SelectScene |
| 10. Render getEXtParams |
| 11. Render getMmapPosition |
| 12.Exit |======================================================
your choice is:
1
Music channels = 2
Music Rate = 44100 Hz
Music Bit = 16 bit============= Play Render Mode ==========
| 1. Render non-mmap |
| 2. Render mmap |========================================
Please enter your choice:
1
Start Successful,Music is playing================== Play Render Menu ==================
| 1. Render Start |
| 2. Render Stop |
| 3. Render Resume |
| 4. Render Pause |
| 5. Render SetVolume |
| 6. Render GetGain |
| 7. Render SetMute |
| 8. Render SetAttributes |
| 9. Render SelectScene |
| 10. Render getEXtParams |
| 11. Render getMmapPosition |
| 12.Exit |======================================================
your choice is:
2
Stop Successful================== Play Render Menu ==================
| 1. Render Start |
| 2. Render Stop |
| 3. Render Resume |
| 4. Render Pause |
| 5. Render SetVolume |
| 6. Render GetGain |
| 7. Render SetMute |
| 8. Render SetAttributes |
| 9. Render SelectScene |
| 10. Render getEXtParams |
| 11. Render getMmapPosition |
| 12.Exit |======================================================
your choice is:
12
8 总结
本文没有介绍HDMI声卡codec驱动的具体实现,代码路径drivers/hdf_core/framework/model/audio/hdmi。平台适配支持HDMI声卡可以不用关注驱动的具体实现。
支持HDMI声卡是OpenHarmony系统使用中不可或缺的一部分,是OpenHarmony系统用于投影仪、电视显示和生活场景的重要功能,本文介绍了OpenHarmony系统支持HDMI声卡的适配步骤希望对您有所帮助。
相关文章:
OpenHarmony支持HDMI接口声卡适配说明
高清多媒体接口(High Definition Multimedia Interface,HDMI )是一种全数字化视频和声音发送接口,可以发送未压缩的音频及视频信号。HDMI可用于机顶盒、DVD播放机、个人计算机、电视、游戏主机、综合扩大机、数字音响与电视机等设…...
AtCoder Beginner Contest 300G - P-smooth number解题报告
AtCoder Beginner Contest 300G - P-smooth number解题报告 1 题目链接 传送门 2 题目大意 题目:P-光滑数的数量 题目大意: 在 1 1 1 到 n n n 中,有多少个数的所有质因数均不超过 p ( p ≤ 100 ) p\ (p\leq100) p (p≤100)。 3 解…...
数据分析与预处理常用的图和代码
1.训练集和测试集统计数据描述之间的差异作图: def diff_color(x):color red if x<0 else (green if x > 0 else black)return fcolor: {color}(train.describe() - test.describe())[features].T.iloc[:,1:].style\.bar(subset[mean, std], alignmid, colo…...
Http与Https 比较
目录 1、HTTP(HyperText Transfer Protocol:超文本传输协议) 2、HTTPS(Hypertext Transfer Protocol Secure:超文本传输安全协议) 3、HTTP 与 HTTPS 区别 4、HTTPS 的工作原理 1、HTTP(HyperTex…...
02 面向对象( 继承,抽象类)
强调:一定用自己的话总结,避免抄文档,否则视为作业未完成。 this关键字的作用 为了解决成员变量和局部变量所存在的二义性,适用于有参构造时使用 示例 private String name;private int age;public person(){}public person(String name,i…...
[C++]22种设计模式的C++实现大纲
前言 最近看遍全网,准备整理一套较好上手的设计模式文章,以便后续复习到处翻找,在此记录一下,如有侵权可以联系删除, 每天更新一篇,直到更新完 前置知识 UML类图与面向对象编程C UML类图详解软件设计原则与SOLID原则…...
用Powerpoint (PPT)制作并导出矢量图、高分辨率图
论文写作时经常需要导入矢量图,正规军都是用AI或者Inkscape作图,但是PPT更加适合小白用户,或者一些简单的构图需求使用PPT更加便捷,而且不得不承认PPT的某些功能是真的香,例如:简单的对齐、文字插入和格式修…...
小白量化《穿云箭集群量化》(9)用指标公式实现miniQMT全自动交易
小白量化《穿云箭集群量化》(9)用指标公式实现miniQMT全自动交易 在穿云箭量化平台中,支持3中公式源码运行模式,还支持在Python策略中使用仿指标公式源码运行,编写策略。 我们先看如何使用指标公式源码。 #编程_直接使…...
java Class类详解
Class类简介 在 java 世界里,一切皆对象。从某种意义上来说,java 有两种对象:实例对象和 Class 对象。每个类的运行时的类型信息就是用 Class 对象表示的,它包含了与类有关的信息,实例对象就是通过 Class 对象来创建的…...
DMGI:Unsupervised Attributed Multiplex Network Embedding
[1911.06750] Unsupervised Attributed Multiplex Network Embedding (arxiv.org) 目录 Abstract 1 Introduction 2 DGI 3 Deep Multiplex Graph Infomax: DMGI 特定关系类型的节点嵌入 Joint Modeling and Consensus Regularization Extension to Semi-Supervised Lea…...
C++基本介绍
文章目录 🥭1.C基本介绍🧂1.1 C是什么🧂1.2 C发展史 🍒2. C的优势🥔2.1 语言的使用广泛度🥔2.2 C的应用领域 🫒3. C学习计划 🥭1.C基本介绍 🧂1.1 C是什么 C是一种通用…...
如何理解工业互联网与智能制造,怎么共建智慧工厂?
第六届数字中国建设峰会26日在福州开幕,在这个数字化新技术的变革风口,企业如何把握机遇,借工业互联网和智能制造实现智慧工厂建设? 探讨三个问题: 什么是工业互联网、智能制造、智慧工厂;它们三者之间的…...
主机访问不到虚拟机(centos7)web服务的解决办法
目录 一、背景 二、解决办法 2.1、配置虚拟机防火墙 2.2、修改虚拟机网络编辑器 一、背景 主机可以访问外网,虚拟机使用命令:curl http://网址,可以访问到web服务 ,主机使用http://网址,访问不到虚拟机(…...
第四章 ActiveMQ与SpringBoot集成——ActiveMQ笔记(动力节点)
第四章 ActiveMQ 与 SpringBoot 集成 4-1 ActiveMQ 与 SpringBoot 集成集成配置 1、加载 spring boot 的 activeMQ 的依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </de…...
Halcon 算子 select_shape_std 和 select_shape_xld区别
文章目录 1 select_shape_std 算子介绍2 select_shape_xld算子介绍3 select_shape_std 和 select_shape_xld区别4 Halcon 算子的特征 Features 列表介绍1 select_shape_std 算子介绍 select_shape_std (Operator) Name select_shape_std — Select regions of a given shape.Si…...
【Java基础】匿名内部类
🎊专栏【Java基础】 🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。 🎆音乐分享【The truth that you leave】 大一同学小吉,欢迎并且感谢大家指出我的问题🥰 目录 🎁什么是匿名内部类 &#x…...
基于Freertos的ESP-IDF开发——6.使用DHT1温湿度传感器
基于Freertos的ESP-IDF开发——6.使用DHT1温湿度传感器 0. 前言1. DHT11驱动原理2. 完整代码3. 演示效果4. 其他FreeRtos文章 0. 前言 开发环境:ESP-IDF 4.3 操作系统:Windows10 专业版 开发板:自制的ESP32-WROOM-32E 准备一个DHT11温湿度传…...
C++——模板初阶
文章目录 一.泛型编程二.函数模板1.函数模板的概念2.函数模板的格式3.函数模板的原理4.函数模板的实例化(1)隐式实例化(2)显式实例化 5.模板参数的匹配原 三.类模板1.类模板的定义格式2.类模板的实例化 前言: 本章我们…...
【TOOLS: Linux与windows及linux与linux之间文件传输常用方法及命令】
文章目录 1.1.1 Windows和VirtualBox(Ubuntu)之间文件穿传输方法1.1.2 SCP 文件传输方法1.1.3 FTP 文件传输方法 1.1.1 Windows和VirtualBox(Ubuntu)之间文件穿传输方法 1)设置 virtualbox 中的共享文件夹,用户可以在windows某个盘下创建自己的共享文件…...
【博览群书】《实战大数据》——属于我的第一本大数据图书
文章目录 前言简介目录其他 前言 Hello家人们,博主前不久参加了CSDN图书馆和机械工业出版社联合举办的图书类活动,很荣幸在活动中获得了属于自己的第一本大数据图书,《实战大数据—— 分布式大数据分析处理系统开发与应用》。作为大数据专业…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...
大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...
【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
在Ubuntu24上采用Wine打开SourceInsight
1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...
排序算法总结(C++)
目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...
消息队列系统设计与实践全解析
文章目录 🚀 消息队列系统设计与实践全解析🔍 一、消息队列选型1.1 业务场景匹配矩阵1.2 吞吐量/延迟/可靠性权衡💡 权衡决策框架 1.3 运维复杂度评估🔧 运维成本降低策略 🏗️ 二、典型架构设计2.1 分布式事务最终一致…...
