当前位置: 首页 > news >正文

OpenHarmony构建系统-GN与子系统、部件、模块理论与实践

理论

OpenHarmony源码体系

        OpenHarmony的源码架构基于模块化设计,为了方便系统的功能的增加和裁剪,设计了基于GN构建的模块系统。整个模块可从大到小划分为产品(product)、领域/子系统集(domain)、子系统(sub system)、部件(component)、模块/组件(module)、特性(feature)几个部分,这种模块化的树状编译框架,非常方便根据目标产品硬件资源的大小进行灵活的裁剪,从而实现统一OS,弹性部署的目标。

OpenHarmony系统架构

一个产品可以包含1~n个子系统(subsystem),一个子系统可以包含1~n个部件(component),一个部件可以包含1~n个模块(module),不同产品的中的相同部件可以编译不同的特性(feature),子系统集(domain)在源代码一级根目录有体现。

由于以上的特性,OpenHarmony只需要通过gn的配置实现无需删减代码达到裁剪系统的目的,提高系统整体稳定性。

产品(product)

产品解决方案为基于开发板的完整产品,主要包含产品对OS的适配、部件拼装配置、启动配置和文件系统配置等。源码路径为:/vender/{产品解决方案厂商}/{产品名称}

vender└──── company                          # 产品解决方案厂商,如:hihope├──── product                   # 产品名称,如:rk3568│      ├──── init_configs│      │      ├──── etc         # init启动进程配置(可选,仅linux内核需要)│      │      └──── init.cfg    # 系统服务启动配置│      ├──── hals               # 产品解决方案OS适配│      ├──── BUILD.gn           # 产品编译脚本│      ├──── config.json        # 产品配置文件│      └──── fs.yml             # 文件系统打包配置├──── ...

/vender/{产品解决方案厂商}/{产品名称}/init+configs/etc文件夹中包含rcS脚本、Sxxx脚本和fstab脚本。init进程在启动系统服务前执行这些脚本,执行流程为rcS—>fstab—>Sxxx,Sxxx脚本中的内容与开发板和产品需求有关,主要包含

产品配置规则:/vender/{产品解决方案厂商}/{产品名称}/config.json文件中可以配置产品所需系统的子系统,其中的inherit字段可以继承事先定义好的样板模板,模板位于productdefine/common目录下

领域/子系统集(domain)

OpenHarmony技术架构中有四大子系统集:“系统基本能力子系统集”、“基础软件服务子系统集”、“增强软件服务子系统集”、“硬件服务子系统集”。四大子系统不会直接出现在编译选项或者参数中,而是有对应的一级源代码文件夹:

“系统基本能力子系统集”对应源码foundation文件夹;“基础软件服务子系统集”和“硬件服务子系统集”对应源码base文件夹;“增强软件服务子系统集”对应源码domains文件夹。

├──applications                              # 应用程序
├──arkcompiler                               # ark编译器
├──base                                      # “基础软件服务子系统集”和“硬件服务子系统集”
├──build                                     # 编译目录
├──build.py -> build/lite/build.py           # 软链接
├──build.sh -> build/build_scripts/build.sh  # 软链接,标准系统编译入口
├──commonlibrary                             # 通用库
├──developtools                              # 开发工具
├──device                                    # 芯片相关
├──docs                                      # 文档md文件目录
├──domains                                   # 增强软件服务子系统集
├──drivers                                   # 驱动文件
├──foundation                                # “系统基本能力子系统集”
├──ide                                       # ide
├──interface                                 # 接口
├──kernel                                    # 内核,liteos-m,liteos-a,linux,uniproton
├──napi_generator                            # 代码生成工具
├──prebuilts                                 # 编译工具路径
├──productdefine                             # 产品定义
├──qemu-run -> vendor/ohemu/common/qemu-run  # qemu模拟器运行脚本
├──test                                      # 测试用例
├──third_party                               # 三方库
└──vendor                                    # 产品源码

子系统(SubSystem)

子系统是一个逻辑概念,它具体由对应的部件构成。在多设备部署场景下,支持根据实际需求裁剪某些非必要的子系统或部件。在build/subsystem_config.json中定义。

部件(component)

