嵌入式C语言设计模式实践:观察者与责任链模式

news2026/4/9 0:18:27
1. 嵌入式软件开发中的设计模式应用背景在传统认知中嵌入式系统开发往往与资源受限、底层硬件、效率优先等标签紧密关联。早期的嵌入式设备功能单一业务逻辑简单开发者更关注代码的执行效率和硬件资源的直接操控。但随着AIoT时代的到来嵌入式设备的软件复杂度呈指数级增长。现代嵌入式系统需要处理多传感器数据融合、无线协议栈管理、边缘计算等复杂场景。以智能家居网关为例一个典型设备需要同时管理Zigbee、BLE、Wi-Fi三种无线协议处理来自20传感器的数据并运行轻量级AI推理算法。这种复杂度下代码的可维护性和可扩展性变得与运行效率同等重要。设计模式本质上是一套经过验证的解决方案模板。在面向对象领域23种经典设计模式已被广泛使用。但嵌入式开发主要使用C语言这是否意味着设计模式无用武之地实际上设计模式是解决问题的方法论与具体语言无关。通过适当的结构化编程技巧完全可以在C语言中实现各种设计模式的核心思想。关键认知设计模式不是面向对象的专利而是解决特定问题的经验总结。在资源受限的嵌入式环境中合理运用设计模式思想可以显著提升代码质量。2. 观察者模式在低功耗设计中的应用2.1 观察者模式的核心机制观察者模式定义了对象间的一对多依赖关系当一个对象主题状态变化时所有依赖它的对象观察者都会收到通知。在嵌入式场景中这种机制特别适合处理事件驱动的架构。典型的实现包含三个核心组件主题(Subject)维护观察者列表提供注册/注销接口观察者(Observer)定义统一的更新接口具体通知机制定义状态变化的传播方式在C语言中我们可以通过函数指针和链表实现这一模式struct observer_ops { void (*update)(void *context, uint32_t event); }; struct observer { struct list_head list; const struct observer_ops *ops; void *context; // 观察者上下文 }; struct subject { struct list_head observers; void (*notify)(struct subject *, uint32_t event); };2.2 低功耗管理的具体实现在嵌入式低功耗设计中观察者模式可以优雅地解决外设电源状态管理问题。以下是实现要点定义电源状态枚举typedef enum { POWER_STATE_ACTIVE, POWER_STATE_LOW_POWER, POWER_STATE_SLEEP } power_state_t;实现PM(电源管理)核心struct pm_device { const char *name; bool (*can_sleep)(void); void (*enter_low_power)(void); void (*wake_up)(void); struct list_head list; }; static LIST_HEAD(pm_devices); int pm_register(struct pm_device *dev) { if (!dev || !dev-name) return -EINVAL; list_add_tail(dev-list, pm_devices); return 0; } void pm_check_state(void) { struct pm_device *dev; bool can_sleep true; list_for_each_entry(dev, pm_devices, list) { if (dev-can_sleep !dev-can_sleep()) { can_sleep false; break; } } if (can_sleep) { list_for_each_entry(dev, pm_devices, list) { if (dev-enter_low_power) dev-enter_low_power(); } enter_system_sleep(); } }2.3 外设驱动集成示例以UART驱动为例展示如何接入PM系统struct uart_dev { struct pm_device pm; volatile bool tx_busy; // 其他UART相关字段 }; static bool uart_can_sleep(void *ctx) { struct uart_dev *dev ctx; return !dev-tx_busy; // 当没有数据传输时才允许睡眠 } static void uart_low_power(void *ctx) { struct uart_dev *dev ctx; HAL_UART_DeInit(dev-handle); // 实际硬件停用操作 } int uart_init(struct uart_dev *dev) { dev-pm.name uart1; dev-pm.can_sleep uart_can_sleep; dev-pm.enter_low_power uart_low_power; dev-pm.context dev; return pm_register(dev-pm); }2.4 实际应用中的优化技巧条件通知优化不是所有状态变化都需要通知观察者可以增加条件判断void notify_observers(struct subject *subj, uint32_t event, uint32_t mask) { struct observer *obs; list_for_each_entry(obs, subj-observers, list) { if (obs-event_mask mask) { obs-ops-update(obs-context, event); } } }批量更新机制在RTOS环境中可以使用消息队列批量处理通知void pm_notify_task(void *arg) { while (1) { struct pm_event evt; xQueueReceive(pm_queue, evt, portMAX_DELAY); // 处理电源状态变更事件 } }调试支持添加调试接口方便问题定位void pm_dump_devices(void) { struct pm_device *dev; printk(Registered PM devices:\n); list_for_each_entry(dev, pm_devices, list) { printk(- %s: %s\n, dev-name, dev-can_sleep() ? can sleep : busy); } }3. 责任链模式在裸机系统中的应用3.1 裸机系统中的顺序控制挑战在无操作系统的嵌入式环境中实现复杂的顺序控制逻辑面临三大挑战非阻塞要求不能使用sleep等阻塞调用状态管理需要手动维护任务状态机错误处理需要完善的超时和重试机制以Wi-Fi模块配置为例典型的AT指令序列需要严格按顺序执行发送AT测试指令验证模块响应发送ATCWMODE设置模式STA/AP/混合发送ATCWJAP配置连接SSID/密码等待连接结果可能需多次重试3.2 责任链模式的实现架构责任链模式将请求的处理分解为多个节点每个节点可以处理请求并传递给下一个节点直接返回处理结果有条件地选择下一个节点在C语言中的核心数据结构typedef enum { CHAIN_STATUS_OK, CHAIN_STATUS_BUSY, CHAIN_STATUS_ERROR } chain_status_t; typedef chain_status_t (*chain_handler)(void *ctx, void *param); struct chain_node { chain_handler handler; void *context; uint32_t timeout_ms; uint8_t retry_count; struct chain_node *next; };3.3 完整实现方案3.3.1 内存管理使用内存池避免动态分配带来的不确定性#define MAX_CHAIN_NODES 16 static struct chain_node node_pool[MAX_CHAIN_NODES]; static struct chain_node *free_list; void chain_init(void) { for (int i 0; i MAX_CHAIN_NODES-1; i) { node_pool[i].next node_pool[i1]; } node_pool[MAX_CHAIN_NODES-1].next NULL; free_list node_pool[0]; } struct chain_node *chain_node_alloc(void) { if (!free_list) return NULL; struct chain_node *node free_list; free_list free_list-next; memset(node, 0, sizeof(*node)); return node; }3.3.2 链式执行引擎struct chain_ctx { struct chain_node *head; struct chain_node *current; void (*complete_cb)(bool success, void *arg); void *cb_arg; uint32_t timer_start; bool timer_active; }; void chain_execute(struct chain_ctx *ctx) { if (!ctx-current) { ctx-current ctx-head; } while (ctx-current) { chain_status_t status ctx-current-handler( ctx-current-context, NULL); switch (status) { case CHAIN_STATUS_OK: ctx-current ctx-current-next; break; case CHAIN_STATUS_BUSY: ctx-timer_start get_system_tick(); ctx-timer_active true; return; case CHAIN_STATUS_ERROR: if (ctx-current-retry_count-- 0) { break; // 重试当前节点 } if (ctx-complete_cb) { ctx-complete_cb(false, ctx-cb_arg); } chain_reset(ctx); return; } } if (ctx-complete_cb) { ctx-complete_cb(true, ctx-cb_arg); } chain_reset(ctx); } void chain_tick(struct chain_ctx *ctx) { if (ctx-timer_active (get_system_tick() - ctx-timer_start) ctx-current-timeout_ms) { ctx-timer_active false; chain_execute(ctx); } }3.3.3 Wi-Fi配置实例// 节点处理函数示例 chain_status_t at_test_handler(void *ctx, void *param) { static uint8_t retry 3; if (send_at_command(AT\r\n) SUCCESS) { retry 3; return CHAIN_STATUS_OK; } if (--retry 0) return CHAIN_STATUS_ERROR; return CHAIN_STATUS_BUSY; } chain_status_t wifi_mode_handler(void *ctx, void *param) { if (send_at_command(ATCWMODE1\r\n) SUCCESS) { return CHAIN_STATUS_OK; } return CHAIN_STATUS_ERROR; } void wifi_config(void) { struct chain_ctx ctx; struct chain_node *nodes[3]; // 初始化节点 nodes[0] chain_node_alloc(); nodes[0]-handler at_test_handler; nodes[0]-timeout_ms 1000; nodes[0]-retry_count 3; nodes[1] chain_node_alloc(); nodes[1]-handler wifi_mode_handler; // 其他节点初始化... // 构建责任链 for (int i 0; i 2; i) { nodes[i]-next nodes[i1]; } nodes[2]-next NULL; ctx.head nodes[0]; ctx.complete_cb wifi_config_done; chain_execute(ctx); } void main_loop(void) { while (1) { chain_tick(wifi_chain_ctx); // 其他任务处理... } }3.4 性能优化与调试技巧内存池监控添加统计信息帮助调试内存问题void chain_debug_info(void) { int free_count 0; struct chain_node *node free_list; while (node) { free_count; node node-next; } printf(Chain nodes: %d/%d free\n, free_count, MAX_CHAIN_NODES); }执行轨迹记录在调试版本中添加执行日志#define CHAIN_DEBUG(fmt, ...) \ do { \ if (chain_debug_enable) \ printf([CHAIN] fmt \n, ##__VA_ARGS__); \ } while (0) chain_status_t wrapped_handler(void *ctx, void *param) { struct chain_node *node ctx; CHAIN_DEBUG(Executing node %p handler %p, node, node-handler); chain_status_t ret node-handler(ctx, param); CHAIN_DEBUG(Node %p returned %d, node, ret); return ret; }动态超时调整根据系统负载自动调整超时void chain_adjust_timeout(struct chain_ctx *ctx, uint32_t base_timeout) { uint32_t load_factor get_system_load(); ctx-current-timeout_ms base_timeout * (1 load_factor/100); }4. 设计模式应用的实践建议4.1 适用场景评估不是所有嵌入式场景都适合引入设计模式建议在以下情况考虑使用系统复杂度高模块间交互复杂状态转换多长期维护需求代码需要多人协作或长期演进多平台复用需要在不同硬件平台移植相同功能扩展性要求未来可能增加新功能或修改现有行为4.2 资源开销管理在资源受限的设备中使用设计模式需要注意内存占用为每个模式实现设置内存上限使用静态分配或内存池替代动态分配示例限制观察者列表的最大长度CPU开销避免深层嵌套的函数调用关键路径上减少间接调用如函数指针使用宏定义在编译时选择简化实现代码大小使用条件编译排除非必要功能将模式实现放在单独的文件中便于裁剪示例#ifdef USE_OBSERVER_PATTERN #include observer.h #else // 简化实现... #endif4.3 与RTOS的配合在RTOS环境中设计模式可以更好地发挥作用观察者模式使用消息队列作为通知机制为每个观察者创建独立任务处理事件示例void observer_task(void *arg) { struct observer *obs arg; while (1) { struct event_msg msg; xQueueReceive(obs-queue, msg, portMAX_DELAY); obs-ops-update(obs-context, msg.event); } }责任链模式将链节点处理封装为独立任务使用信号量同步节点执行示例void chain_node_task(void *arg) { struct chain_node *node arg; while (1) { xSemaphoreTake(node-sem, portMAX_DELAY); node-status node-handler(node-context, NULL); xSemaphoreGive(node-next-sem); } }4.4 测试与验证策略为确保设计模式实现的可靠性单元测试为每个模式实现设计测试用例模拟资源不足等边界条件示例测试场景void test_observer_memory_full(void) { // 注册足够多的观察者直到内存耗尽 // 验证系统行为是否符合预期 }性能分析测量关键路径的执行时间分析内存使用情况使用工具如SEGGER SystemView可视化执行流程故障注入模拟节点处理失败的情况测试错误恢复机制示例chain_status_t faulty_handler(void *ctx, void *param) { (void)ctx; (void)param; return random() % 3; // 随机返回不同状态 }5. 其他实用设计模式示例5.1 策略模式实现策略模式允许在运行时选择算法实现非常适合需要支持多种协议的嵌入式设备struct comm_strategy { int (*init)(void); int (*send)(const void *data, size_t len); int (*recv)(void *buf, size_t len); void (*deinit)(void); }; static const struct comm_strategy ble_strategy { .init ble_init, .send ble_send, // 其他操作... }; static const struct comm_strategy wifi_strategy { .init wifi_init, // 其他操作... }; struct comm_context { const struct comm_strategy *strategy; // 其他上下文数据... }; void comm_set_strategy(struct comm_context *ctx, const struct comm_strategy *strat) { if (ctx-strategy ctx-strategy-deinit) { ctx-strategy-deinit(); } ctx-strategy strat; if (strat-init) { strat-init(); } }5.2 状态机模式优化使用函数指针表实现高效状态机struct state_machine { void (*current_state)(struct state_machine *); // 其他状态机数据... }; void state_idle(struct state_machine *sm) { // 处理事件并可能转换状态 if (event_occurred()) { sm-current_state state_active; } } void state_active(struct state_machine *sm) { // 处理活动状态逻辑 if (should_return_to_idle()) { sm-current_state state_idle; } } void sm_run(struct state_machine *sm) { while (1) { sm-current_state(sm); // 其他处理... } }5.3 外观模式简化接口为复杂子系统提供统一接口struct sensor_subsystem { // 各种传感器控制结构... }; int sensor_subsystem_init(struct sensor_subsystem *sys) { // 初始化所有传感器... } int sensor_subsystem_read_all(struct sensor_subsystem *sys, struct sensor_data *output) { // 读取所有传感器数据并统一格式化... } // 对外简化的API int get_environment_data(struct env_data *data) { static struct sensor_subsystem sensors; static bool initialized false; if (!initialized) { if (sensor_subsystem_init(sensors) ! 0) { return -1; } initialized true; } struct sensor_data raw; if (sensor_subsystem_read_all(sensors, raw) ! 0) { return -1; } // 转换数据格式... return 0; }6. 性能关键代码的优化技巧当在性能敏感的场景中使用设计模式时可以考虑以下优化内联关键函数使用static inline减少函数指针调用开销static inline void observer_notify(struct observer *obs, uint32_t event) { obs-ops-update(obs-context, event); }缓存热点数据为频繁访问的数据增加缓存层struct cached_observer { struct observer base; uint32_t last_event; uint32_t last_response; };预分配资源启动时预分配所有可能需要的资源#define MAX_OBSERVERS 8 static struct observer observer_pool[MAX_OBSERVERS]; static struct list_head free_observers; void observer_system_init(void) { INIT_LIST_HEAD(free_observers); for (int i 0; i MAX_OBSERVERS; i) { list_add(observer_pool[i].list, free_observers); } }使用位图优化用位操作加速状态检查#define OBSERVER_EVENT_MASK 0x00FF void fast_notify(struct subject *subj, uint32_t event) { uint32_t mask event OBSERVER_EVENT_MASK; struct observer *obs; list_for_each_entry(obs, subj-observers, list) { if (obs-interest_mask mask) { obs-ops-update(obs-context, event); } } }7. 代码维护与可读性建议命名规范为模式相关代码添加统一前缀示例// 观察者模式相关 struct obs_subject; struct obs_observer; #define OBS_MAX_LISTENERS 8 // 责任链模式相关 struct chain_node; #define CHAIN_DEFAULT_TIMEOUT 1000文档注释为每个模式实现添加头文件说明示例/** * file observer.h * brief 观察者模式实现 * note 使用前需调用obs_system_init()初始化 * example * struct obs_subject subject; * obs_subject_init(subject); * obs_subject_register(subject, observer); */模块化组织将每个模式实现放在独立文件中示例项目结构/design_patterns /observer observer.h observer.c /chain chain.h chain.c /strategy strategy.h strategy.c版本兼容为结构体添加版本字段便于扩展struct observer_v1 { uint16_t version; // 1 struct list_head list; // 其他字段... }; struct observer_v2 { uint16_t version; // 2 struct list_head list; // 新增字段... uint32_t event_mask; };8. 常见问题与解决方案8.1 内存不足问题症状系统运行时出现内存不足或碎片化严重解决方案使用静态分配替代动态分配实现对象池模式管理关键资源示例#define MAX_OBSERVERS 8 static struct observer observer_pool[MAX_OBSERVERS]; static struct observer *alloc_observer(void) { for (int i 0; i MAX_OBSERVERS; i) { if (!observer_pool[i].used) { observer_pool[i].used true; return observer_pool[i]; } } return NULL; }8.2 优先级反转问题症状高优先级任务被低优先级任务阻塞解决方案在RTOS中合理设置任务优先级使用互斥量的优先级继承特性示例// FreeRTOS配置 const UBaseType_t observer_priority configMAX_PRIORITIES - 1; xTaskCreate(observer_task, obs, 256, NULL, observer_priority, NULL);8.3 调试困难问题症状模式交互复杂导致问题难以定位解决方案添加详细的日志记录实现运行时检查函数示例void observer_debug_dump(struct subject *subj) { printf(Subject %p has %d observers:\n, subj, list_count(subj-observers)); struct observer *obs; list_for_each_entry(obs, subj-observers, list) { printf(- %p (ctx%p, ops%p)\n, obs, obs-context, obs-ops); } }8.4 性能瓶颈问题症状模式引入的开销超出预期解决方案对关键路径进行性能分析优化数据结构布局示例缓存优化struct optimized_observer { struct list_head list; const struct observer_ops *ops; void *context; uint32_t last_notified; // 添加时间戳缓存 } __attribute__((aligned(32))); // 缓存行对齐9. 工具与资源推荐9.1 开发工具静态分析工具PC-lint检测潜在的模式实现问题Cppcheck检查内存管理和资源泄漏性能分析工具SEGGER SystemView可视化系统行为PerfLinux下的性能分析工具调试工具J-Link Trace捕获运行时函数调用OpenOCD嵌入式目标调试9.2 学习资源经典书籍《设计模式可复用面向对象软件的基础》《Head First设计模式》《嵌入式C编程实战》在线资源Embedded Artistry的设计模式系列博客GitHub上的开源嵌入式项目参考Stack Overflow上的嵌入式设计模式讨论开发板支持STM32CubeMX中的软件模式示例ESP-IDF中的组件设计参考Zephyr RTOS的设计模式实践10. 演进与扩展方向10.1 模式组合使用将多种设计模式组合可以解决更复杂的问题观察者状态机使用观察者模式传播状态变化状态机处理状态转换逻辑责任链策略责任链管理处理流程策略模式实现可替换的处理算法外观适配器外观模式提供统一接口适配器模式兼容不同子系统10.2 硬件加速支持利用现代MCU特性提升模式性能DMA加速使用DMA传输观察者通知数据减轻CPU负担硬件定时器用硬件定时器实现精确的超时控制示例void chain_node_timeout_init(struct chain_node *node) { hw_timer_config(node-timeout_ms, TIMER_MODE_ONESHOT); hw_timer_set_callback(node_timeout_cb); hw_timer_start(); }MPU保护使用内存保护单元隔离关键数据结构防止意外修改10.3 AIoT时代的新挑战面对AIoT设备的特殊需求动态加载实现模式组件的热更新示例int observer_load_plugin(const void *binary, size_t size) { // 验证并加载新的观察者处理逻辑 }安全考虑为模式交互添加安全验证示例int validated_register(struct subject *subj, struct observer *obs) { if (!validate_certificate(obs-signature)) { return -E_SECURITY; } return observer_register(subj, obs); }能耗优化根据系统负载动态调整模式行为示例void energy_aware_notify(struct subject *subj, uint32_t event) { if (current_power_state() LOW_POWER) { // 使用简化通知路径 } else { // 使用完整功能路径 } }在实际项目中我经常发现设计模式的过度使用会导致代码复杂度不降反升。一个实用的建议是当发现自己在解释某个模式实现比解释业务逻辑还费劲时可能就是简化设计的好时机。嵌入式开发终究是要在优雅设计和实际约束之间找到平衡点。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2497667.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;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…