嵌入式单元测试Mock自动生成:CMock工程实践指南

news2026/3/23 4:54:06
1. 嵌入式Mock模块自动生成工具CMock工程实践指南在嵌入式软件开发流程中单元测试长期面临一个根本性矛盾被测模块往往深度耦合于硬件外设、底层驱动或第三方协议栈而这些依赖项在早期开发阶段通常不可用或不稳定。当硬件原型尚未回板、传感器驱动仍在调试、通信协议栈尚未冻结时业务逻辑模块的验证便陷入停滞。这种“依赖阻塞”现象直接导致测试左移失效、缺陷发现滞后、集成风险积聚。本文介绍一种经过工业级项目验证的解决方案——基于CMock工具链的嵌入式Mock模块自动生成方法它不依赖特定IDE或构建系统可无缝嵌入CMake、Makefile或Keil MDK等任意嵌入式开发环境为固件开发提供可重复、可隔离、可自动化的测试基础设施。1.1 Mock打桩的本质函数调用重定向的工程实现Mock模拟与Stub桩在嵌入式语境下并非概念游戏而是具有明确硬件映射的技术手段。其核心目标是在不修改被测代码源码的前提下劫持函数调用跳转路径将对真实依赖模块的调用重定向至可控的模拟实现。从ARM Cortex-M系列处理器的执行机制看函数调用本质是PC寄存器加载目标地址并执行BL/BLX指令。CMock生成的Mock模块正是利用这一机制在链接阶段通过符号替换完成重定向真实模块temperature_sensor.c编译后导出符号read_temperature()CMock解析temperature_sensor.h后生成mock_temperature_sensor.c其中包含同名函数read_temperature()的桩实现链接器在解析未定义符号时优先选择Mock模块中的定义而非真实模块取决于链接顺序与库搜索路径这种重定向不涉及运行时动态加载无dlopen/dlsym不依赖任何OS服务完全符合裸机环境约束。其有效性建立在两个硬性前提之上头文件契约一致性Mock模块严格遵循原始头文件声明的函数签名、参数类型、返回值及调用约定如ARM AAPCS链接时符号覆盖构建系统需确保Mock目标文件在链接命令行中位于真实模块之前或通过--undefined/--wrap等链接器选项强制覆盖工程提示在STM32 HAL项目中若需MockHAL_UART_Transmit()必须确保mock_hal_uart.c在链接时排在stm32f4xx_hal_uart.o之前否则链接器将优先解析HAL库中的真实实现。1.2 CMock工具链定位Unity生态中的自动化Mock引擎CMock并非独立测试框架而是ThrowTheSwitch开源测试工具链中专司Mock生成的组件。其设计哲学与Unity形成精准互补组件核心职责技术特征嵌入式适配性Unity测试用例组织、断言执行、测试报告生成纯C实现零依赖支持内存泄漏检测、超时控制可直接编译进裸机固件支持CMSIS-DAP/J-Link调试器单步调试CMock解析C头文件自动生成Mock实现、期望配置、验证函数Ruby脚本实现输出标准C代码支持回调函数、参数校验、返回值队列生成代码完全符合MISRA-C:2012规则无动态内存分配CMock的价值在于将传统手工编写Mock的繁琐过程转化为确定性工程任务。以温度控制器模块temp_controller为例其依赖temperature_sensor.h接口// temperature_sensor.h #ifndef TEMPERATURE_SENSOR_H #define TEMPERATURE_SENSOR_H #include stdint.h typedef enum { SENSOR_OK 0, SENSOR_ERROR_BUS, SENSOR_ERROR_CRC } sensor_status_t; sensor_status_t temperature_sensor_init(void); int16_t temperature_sensor_read_raw(void); float temperature_sensor_convert_to_celsius(int16_t raw); #endif // TEMPERATURE_SENSOR_HCMock解析此头文件后自动生成mock_temperature_sensor.h与mock_temperature_sensor.c其中关键结构如下// mock_temperature_sensor.h节选 #ifndef MOCK_TEMPERATURE_SENSOR_H #define MOCK_TEMPERATURE_SENSOR_H #include unity.h #include temperature_sensor.h // Mock函数声明与原头文件完全一致 extern sensor_status_t temperature_sensor_init(void); extern int16_t temperature_sensor_read_raw(void); extern float temperature_sensor_convert_to_celsius(int16_t raw); // Mock专用API配置期望行为 void temperature_sensor_init_ExpectAndReturn(sensor_status_t status); void temperature_sensor_read_raw_ExpectAndReturn(int16_t value); void temperature_sensor_convert_to_celsius_ExpectAndReturn(int16_t raw, float celsius); // Mock专用API验证调用次数与参数 void temperature_sensor_init_Ignore(void); void temperature_sensor_read_raw_ReturnThruPtr_raw(int16_t* value); #endif // MOCK_TEMPERATURE_SENSOR_H生成的Mock模块具备完整的状态管理能力可预设返回值、校验传入参数、记录调用次数、支持回调函数注入甚至能模拟硬件错误场景如SENSOR_ERROR_BUS。这种能力使测试用例能精确构造边界条件例如验证温度控制器在传感器初始化失败时是否进入安全降级模式。2. CMock工程化部署全流程CMock的部署不依赖Ruby运行时嵌入目标设备其Ruby脚本仅在开发主机执行生成纯C代码供嵌入式编译器处理。整个流程分为四个确定性阶段已在STM32F407、ESP32-WROVER、NXP RT1064等多平台验证。2.1 环境准备轻量级Ruby运行时CMock要求Ruby 2.4环境但无需完整开发套件。在Ubuntu 20.04 LTS上执行# 安装最小化Ruby运行时约15MB磁盘占用 sudo apt update sudo apt install -y ruby-full zlib1g-dev build-essential # 验证安装 ruby --version # 输出ruby 2.7.4p191 (2021-07-07 revision a21a3b7d23) [x86_64-linux-gnu]注意Windows平台推荐使用MSYS2或WSL2避免RubyInstaller因路径分隔符导致的头文件解析失败。MacOS用户需通过Homebrew安装ruby而非系统自带版本Apple已弃用系统Ruby。2.2 CMock获取与配置子模块管理最佳实践CMock官方仓库采用Git子模块管理Unity依赖推荐通过克隆方式获取完整工具链# 克隆CMock仓库含Unity子模块 git clone https://github.com/ThrowTheSwitch/CMock.git cd CMock # 初始化并更新子模块关键步骤 git submodule update --init --recursive # 验证Unity子模块状态 ls -l unity/ # 应显示unity目录下存在src/、extras/等标准结构工程实践中建议将CMock作为项目子模块嵌入而非全局安装# 在嵌入式项目根目录执行 git submodule add https://github.com/ThrowTheSwitch/CMock.git tools/cmock git submodule update --init --recursive tools/cmock此方式确保团队成员使用完全一致的CMock版本避免因Ruby gem版本差异导致Mock生成结果不一致。2.3 配置文件cmock_config.yml的工程化定制CMock通过YAML配置文件控制生成行为。一个生产就绪的配置需覆盖三个关键维度配置项推荐值工程意义:plugins:[:ignore, :expect, :array, :callback]启用参数校验、数组参数支持、回调函数注入等高级特性:treat_externs::include将extern声明的函数纳入Mock范围常用于HAL库函数:includes:[inc/, drivers/]指定头文件搜索路径避免绝对路径污染生成代码典型cmock_config.yml示例--- # CMock配置嵌入式温度控制系统 :output_root: test/mocks :mock_prefix: mock_ :use_deep_stubs: true :enforce_strict_ordering: true :plugins: - :ignore - :expect - :array - :callback :treat_externs: :include :includes: - inc/ - drivers/sensor/ - drivers/hal/ :source_exclude_patterns: - test/**/* - build/**/* :default_ignore: false关键配置说明:enforce_strict_ordering: true强制校验函数调用顺序适用于状态机类模块如I2C通信序列:use_deep_stubs: true为结构体参数生成深度拷贝防止测试用例间状态污染:source_exclude_patterns明确排除测试目录避免递归解析测试代码引发循环依赖2.4 Mock生成命令行驱动的确定性过程CMock提供generate.rb脚本执行生成任务。假设项目结构如下project/ ├── inc/ │ └── temperature_sensor.h ├── src/ │ ├── temp_controller.c │ └── temp_controller.h ├── test/ │ └── cmock_config.yml └── tools/ └── cmock/ # CMock子模块在test/目录执行生成命令# 进入CMock工具目录 cd ../tools/cmock # 执行Mock生成指定配置文件与头文件路径 ruby ./lib/cmock.rb \ --config ../test/cmock_config.yml \ ../inc/temperature_sensor.h # 生成结果 # test/mocks/mock_temperature_sensor.h # test/mocks/mock_temperature_sensor.c生成的Mock文件可直接加入项目编译系统。以CMake为例在test/CMakeLists.txt中添加# 添加Mock模块为库 add_library(mock_temperature_sensor STATIC mocks/mock_temperature_sensor.c ) # 设置包含路径 target_include_directories(mock_temperature_sensor PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/mocks ${CMAKE_CURRENT_SOURCE_DIR}/../inc ) # 链接依赖 target_link_libraries(temp_controller_test PRIVATE unity mock_temperature_sensor temp_controller )3. 单元测试工程实践从用例设计到故障注入Mock模块的价值最终体现在测试用例的设计质量上。以下以温度控制器temp_controller为例展示如何构建覆盖正常流、异常流、边界条件的测试矩阵。3.1 被测模块接口分析temp_controller.h定义了核心控制逻辑// temp_controller.h #ifndef TEMP_CONTROLLER_H #define TEMP_CONTROLLER_H #include stdbool.h typedef struct { float setpoint; // 目标温度℃ float hysteresis; // 滞环宽度℃ bool heating_enabled; } controller_config_t; bool temp_controller_init(const controller_config_t* config); bool temp_controller_update(void); float temp_controller_get_current_temp(void); #endif // TEMP_CONTROLLER_H其依赖temperature_sensor.h获取实时温度并通过HAL层控制加热器此处MockHAL_GPIO_WritePin()。3.2 测试用例设计覆盖三类关键场景场景1传感器初始化失败的容错处理// test_temp_controller.c节选 #include unity.h #include mock_temperature_sensor.h #include mock_hal_gpio.h #include temp_controller.h void test_temp_controller_init_fails_on_sensor_error(void) { // 配置期望传感器初始化返回错误 temperature_sensor_init_ExpectAndReturn(SENSOR_ERROR_BUS); // 配置期望加热器GPIO初始化被跳过验证错误处理路径 HAL_GPIO_WritePin_Expect(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); // 不应执行 controller_config_t config { .setpoint 25.0f, .hysteresis 0.5f }; // 执行初始化 bool result temp_controller_init(config); // 验证返回值与状态 TEST_ASSERT_FALSE(result); TEST_ASSERT_EQUAL_FLOAT(0.0f, temp_controller_get_current_temp()); }场景2温度读取异常的鲁棒性验证void test_temp_controller_update_handles_sensor_timeout(void) { // 配置传感器返回超时错误 temperature_sensor_read_raw_ExpectAndReturn(INT16_MIN); // 模拟ADC超时返回0x8000 // 配置期望不触发加热控制避免误动作 HAL_GPIO_WritePin_Expect(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); // 执行更新 bool updated temp_controller_update(); // 验证状态保持 TEST_ASSERT_FALSE(updated); TEST_ASSERT_EQUAL_FLOAT(0.0f, temp_controller_get_current_temp()); }场景3滞环控制的精确性验证void test_temp_controller_hysteresis_behavior(void) { // 首次读取温度低于设定点下限 → 启动加热 temperature_sensor_read_raw_ExpectAndReturn(2400); // 24.0℃ temperature_sensor_convert_to_celsius_ExpectAndReturn(2400, 24.0f); HAL_GPIO_WritePin_Expect(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); temp_controller_update(); // 第二次读取温度升至设定点滞环 → 停止加热 temperature_sensor_read_raw_ExpectAndReturn(2550); // 25.5℃ temperature_sensor_convert_to_celsius_ExpectAndReturn(2550, 25.5f); HAL_GPIO_WritePin_Expect(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); temp_controller_update(); }3.3 构建与执行裸机环境下的测试验证在嵌入式环境中测试通常以独立固件形式运行。以STM32CubeIDE为例创建test_firmware项目源文件组织Core/Src/main.c测试入口、temp_controller.c、mock_*.cCore/Inc/unity.h、mock_*.h、temp_controller.hDrivers/HAL库仅编译stm32f4xx_hal_gpio.c其他驱动禁用main.c测试入口#include unity.h #include test_temp_controller.h // 包含所有测试用例 void setUp(void) {} void tearDown(void) {} int main(void) { HAL_Init(); SystemClock_Config(); // 初始化Unity测试框架 UnityBegin(test_temp_controller.c); // 运行所有测试用例 RUN_TEST(test_temp_controller_init_fails_on_sensor_error); RUN_TEST(test_temp_controller_update_handles_sensor_timeout); RUN_TEST(test_temp_controller_hysteresis_behavior); // 输出测试报告 return UnityEnd(); }串口重定向重写fputc()将Unity输出重定向至USART1通过USB转TTL模块捕获测试结果#ifdef __GNUC__ #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) #else #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) #endif PUTCHAR_PROTOTYPE { HAL_UART_Transmit(huart1, (uint8_t *)ch, 1, HAL_MAX_DELAY); return ch; }执行结果示例[test_temp_controller.c] Test Group: temp_controller [RUN] test_temp_controller_init_fails_on_sensor_error [PASS] test_temp_controller_init_fails_on_sensor_error [RUN] test_temp_controller_update_handles_sensor_timeout [PASS] test_temp_controller_update_handles_sensor_timeout [RUN] test_temp_controller_hysteresis_behavior [PASS] test_temp_controller_hysteresis_behavior ----------------------- 12 Tests 0 Failures 0 Ignored OK4. BOM清单与工程约束CMock本身不引入硬件BOM但其生成的Mock模块对目标平台有明确约束。下表列出典型嵌入式平台的适配要求平台类型RAM需求Flash需求关键约束验证案例Cortex-M0 (STM32F0)≥4KB≥32KB禁用:callback插件避免函数指针开销STM32F072RB 48MHzCortex-M4 (STM32F4)≥8KB≥64KB支持全部插件启用:use_deep_stubsSTM32F407VG 168MHzESP32 (XTENSA)≥16KB≥128KB需配置-mlongcalls链接选项ESP32-WROVER 240MHzRISC-V (GD32VF103)≥8KB≥64KB确认GCC工具链支持-marchrv32imacGD32VF103CB 108MHz实测数据在STM32F407平台为5个传感器驱动头文件生成Mock模块增加Flash占用约12KBRAM占用约3.2KB含Unity框架。该开销远低于手工编写Mock的维护成本且随依赖模块数量线性增长具备可预测性。5. 故障排查与性能优化在实际项目中CMock常见问题均源于工程配置偏差而非工具缺陷。以下是高频问题解决方案5.1 头文件解析失败undefined reference错误现象链接时报错undefined reference to temperature_sensor_init但mock_temperature_sensor.c中已定义该函数。根因CMock未解析到函数声明通常因头文件包含路径错误或宏定义缺失。解决步骤检查cmock_config.yml中:includes:是否包含temperature_sensor.h所在目录若头文件依赖#ifdef HAL_I2C_MODULE_ENABLED等宏需在配置中添加:macros::macros: - HAL_I2C_MODULE_ENABLED - USE_FULL_LL_DRIVER使用--dry-run参数验证解析结果ruby ./lib/cmock.rb --dry-run ../inc/temperature_sensor.h5.2 Mock调用未被拦截真实函数仍被执行现象测试用例中调用temperature_sensor_init_ExpectAndReturn()但程序仍执行真实temperature_sensor_init()。根因链接顺序错误或符号未被正确覆盖。验证与修复检查链接器Map文件搜索temperature_sensor_init符号来源.text.temperature_sensor_init 0x08004000 0x124 drivers/temperature_sensor.o .text.temperature_sensor_init 0x08004124 0xa8 test/mocks/mock_temperature_sensor.o若真实模块地址在前则需调整CMake中target_link_libraries()顺序确保mock_temperature_sensor在temperature_sensor之前。对GCC工具链强制使用--wrap链接器选项target_link_options(mock_temperature_sensor PRIVATE -Wl,--wraptemperature_sensor_init)5.3 内存占用优化裁剪非必要功能对于资源敏感型应用可通过配置禁用高级特性# cmock_config.yml精简版 :plugins: - :ignore - :expect :use_deep_stubs: false :enforce_strict_ordering: false :default_ignore: true # 默认忽略未显式Expect的调用此配置可减少约40%的RAM占用适用于Cortex-M0平台。6. 工程化落地建议CMock的成功应用取决于三个工程实践原则6.1 Mock边界定义聚焦接口契约而非实现细节禁止Mock硬件寄存器操作HAL_I2C_Master_Transmit()可Mock但I2C1-CR1寄存器操作不可Mock属驱动内部实现优先Mock抽象层如sensor_driver_t.read()而非i2c_bus_read()接口稳定性评估在temperature_sensor.h变更前运行ruby ./lib/cmock.rb --dry-run验证Mock兼容性6.2 持续集成集成自动化Mock生成与测试在CI流水线如GitHub Actions中嵌入CMock检查# .github/workflows/test.yml - name: Generate Mocks run: | cd tools/cmock ruby ./lib/cmock.rb --config ../test/cmock_config.yml ../inc/*.h - name: Run Unit Tests run: | cd build cmake -G Unix Makefiles -DTESTINGON .. make -j$(nproc) ./test_firmware每次PR提交时自动验证Mock生成正确性避免头文件变更导致测试失效。6.3 团队协作规范Mock即文档将cmock_config.yml纳入版本控制作为接口契约的机器可读文档在头文件注释中明确标注“此接口需被Mock”例如/** * brief 读取原始温度值ADC转换结果 * note 此函数必须被Mock用于单元测试禁止在测试中调用真实硬件 */ int16_t temperature_sensor_read_raw(void);建立Mock审查清单新接口添加后必须同步更新cmock_config.yml并生成Mock当温度控制器模块的temperature_sensor.h发生变更时工程师只需执行一次ruby generate.rb即可获得完全兼容的新Mock实现。这种确定性生成过程将原本需要数小时的手工编码工作压缩至秒级使团队能将精力聚焦于测试用例设计与业务逻辑验证——这正是嵌入式单元测试从“可做”走向“必做”的工程基石。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2435464.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…