部件是对子系统的进一步拆分,可复用的软件单元,每一个部件单独存放一个文件夹,它包含源码、配置文件、资源文件和编译脚本;能独立构建,以二进制方式集成,具备独立验证能力的二进制单元。部件由对应源码文件夹下的bundle.json文件进行定义。

{"name": "@ohos/sensor_lite",                         # HPM部件英文名称,格式"@组织/部件名称""description": "Obtaining sensor data",              # 部件功能一句话描述"version": "3.1",                                    # 版本号,版本号与OpenHarmony版本号一致"license": "Apache License 2.0","publishAs": "code-segment",                         # HPM包的发布方式,当前默认都为code-segment"segment": {"destPath": "base/sensors/sensor_lite"             # 发布类型为code-segment时为必填项,定义发布类型code-segment的源码路径},"dirs": { "base/sensors/sensor_lite"                         # HPM包的目录结构,字段必填内容可以留空},"scripts":{},                                        # HPM包定义需要执行的脚本,字段必填,值非必填"licensePath": "COPYING","readmePath": {"en": "README.rst"},"component": {"name": "sensor_lite",                             # 部件名称"subsystem": "sensors",                            # 部件所属子系统"syscap": [],                                      # 部件为应用提供的系统能力"features": [],                                    # 部件对外的可配置特性列表,一般与build中sub_component对应,可供产品配置"adapted_system_type": [ "mini", small, standard], # 轻量(mini) 小型(small)和标准(standard),可以是多个"rom": "92KB",                                     # 部件ROM估值"ram": "~200KB",                                   # 部件RAM估值"deps": {"components": [                                  # 部件依赖的其他部件"hilog_lite","ipc","samgr_lite",],"third_party": [ "bounds_checking_function" ]    # 部件依赖的三方开源软件"hisysevent_config": []                          # 部件HiSysEvent打点配置文件编译入口},"build": {                                         # 编译相关配置"sub_component": ["//base/sensors/sensor_lite/services:sensor_service","//base/sensors/sensor_lite/frameworks:sensor_lite"    ],                                               # 部件编译入口配置"inner_kits": [],                                # 部件对外暴露的接口,用于其它部件或者模块进行引用"test": ["//base/sensors/sensor_lite/interfaces/kits/native:unittest"]                                                # 部件测试用例编译入口}}
}

路径规则为:{领域/子系统集}/{子系统}/{部件},部件目录树规则如下:

component├── interfaces│    ││    ├── innerkits          # 系统内接口,部件间使用│    ││    └── kits               # 应用接口,应用开发者使用├── frameworks              # framework实现├── services                # service实现└── BUILD.gn                # 部件编译脚本

模块(module)

模块就是编译子系统的一个编译目标,部件也可以是编译目标。模块属于哪个部件,在gn文件中由part_name指定。

ohos_shared_library("ace_napi") {        # ace_napi为模块名,同时也是编译目标deps = [ ":ace_napi_static" ]        # 模块的依赖,被依赖的对象即使没有被subsystem显式包含,也会被编译public_configs = [ ":ace_napi_config" ] # 模块配置参数,比如cflagif(!is_cross_platform_build) {public_deps = [ "//third_party/libuv:uv" ]}subsystem_name = "arkui"              # 模块所属部件所属子系统名称part_name = "napi"                    # 模块所属部件名称,一个模块只能属于一个部件
}

特性(feature)

特性是部件用于体现不同产品之间的差异。通常不同特性可以定义不同编译宏或者代码,从而影响到源代码中define的特性。


如vender/hihope/rk3568_mini_system/config.json中配置了dsoftbus

{"subsystem": "communication","components": [{ "component": "dsoftbus", "features":["dsoftbus_get_devicename=false"] }]
}

 在/foundation/communication/dsoftbus/bundle.json中features下配置有dsoftbus_get_devicename

"features": ["dsoftbus_feature_conn_p2p","dsoftbus_feature_conn_legacy","dsoftbus_feature_disc_ble","dsoftbus_feature_conn_br","dsoftbus_feature_conn_ble","dsoftbus_feature_lnn_net","dsoftbus_feature_trans_udp_stream","dsoftbus_feature_trans_udp_file","dsoftbus_get_devicename","dsoftbus_feature_product_config_path","dsoftbus_feature_lnn_wifiservice_dependence","dsoftbus_feature_protocol_newip","dsoftbus_feature_ex_kits","dsoftbus_feature_wifi_notify"
],

在foundation/communication/dsoftbus/core/adapter/core_adapter.gni中通过判断dsoftbus_get_devicename属性从而走向不同的逻辑

...
if (!dsoftbus_get_devicename) {         # 通过判断走不同的逻辑bus_center_core_adapter_src += [ 
"$dsoftbus_root_path/core/adapter/bus_center/src/lnn_settingdata_event_monitor_virtual.cpp"]bus_center_core_adapter_inc +=[ "$dsoftbus_root_path/core/adapter/bus_center/include" ]
} else {bus_center_core_adapter_src += [ "$dsoftbus_root_path/core/adapter/bus_center/src/lnn_settingdata_event_monitor.cpp" ]bus_center_core_adapter_inc += ["$dsoftbus_root_path/adapter/common/bus_center/include","$dsoftbus_root_path/core/adapter/bus_center/include",]...

实践

本节以添加一个自定义的部件为例,描述如何编译部件,编译库、编译可执行文件等。

单一任务部件

实例部件compdemo1由模块demo1model_bin模块组成,该模块的编译目标为一个可执行程序。

示例部件compdemo1完整目录结构如下

my_test└── componentdemo1├── BUILD.gn├── bundle.json├── include│    └── model1.h└── src└── model1.c

1.编写gn脚本/my_test/componentdemo1/BUILD.gn

import("//build/ohos.gni")             # 导入编译模板,编译环境等依赖
ohos_executable("demo1model1_bin"){     # 可执行模块sources = [                        # 模块源码"src/model1.c"]include_dirs = [                   # 模块依赖头文件"include"]cflags = []cflags_c = []cflags_cc = []ldflags = []configs = []deps = []                          # 部件内部依赖external_deps = []                 # 跨部件的依赖,格式为"部件名:模块名"part_name = "compdemo1"            # 模块所属部件名称install_enable = true              # 是否安装(缺省默认不安装)
}注:复制代码时需要删除#及注释,否则无法编译通过

2.对应src下创建model1.c文件,include下创建model1.h文件,文件内容如下,其实现了一个简单的打印

.model1.h

#ifndef MODEL_1_H
#define MODEL_1_H
#ifdef __cplusplus
#if __cplusplus
extern "C" {
#endif
#endifvoid HelloPrint();#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif
#endif

model1.c

#include <stdio.h>
#include "model.h"int main(int argc, char **argv)
{HelloPrint();return 0;
}void HelloPrint()
{printf("This component dir is /my_test/componentdemo1, mycomptest->compdemo1->demo1model1_bin\n");
}

3.编写/my_test/componentdemo1/bundle.json

{"name": "@ohos/compdemo1","description": "compdemo1 services","version": "3.1","license": "Apache License 2.0","publishAs": "code-segment","segment": {"destPath": "my_test/componentdemo1"},"dirs": {},"scripts": {},"component": {"name": "compdemo1","subsystem": "mycomptest","syscap": [],"features": [],"adapted_system_type": [ "mini", "small", "standard" ],"rom": "10KB","ram": "10KB",    "deps": {"components": [],"third_party": [],"hisysevent_config": []},"build": {"sub_component": ["//my_test/componentdemo1:demo1model1_bin"],"inner_kits": [],"test": []}}}

注:此处bundle.json中的"name": "@ohos/compdemo1"和"component": {中的"name": "compdemo1"对应BUILD.gn文件部件名称"part_name"对应的值;"sub_component": ["//my_test/componentdemo1:demo1model1_bin"]对应BUILD.gn中ohos_executable("demo1model1_bin")的值。

4.在/build/subsystem_config.json文件最后增加如下内容

  ,"mycomptest": {"path": "my_test","name": "mycomptest"}...
}# 注:以上...}代表内容放在文件最后一级}下

  注:subsystem_config.json文件此处的"subsystem": "mycomptest"为bundle.json中的"subsystem": "mycomptest"。

5. 在/vender/{产品解决方案厂商}/{产品名称}/config.json文件最后增加如下内容,如rk3568芯片则路径为:/vendor/hihope/rk3568/config.json

    ,{"subsystem":"mycomptest","components": [{ "component": "compdemo1","features": []}]}...]
}注:以上...]}代表以上内容放在文件中最后一级数组中

注:config.json文件中此处的"subsystem":"mycomptest"为subsystem_config.json文件中的"name": "mycomptest";"component": "compdemo1"为BUILD.gn中的part_name = "compdemo1"。

6.编译

可以使用整编命令

./build.sh --product-name rk3568 --no-prebuilt-sdk

也可以使用“–build-target 模块名"单独编译,编译命令如下:

./build.sh  --product-name rk3568 --build-target demo1model1_bin --ccache

还可以编译模块所在的部件:

./build.sh --product-name rk3568 --build-target musl --build-target demo1model1_bin --ccache

7.烧录到设备后,输入模块命令即可打印

demo1model1_bin

组合任务部件

示例部件compdemo2由demo2model1_lib模块、demo2model2_bin模块和demo2model3_config模块组成,demo2model1_lib模块的编译目标为一个动态库,demo2model2_bin模块的目标为一个可执行程序,demo2model2_conf模块的目标为一个etc配置文件。

示例部件compdemo2的完整目录结构如下

my_test/componentdemo2├── a│    ├── BUILD.gn│    ├── include│    │    └── model1.h│    └── src│         └── model1.cpp├── b│    ├── BUILD.gn│    ├── include│    │    └── model2.h│    └── src│         └── model2.cpp├── c│    ├── BUILD.gn│    └── src│         └── model3.conf├── BUILD.gn└── bundle.json

demo2model1_lib模块编写

1.编写/my_test/componentdemo2/a/BUILD.gn

import("//build/ohos.gni")
config("demo2model1_lib_config"){include_dirs = [ "include" ]
}
ohos_shared_library("demo2model1_lib"){sources = ["include/model1.h","src/model1.cpp"]public_configs = [ ":demo2model1_lib_config" ]deps = []external_deps = []part_name = "compdemo2"
}

2.对应src下创建model1.c文件,include下创建model1.h文件,文件内容如下

model1.h

#ifndef MODEL_1_H
#define MODEL_1_H
#ifdef __cplusplus
#if __cplusplus
extern "C" {
#endif
#endifvoid HelloPrintModel1();#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif
#endif

 model1.cpp

#include <stdio.h>
#include "model1.h"int main(int argc, char **argv)
{HelloPrintModel1();return 0;
}void HelloPrintModel1()
{printf("This component dir is /my_test/componentdemo2/a mycomptest->compdemo1->demo2model1_lib\n");
}

3.编写/my_test/componentdemo2/b/BUILD.gn

import("//build/ohos.gni")
ohos_executable("demo2model2_bin"){sources = ["src/model2.cpp"]include_dirs = ["include"]deps = [ "../a:demo2model1_lib" ]external_deps = []part_name = "compdemo2"install_enable = true
}

 4.对应src下创建model2.c文件,include下创建model2.h文件,文件内容如下

model2.h

#ifndef MODEL_2_H
#define MODEL_2_H
#ifdef __cplusplus
#if __cplusplus
extern "C" {
#endif
#endifvoid HelloPrintModel2();#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif
#endif

model2.cpp

#include <stdio.h>
#include "model2.h"
#include "model1.h"int main(int argc, char **argv)
{HelloPrintModel2();return 0;
}void HelloPrintModel2()
{printf("This component dir is /my_test/componentdemo2/b mycomptest->compdemo1->demo2model2_bin begin\n");HelloPrintModel1();printf("This component dir is /my_test/componentdemo2/b mycomptest->compdemo1->demo2model2_bin end\n");
}

5.编写/my_test/componentdemo2/c/BUILD.gn

import("//build/ohos.gni")
ohos_prebuilt_etc("demo2model3_conf"){source = "src/model3.conf"relative_install_dir = "init"      # 模块安装相对路径,相对于system/etc;此时路径为system/etc/init下,如果有module_install_dir配置时,该配置不生效。part_name = "compdemo2"
}注:复制代码时#备注需要全部删除,否则无法编译通过

 6.对应src下创建model3.conf文件,文件内容示例如下

var_a=1
var_b=2

7.编写/my_test/componentdemo2/BUILD.gn

import("//build/ohos.gni")
group("compdemo2_group"){deps = ["a:demo2model1_lib","b:demo2model2_bin","c:demo2model3_conf",]
}

注:dps数组中的添加格式:目录名:模块名

8.编写/my_test/componentdemo2/bundle.json

{"name": "@ohos/compdemo2","description": "compdemo2 services","version": "3.1","license": "Apache License 2.0","publishAs": "code-segment","segment": {"destPath": "my_test/componentdemo2"},"dirs": {},"scripts": {},"component": {"name": "compdemo2","subsystem": "mycomptest","syscap": [],"features": [],"adapted_system_type": [ "mini", "small", "standard" ],"rom": "10KB","ram": "10KB",    "deps": {"components": [],"third_party": [],"hisysevent_config": []},"build": {"sub_component": ["//my_test/componentdemo2:compdemo2_group"],"inner_kits": [],"test": []}}}

注:此处"sub_component": ["//my_test/componentdemo2:compdemo2_group"]对应BUILD.gn中group("compdemo2_group")的值。 

9..在/build/subsystem_config.json文件最后增加如下内容

  ,"mycomptest": {"path": "my_test","name": "mycomptest"}...
}# 注:以上...}代表内容放在文件最后一级}下

 注:subsystem_config.json文件此处的"subsystem": "mycomptest"为bundle.json中的"subsystem": "mycomptest"。

10. 在/vender/{产品解决方案厂商}/{产品名称}/config.json文件最后增加如下内容,如rk3568芯片则路径为:/vendor/hihope/rk3568/config.json

    ,{"subsystem":"mycomptest","components": [{ "component": "compdemo2","features": []}]}...]
}注:以上...]}代表以上内容放在文件中最后一级数组中

注:config.json文件中此处的"subsystem":"mycomptest"为subsystem_config.json文件中的"name": "mycomptest";"component": "compdemo2"为BUILD.gn中的part_name = "compdemo2"。

 11.编译

可以使用整编命令

./build.sh --product-name rk3568 --no-prebuilt-sdk

也可以使用“–build-target 模块名"单独编译,编译命令如下:

./build.sh  --product-name rk3568 --build-target demo2model1_bin --ccache

还可以编译模块所在的部件:

./build.sh --product-name rk3568 --build-target musl --build-target demo2model1_bin --ccache

7.烧录到设备后,输入模块命令即可打印

后记:以上模块烧录后生成文件所在目录为:

模块类型生成文件目录
ohos_shared_library/system/lib
ohos_executable/system/bin
ohos_prebuilt_etc/system/etc/

相关文章:

OpenHarmony构建系统-GN与子系统、部件、模块理论与实践

理论 OpenHarmony源码体系 OpenHarmony的源码架构基于模块化设计&#xff0c;为了方便系统的功能的增加和裁剪&#xff0c;设计了基于GN构建的模块系统。整个模块可从大到小划分为产品(product)、领域/子系统集(domain)、子系统(sub system)、部件(component)、模块/组件(modu…...

kafka+spring cloud stream 发送接收消息

方案 1&#xff1a;使用旧版 StreamListener&#xff08;适用于 Spring Cloud Stream < 2.x&#xff09; 1. 添加依赖&#xff08;pom.xml&#xff09; <!-- Spring Cloud Stream Kafka Binder --> <dependency> <groupId>org.springframework.clo…...

使用ArcGIS Pro自动矢量化水系

在地理信息系统&#xff08;GIS&#xff09;领域&#xff0c;自动矢量化是一项至关重要的技术&#xff0c;它能够将栅格图像中的要素转换为矢量数据&#xff0c;从而方便后续的分析和处理。本文将详细介绍如何使用ArcGIS Pro自动矢量化水系&#xff0c;适用于那些颜色相对统一、…...

在PyCharm中运行Jupyter Notebook的.ipynb文件及其pycharm软件的基础使用

&#xff08;注意需使用PyCharm专业版&#xff0c;学生、教师可以申请免费使用&#xff1a;https://www.jetbrains.com/shop/eform/students&#xff09; 1. pycharm2024版汉化 https://blog.csdn.net/m0_74103046/article/details/144560999 2. pycharm中的python控制台和J…...

实验 Figma MCP + Cursor 联合工作流

开源项目 Figma-Context-MCP 介绍 使用此 Model Context Protocol 服务器授予 Cursor 对 Figma 文件的访问权限。 当 Cursor 可以访问 Figma 设计数据时&#xff0c;它比粘贴屏幕截图等其他方法更能准确地进行代码转化。 开源仓库&#xff1a; GLips/Figma-Context-MCP 具体…...

移植live555 上的 rtsp

一、V4L2视频采集模块&#xff08;完整示例&#xff09; #include <linux/videodev2.h> #include <sys/ioctl.h> #include <fcntl.h>// 初始化V4L2摄像头 int init_v4l2_camera(const char* dev_path, int width, int height) {int fd open(dev_path, O_RD…...

Web Worker终极优化指南:4秒卡顿→0延迟的实战蜕变

&#x1f4a1; 导读&#xff1a;从4秒卡顿到丝滑响应 真实痛点场景&#xff1a;当斐波那契数列计算量达10亿次时&#xff0c;页面完全冻结4.2秒&#xff01;通过Web Worker优化后&#xff0c;UI响应时间降至16ms以内。本文手把手带您实现性能蜕变&#xff01; 一、Web Worker核…...

redis中的Lua脚本,redis的事务机制

lua脚本的特点 lua脚本可以操作redis数据库&#xff0c;并且脚本中的代码满足原子性&#xff0c;要么全部被执行&#xff0c;要么全部不执行 lua脚本的语法 脚本示例 lua脚本的草稿&#xff1a; 最终的lua脚本 lua脚本在java里调用的方法 RedisTemplete类里有一个方法&…...

CPU多级缓存与缓存一致性协议

CPU多级缓存与缓存一致性协议 CPU多级缓存和缓存一致性协议是计算机体系结构中优化性能与保证数据正确性的核心机制。以下从缓存层级设计、工作原理、一致性协议&#xff08;如MESI&#xff09;及其实现细节展开说明。 一、为什么需要多级缓存&#xff1f; CPU的计算速度远高…...

Apifox 增强 AI 接口调试功能:自动合并 SSE 响应、展示DeepSeek思考过程

在现代的API接口调试中&#xff0c;效率和精确性对于开发者和测试人员来说至关重要。Apifox&#xff0c;作为一款功能强大的API管理和调试工具&#xff0c;近年来不断提升其用户体验和智能化功能。最近&#xff0c;Apifox 推出了增强版的AI接口调试功能&#xff0c;其中包括自动…...

【电机控制】42步进电机+arduino:WHEELTEC_MS42DDC

轮趣科技 42步进电机arduino:WHEELTEC_MS42DDC 接线方式&#xff1a; WHEELTEC_MS42DDC有两个接口&#xff0c; 一端接口连接配套的DC电源&#xff0c;另外一端只需要用三根线&#xff0c;一根负极连接ardino 的GND&#xff0c;然后把该端口的tx和rx连接到arduino的rx和tx,下…...

使用LangChain构建第一个ReAct Agent

使用LangChain构建第一个ReAct Agent 准备环境 使用Anaconda 安装python 3.10 安装langchain、langchain_openai、langchain_community &#xff08;安装命令 pip install XXX&#xff09; 申请DeepSeek API&#xff1a;https://platform.deepseek.com/api_keys&#xff08;也…...

萝卜头笔作文赏析

在遥远的无寻王国&#xff0c;有这么一支小小的笔诞生了&#xff0c;人们见它又短又小&#xff0c;于是就给它取名叫萝卜头笔。萝卜头笔渐渐长大了&#xff0c;除了身子变粗些&#xff0c;其他什么都没变。一天&#xff0c;萝卜头笔来到了深山老林&#xff0c;那里枝叶繁茂&…...

RT-Thread+STM32L475VET6——USB鼠标模拟

文章目录 前言一、板载资源二、具体步骤1.配置icm20608传感器2.打开CubeMX进行USB配置3. 配置USB3.1 打开USB驱动3.2 声明USB3.3 剪切stm32xxxx_hal_msp.c中的void HAL_PCD_MspInit(PCD_HandleTypeDef* hpcd)和void HAL_PCD_MspDeInit(PCD_HandleTypeDef* hpcd)函数至board.c3.…...

rust 安全性

Rust 是 静态类型&#xff08;statically typed&#xff09; 语言&#xff0c; 也就是说在编译时就必须知道所有变量的类型&#xff0c; 这一点将贯穿整个章节。 C/C的安全问题 内存的不正确访问引发的内存安全问题 由于多个变量指向同一块内存区域导致的数据一致性问题 由于…...

大模型驱动的围术期质控系统全面解析与应用探索

目录 一、引言 1.1 研究背景与意义 1.2 研究目的与方法 1.3 研究创新点 二、大模型技术与围术期管理概述 2.1 大模型技术原理与发展现状 2.2 围术期管理流程与挑战 三、大模型在术前的应用 3.1 病历内涵质控 3.2 智能医学问答与知识查询 3.3 疾病风险预测与评估 3.…...

中兴B863AV3.2-T/B863AV3.1-T2/B863AV3.1-T2K_电信高安_S905L3A-B_安卓9.0_线刷固件包

中兴B863AV3.2-T&#xff0f;B863AV3.1-T2&#xff0f;B863AV3.1-T2K_电信高安_S905L3A-B_安卓9.0_线刷固件包 B863AV3.2-T B863AV3.1-T2 已知可通刷贵州、江苏、贵州、北京、河南、陕西等省份。 线刷方法&#xff1a;&#xff08;新手参考借鉴一下&#xff09; 1、准备好一…...

Android Binder机制

Binder是IPC&#xff08;进程间通信&#xff09;的一种机制&#xff0c;它允许不同的应用或系统服务在不同的进程中安全地交换数据。Binder的核心原理是基于客户端-服务器模型&#xff08;C/S架构)。 一、Binder的定义 1. Binder是Android中的一个类&#xff0c;它继承了IBind…...

【算法】初等数论

初等数论 模 取余&#xff0c;遵循尽可能让商向0靠近的原则&#xff0c;结果的正负和左操作数相同 取模&#xff0c;遵循尽可能让商向负无穷靠近的原则&#xff0c;结果的正负和右操作数相同 7/&#xff08;-3&#xff09;-2.3&#xff0c;产生了两个商-2和-3&#xff0c;取…...

Spring Boot3+Vue2极速整合:10分钟搭建DeepSeek AI对话系统

前言 在生成式AI技术蓬勃发展的今天&#xff0c;大语言模型已成为企业智能化转型和个人效率提升的核心驱动力。作为国产大模型的优秀代表&#xff0c;DeepSeek凭借其卓越的中文语义理解能力和开发者友好的API生态&#xff0c;正在成为构建本土化AI应用的首选平台。 本文将以S…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装&#xff08;Encapsulation&#xff09; 定义&#xff1a;将数据&#xff08;属性&#xff09;和操作数据的方法绑定在一起&#xff0c;通过访问控制符&#xff08;private、protected、public&#xff09;隐藏内部实现细节。示例&#xff1a; public …...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程&#xff0c;然后使用强化学习的Actor-Critic机制&#xff08;中文译作“知行互动”机制&#xff09;&#xff0c;逐步迭代求解…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

OpenLayers 分屏对比(地图联动)

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能&#xff0c;和卷帘图层不一样的是&#xff0c;分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词

Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵&#xff0c;其中每行&#xff0c;每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid&#xff0c;其中有多少个 3 3 的 “幻方” 子矩阵&am…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控&#xff0c;故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令&#xff1a;jps [options] [hostid] 功能&#xff1a;本地虚拟机进程显示进程ID&#xff08;与ps相同&#xff09;&#xff0c;可同时显示主类&#x…...

【Go语言基础【12】】指针:声明、取地址、解引用

文章目录 零、概述&#xff1a;指针 vs. 引用&#xff08;类比其他语言&#xff09;一、指针基础概念二、指针声明与初始化三、指针操作符1. &&#xff1a;取地址&#xff08;拿到内存地址&#xff09;2. *&#xff1a;解引用&#xff08;拿到值&#xff09; 四、空指针&am…...

宇树科技,改名了!

提到国内具身智能和机器人领域的代表企业&#xff0c;那宇树科技&#xff08;Unitree&#xff09;必须名列其榜。 最近&#xff0c;宇树科技的一项新变动消息在业界引发了不少关注和讨论&#xff0c;即&#xff1a; 宇树向其合作伙伴发布了一封公司名称变更函称&#xff0c;因…...