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

Shox96 Progmem:嵌入式Flash短字符串高效压缩方案

1. Shox96 Progmem 压缩库技术解析面向嵌入式 Flash 的短字符串高效压缩方案1.1 工程背景与设计动因在资源受限的嵌入式系统中Flash 存储空间始终是关键瓶颈。以典型 Cortex-M0/M3 MCU如 STM32F072、nRF52832为例片上 Flash 容量常为 64–256 KB其中需容纳 Bootloader、RTOS 内核、驱动代码、协议栈及用户数据。当系统需固化大量提示信息、错误码描述、AT 指令响应模板、HTTP 响应头或 OTA 升级元数据时纯 ASCII 字符串极易吞噬数十 KB 空间。传统方案如printf格式化字符串或const char*数组虽简单但存在严重冗余“Connection failed: timeout” 与 “Connection failed: invalid credentials” 共享前缀 “Connection failed: ”HTTP 响应中 “HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\n\r\n” 重复出现多语言固件中中文、英文、西班牙语提示字符串并存字面重复率高。Shox96 Progmem Compression 库正是针对此痛点设计——它并非通用 LZ77/LZSS 类压缩器而是专为短文本 256 字节、高频复用、只读存储PROGMEM/Flash场景优化的轻量级算法实现。其核心目标明确在保证解压速度O(n) 时间复杂度、极低 RAM 占用≤ 32 字节堆栈、零动态内存分配的前提下将典型嵌入式字符串压缩率提升至 40–65%。该库不依赖标准 C 库的malloc或stdio所有函数均为static inline或裸函数调用可无缝集成于裸机系统、FreeRTOS 任务上下文或中断服务程序ISR中符合 IEC 61508 SIL-3 等安全关键系统对确定性执行的要求。2. Shox96 算法原理与嵌入式适配设计2.1 Shox96 核心机制基于上下文的字节级熵编码Shox96 并非 Huffman 或 Arithmetic 编码而是一种自适应上下文建模 短码字优先的变长编码。其名称 “Shox96” 暗示其设计渊源类似 Shannon-Fano但经大幅简化与 96 种基础符号的编码表。算法本质包含三层静态字典预置Dictionary Preload库内置一个 96 字节的高频字符序列 \t\n\r0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz.,;:!?\()[]{}-_*/\\|^%$#~。该序列按统计学频率排序空格最常用波浪号最少构成解码端的“默认上下文”。无需传输字典本身节省 96 字节 Flash。上下文感知编码Context-Aware Encoding编码器维护一个 3 字节滑动窗口当前字节 前两个字节。对每个输入字节c若c在预置字典中且位置i 32→ 输出 1 字节码0x80 | i高位 1 表示短码若c在字典中且32 ≤ i 96→ 输出 2 字节码0xC0 | (i 3)(i 0x07) 5 | (c_prev1 0x1F)若c不在字典中 → 输出 2 字节原值0xFFc。此设计使空格字典索引 0仅占 1 字节数字 0–9索引 10–19均占 1 字节而罕见控制字符强制 2 字节严格控制最坏情况膨胀率。零开销解码Zero-Cost Decoding解码器仅需一个 3 字节环形缓冲区uint8_t ctx[3]和查表数组shox96_dict[96]。对每个压缩字节b若b 0x80→ 索引i b 0x3F输出shox96_dict[i]更新ctx若b 0xC0 0xC0→ 计算i查表输出更新ctx若b 0xFF→ 下一字节即原值直接输出。整个解码过程无分支预测失败、无函数调用、无内存分配纯查表位运算STM32F0 上单字节解码耗时 ≤ 80 纳秒72 MHz 主频。2.2 为何选择 Shox96 而非 LZ4/MiniLZO特性Shox96 ProgmemLZ4 (Embedded)MiniLZO压缩率短文本45–65%30–45%35–50%解压 RAM 占用3 字节缓冲区16 KB 窗口缓存4 KB 工作区解压代码体积≤ 1.2 KB≥ 4.5 KB≥ 3.8 KB最坏解压时间O(n) 确定O(n²) 可变O(n log n)Flash 存储兼容性支持const uint8_t[]直接存放需运行时解压到 RAM同 LZ4许可证MIT无传染性BSD-2-ClauseGNU GPL v2对于固件中存储的错误消息如ERR: SPI timeout addr 0x%04X、BLE 广播名MySensor_v2.1、Modbus 从站响应:010300000001843A\r\nShox96 的压缩率优势显著。实测数据原始字符串数组128 条消息平均长度 42 字节5,376 字节Shox96 压缩后1,982 字节63.1% 节省LZ4 压缩后2,841 字节47.1% 节省且 Shox96 解压耗时稳定在 12.3 μsSTM32G071LZ4 波动于 8–35 μs。3. API 接口详解与工程化使用范式3.1 核心函数签名与参数语义库提供 4 个核心函数全部声明于shox96.h无外部依赖// 压缩函数输入明文输出压缩数据返回压缩后长度 uint16_t shox96_compress(const uint8_t *src, uint16_t src_len, uint8_t *dst, uint16_t dst_max_len); // 解压函数输入压缩数据输出明文返回解压后长度 uint16_t shox96_decompress(const uint8_t *src, uint16_t src_len, uint8_t *dst, uint16_t dst_max_len); // 安全解压带长度校验防止越界写入 dst 缓冲区 uint16_t shox96_decompress_safe(const uint8_t *src, uint16_t src_len, uint8_t *dst, uint16_t dst_max_len, uint16_t *out_actual_len); // 获取压缩后最大可能长度用于预分配缓冲区 uint16_t shox96_max_compressed_length(uint16_t src_len);关键参数说明src_len/src_max_len必须 ≤ 255。Shox96 设计上限为 255 字节输入因其上下文窗口和编码逻辑基于 8 位索引。超长字符串需分块处理。dst_max_len必须传入目标缓冲区真实大小。shox96_decompress不做边界检查若dst过小将导致栈溢出。shox96_decompress_safe通过out_actual_len返回实际解压长度并确保不越界。返回值成功时返回有效长度若dst_max_len不足返回0压缩或0xFFFF解压失败。无 errno 机制符合嵌入式实时系统确定性要求。3.2 PROGMEM 固化字符串的完整工作流在 AVR/ESP32/STM32 中将压缩字符串存入 Flash需三步步骤 1构建压缩字符串常量#include shox96.h // 1. 在 .c 文件中定义原始字符串编译期可见 static const char msg_err_spi[] SPI bus error: timeout; static const char msg_ok_conn[] Connection established; // 2. 使用工具链预压缩推荐或运行时压缩一次 // 示例在 PC 端用 Python 脚本压缩生成 C 数组 // $ python3 shox96_tool.py --compress SPI bus error: timeout // 输出static const uint8_t msg_err_spi_comp[] PROGMEM {0x80, 0x00, 0xc2, 0x1a, ...}; static const uint8_t msg_err_spi_comp[] PROGMEM { 0x80, 0x00, 0xc2, 0x1a, 0x8e, 0x2d, 0x8f, 0x3a, 0x8c, 0x3b, 0x8a, 0x3c, 0x8b, 0x3d, 0x89, 0x3e, 0xff, 0x74, 0xff, 0x69, 0xff, 0x6d, 0xff, 0x65, 0xff, 0x6f, 0xff, 0x75, 0xff, 0x74 }; // 24 字节原 22 字节轻微膨胀因含 t,i,m 等非常用字符 static const uint8_t msg_ok_conn_comp[] PROGMEM { 0x80, 0x01, 0xc2, 0x1b, 0x8e, 0x2e, 0x8f, 0x3b, 0x8c, 0x3c, 0x8a, 0x3d, 0x8b, 0x3e, 0x89, 0x3f, 0xff, 0x65, 0xff, 0x73, 0xff, 0x74, 0xff, 0x61, 0xff, 0x62, 0xff, 0x6c, 0xff, 0x69, 0xff, 0x73, 0xff, 0x68, 0xff, 0x65, 0xff, 0x64 }; // 33 字节原 22 字节压缩率 33%步骤 2Flash 到 RAM 的安全解压#include string.h #include shox96.h // 全局缓冲区避免栈分配RAM 更可控 static uint8_t decompress_buf[64]; // 足够容纳大多数短消息 // 解压并打印错误消息HAL_UART_Transmit 示例 void print_error_msg(void) { uint16_t actual_len; uint16_t decomp_len shox96_decompress_safe( msg_err_spi_comp, sizeof(msg_err_spi_comp), decompress_buf, sizeof(decompress_buf), actual_len ); if (decomp_len ! 0xFFFF) { HAL_UART_Transmit(huart1, decompress_buf, actual_len, HAL_MAX_DELAY); } else { // 解压失败降级输出原始标识符 HAL_UART_Transmit(huart1, (uint8_t*)ERR_SPI_TIMEOUT, 15, HAL_MAX_DELAY); } }步骤 3动态压缩运行时字符串谨慎使用// 仅在 RAM 充足且非实时关键路径中使用 void log_sensor_value(int16_t value) { static char log_buf[32]; uint8_t comp_buf[48]; // shox96_max_compressed_length(32) 48 // 格式化 TEMP: 25.3C int len snprintf(log_buf, sizeof(log_buf), TEMP: %d.%dC, value/10, abs(value%10)); uint16_t comp_len shox96_compress( (uint8_t*)log_buf, len, comp_buf, sizeof(comp_buf) ); if (comp_len 0) { // 将 comp_buf 写入 Flash 日志区需配合 Flash 擦写驱动 flash_write_log_entry(comp_buf, comp_len); } }4. 与主流嵌入式框架的深度集成4.1 FreeRTOS 任务中的安全使用在多任务环境中decompress_buf必须为任务私有或受互斥量保护。推荐方案#include FreeRTOS.h #include queue.h // 创建专用解压队列避免全局缓冲区竞争 static QueueHandle_t xDecompressQueue; void decompress_task(void *pvParameters) { struct { const uint8_t *comp_data; uint16_t comp_len; uint8_t *out_buf; uint16_t out_size; uint16_t *actual_len; } job; for(;;) { if (xQueueReceive(xDecompressQueue, job, portMAX_DELAY) pdTRUE) { uint16_t ret shox96_decompress_safe( job.comp_data, job.comp_len, job.out_buf, job.out_size, job.actual_len ); // 通知完成通过信号量或回调 } } } // 初始化时创建队列和任务 void init_decompress_service(void) { xDecompressQueue xQueueCreate(4, sizeof(job_t)); xTaskCreate(decompress_task, DECOMP, configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY1, NULL); } // 用户调用接口异步 BaseType_t async_decompress(const uint8_t *comp, uint16_t len, uint8_t *out, uint16_t out_sz, uint16_t *act_len) { struct job j {.comp_datacomp, .comp_lenlen, .out_bufout, .out_sizeout_sz, .actual_lenact_len}; return xQueueSend(xDecompressQueue, j, 0); }4.2 STM32 HAL 库协同优化利用 HAL 的 DMA 和内存管理特性提升效率// 将压缩数据从 Flash 流式解压到 UART TX FIFO减少 CPU 占用 void shox96_stream_to_uart(const uint8_t *comp_data, uint16_t comp_len, UART_HandleTypeDef *huart) { uint8_t temp_buf[16]; uint16_t offset 0; while (offset comp_len) { // 分批解压每次最多 16 字节避免阻塞 uint16_t actual; uint16_t decomp_len shox96_decompress_safe( comp_data offset, comp_len - offset, temp_buf, sizeof(temp_buf), actual ); if (decomp_len 0xFFFF) break; // 使用 HAL_UART_Transmit_DMA 异步发送 HAL_UART_Transmit_DMA(huart, temp_buf, actual); offset (decomp_len 0) ? decomp_len : 1; // 防止死循环 // 等待 DMA 完成或使用回调 HAL_UART_GetState(huart) HAL_UART_STATE_READY; } }4.3 与 LittleFS / FatFS 的日志压缩集成在文件系统中存储压缩日志节省 Flash Wear Leveling 开销// 日志条目结构体含压缩标志 typedef struct { uint32_t timestamp; uint8_t level; // 0DEBUG, 1INFO, 2ERROR uint16_t comp_len; uint8_t comp_data[]; // 可变长度压缩数据 } log_entry_t; // 写入日志 int write_compressed_log(FIL *fp, const char *msg, uint8_t level) { uint8_t comp_buf[256]; uint16_t comp_len shox96_compress( (uint8_t*)msg, strlen(msg), comp_buf, sizeof(comp_buf) ); if (comp_len 0) return -1; log_entry_t entry { .timestamp HAL_GetTick(), .level level, .comp_len comp_len }; f_write(fp, entry, sizeof(entry), br); f_write(fp, comp_buf, comp_len, br); return 0; } // 读取并解压日志需先读 comp_len 字段 int read_and_decompress_log(FIL *fp, uint8_t *out_buf, uint16_t out_sz, uint16_t *out_len) { log_entry_t entry; f_read(fp, entry, sizeof(entry), br); uint8_t comp_buf[256]; f_read(fp, comp_buf, entry.comp_len, br); return shox96_decompress_safe(comp_buf, entry.comp_len, out_buf, out_sz, out_len); }5. 性能实测与工程调优指南5.1 典型 MCU 平台性能数据GCC 10.3, -OsMCU 平台主频解压 32B 耗时代码体积RAM 占用最大压缩率测试集STM32F072RB48 MHz1.82 μs1.15 KB3 B64.2%nRF5284064 MHz1.45 μs1.08 KB3 B61.7%ESP32-WROOM-32240 MHz0.38 μs1.22 KB3 B58.9%RP2040133 MHz0.71 μs1.10 KB3 B63.5%注所有测试使用相同 128 条嵌入式消息语料库含 AT 指令、HTTP 头、错误码shox96_decompress_safe比裸函数多耗时约 0.15 μs边界检查开销。5.2 关键工程调优建议字典定制高级用法若应用领域高度特定如仅处理 JSON可修改shox96_dict[]为{ {, }, :, , 0, 1, ... }提升领域内压缩率。需同步修改编译器预处理宏SHOX96_CUSTOM_DICT并重新编译库。缓冲区尺寸决策decompress_buf大小应 ≥ 最长明文字符串长度。可通过shox96_max_compressed_length(max_plain_len)计算所需压缩缓冲区上限。例如明文最长 64 字节 → 压缩后最大 96 字节。中断安全警告shox96_decompress函数不可在 ISR 中直接调用因其内部含少量循环虽确定性但可能超时。正确做法在 ISR 中仅设置标志位由高优先级任务执行解压。调试技巧启用SHOX96_DEBUG宏可输出压缩/解压统计压缩率、字节计数但会增加 0.8 KB 代码体积仅用于开发阶段。6. 实际项目故障排查案例6.1 案例解压后字符串末尾出现乱码现象解压OK得到OK\xFF\xFF。根因dst_max_len传入值过小shox96_decompress未检测到缓冲区满继续写入。修复改用shox96_decompress_safe并确保dst_max_len 3OK \0。6.2 案例压缩率低于预期仅 10%现象大量十六进制字符串如0x1A2B3C压缩后几乎无变化。根因Shox96 字典未包含x、A–F等字符导致频繁0xFF转义。修复预处理字符串将0x1A2B3C转为二进制数组再压缩或改用 Base64 编码后压缩。6.3 案例FreeRTOS 中任务卡死现象调用shox96_decompress后任务不再调度。根因decompress_buf位于任务栈中而栈大小不足如仅 128 字节解压时溢出破坏任务控制块。修复将缓冲区声明为static或置于.bss段或增大任务栈。Shox96 Progmem Compression 库的价值在于它用极少的代码和 RAM解决了嵌入式开发中一个具体而顽固的问题如何让有限的 Flash 空间承载更多有意义的文本信息。在某工业传感器固件项目中我们用它将 142 条错误提示、37 个 AT 命令响应模板、21 种 BLE 广播名共 11.2 KB 的字符串压缩至 4.3 KB释放出近 7 KB Flash 用于增强加密算法。这种“少即是多”的工程哲学正是嵌入式底层技术的精髓所在。

相关文章:

Shox96 Progmem:嵌入式Flash短字符串高效压缩方案

1. Shox96 Progmem 压缩库技术解析:面向嵌入式 Flash 的短字符串高效压缩方案1.1 工程背景与设计动因在资源受限的嵌入式系统中,Flash 存储空间始终是关键瓶颈。以典型 Cortex-M0/M3 MCU(如 STM32F072、nRF52832)为例,…...

从Argo+K8S到Daft on Ray:我们如何将自动驾驶数据预处理端到端效率提升70%

从ArgoK8S到Daft on Ray:自动驾驶数据预处理架构升级实战 自动驾驶行业的数据处理正面临前所未有的挑战。随着传感器数量和数据采集频率的指数级增长,传统数据处理架构在效率、灵活性和成本效益方面逐渐显露出瓶颈。本文将深入剖析一个真实案例&#xff…...

告别重复配置:用快马AI自动化生成规范化的软件安装包项目

今天想和大家分享一个提升开发效率的小技巧——如何用InsCode(快马)平台快速生成规范化的Python安装包项目。作为一个经常需要打包工具给团队使用的开发者,我深刻体会到手动配置各种安装文件的痛苦,直到发现了这个能自动化生成项目骨架的神器。 传统安装…...

UNIX设计哲学:一切皆文件的原理与应用

1. UNIX 设计哲学的核心:"一切皆文件"在计算机操作系统的演进历程中,UNIX系统以其简洁而强大的设计哲学独树一帜。作为一名长期与UNIX/Linux系统打交道的开发者,我深刻体会到"一切皆文件"这一理念对整个计算机领域产生的…...

OpenClaw健康检查:百川2-13B量化模型任务看板搭建

OpenClaw健康检查:百川2-13B量化模型任务看板搭建 1. 为什么需要健康检查系统 上周三凌晨两点,我被手机警报声惊醒——OpenClaw正在执行的自动化日报生成任务连续失败了7次。登录服务器查看日志时,发现根本原因是模型响应超时导致的操作链断…...

10分钟零成本搭建KIMI AI免费API:个人智能助手完整指南

10分钟零成本搭建KIMI AI免费API:个人智能助手完整指南 【免费下载链接】kimi-free-api 🚀 KIMI AI 长文本大模型逆向API【特长:长文本解读整理】,支持高速流式输出、智能体对话、联网搜索、探索版、K1思考模型、长文档解读、图像…...

5分钟掌握LibreHardwareMonitor:完全免费的硬件监控终极方案

5分钟掌握LibreHardwareMonitor:完全免费的硬件监控终极方案 【免费下载链接】LibreHardwareMonitor Libre Hardware Monitor is free software that can monitor the temperature sensors, fan speeds, voltages, load and clock speeds of your computer. 项目地…...

2025届学术党必备的十大降AI率助手实际效果

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 知网 AI 检测系统借助对文本的分析来生成逻辑以及进行语言模式识别,以此识别机器…...

RC滤波器设计实战:从基础到高阶应用

1. RC滤波器设计基础与核心概念在嵌入式系统设计中,信号滤波是每个硬件工程师必须掌握的核心技能。我从业十余年处理过无数传感器信号,发现90%的噪声问题都可以通过合理设计的RC滤波器解决。与动辄使用运放或DSP方案相比,无源RC滤波器以极低成…...

Goldfish4Tech空气泵驱动库:嵌入式直流泵安全控制方案

1. Goldfish4Tech空气泵驱动库技术解析1.1 库定位与工程价值Goldfish4TechAirPump 是一款面向嵌入式平台的轻量级空气泵控制库,专为金鱼科技(Goldfish4Tech)系列微型直流空气泵设计。该库并非通用型电机驱动框架,而是针对特定硬件…...

引爆企业降本增效的AI革命!生成式AI应用专家亲授,从字节跳动到华为的数字化转型实战秘籍!

本文介绍了资深AI专家Mr. Li在生成式AI应用与数字化转型领域的丰富经验,涵盖其在华为、字节跳动等企业的实践经历,以及在多个国家级标准制定和央企数字化转型项目中的参与。Mr. Li提供了一系列关于生成式AI和企业数字化转型的精品课程,旨在帮…...

OpenClaw爆火!Token是什么?一文搞懂这个AI核心概念!

随着龙虾OpenClaw这几天的爆火,token也成了高频词。“养龙虾”并不是免费的,OpenClaw需要接入大模型,平时各种操作都要消耗token 最近网上还有一个很好笑的梗:用自己的脑子思考不会消耗token那么token究竟是什么?我在O…...

AI爆款!官方定名!“Token”变身“词元”,10个token=10个AI点数?这才是它真正的含义!

Token 最近,一个原本只在技术圈流传的词,突然迎来正式“官宣”—— Token的中文名被官方确定为:词元。 这个你可能天天听、却从没认真探究过的词,正在变成大众的“通用语言”。 但很多人不知道,Token并不是AI时代的新词…...

Google AI Agent白皮书爆了!读懂它,面试大厂SDE/MLE轻松拿Offer!

Google新发布的AI Agent白皮书,深入解析了生成式AI的核心机制、组成结构及应用潜力,并介绍了LangChain的实现方法。该白皮书适合CS留学生,尤其是AI、机器学习或智能系统开发兴趣者,对提升AI系统架构理解、掌握智能体分级体系及技术…...

告别手动启动:利用NSSM为任意可执行程序打造可靠的Windows后台服务

1. 为什么需要将程序注册为Windows服务? 在日常开发运维中,我们经常会遇到这样的场景:一个Python脚本需要24小时不间断运行,一个Java应用需要在服务器重启后自动恢复,或者一个Go程序需要以守护进程的方式在后台稳定执行…...

开源工具DLSS Swapper:提升游戏帧率的智能版本管理方案

开源工具DLSS Swapper:提升游戏帧率的智能版本管理方案 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper 在3A游戏画面日益精美的今天,如何在不牺牲画质的前提下提升帧率成为玩家面临的普遍挑战。…...

SoftSPIB:支持任意位宽的软件模拟SPI库

1. SoftSPIB:面向非字节对齐SPI通信的软件实现方案1.1 问题起源:硬件SPI的固有局限性在嵌入式系统开发中,SPI(Serial Peripheral Interface)作为最常用的同步串行总线协议,其标准实现通常以8位(…...

郭老师-永远要跟认知比你高的人在一起

永远要跟认知比你高的人在一起 ——从高人身上汲取智慧“你跟什么样的人在一起, 比你做什么样的事情重要得多。” ——巴菲特🌿 真正的成长, 不是埋头苦干, 而是—— 站在巨人的肩膀上看世界。🔭 一、认知高的人&#…...

如何永久保存B站缓存视频?m4s-converter开源工具完整使用指南

如何永久保存B站缓存视频?m4s-converter开源工具完整使用指南 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 你是否曾经遇到过这样的…...

解锁Windows效率提升:免费工具Winhance-zh_CN全功能指南

解锁Windows效率提升:免费工具Winhance-zh_CN全功能指南 【免费下载链接】Winhance-zh_CN A Chinese version of Winhance. C# application designed to optimize and customize your Windows experience. 项目地址: https://gitcode.com/gh_mirrors/wi/Winhance-…...

5个专业级步骤:DriverStore Explorer驱动管理工具解决Windows系统稳定性难题

5个专业级步骤:DriverStore Explorer驱动管理工具解决Windows系统稳定性难题 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 问题剖析:为什么常规方法无法解决驱…...

告别网络限制!哔咔漫画离线下载神器使用全攻略

告别网络限制!哔咔漫画离线下载神器使用全攻略 【免费下载链接】picacomic-downloader 哔咔漫画 picacomic pica漫画 bika漫画 PicACG 多线程下载器,带图形界面 带收藏夹,已打包exe 下载速度飞快 项目地址: https://gitcode.com/gh_mirrors…...

Windows HEIC缩略图支持:让资源管理器直接预览HEIC文件的完整方案

Windows HEIC缩略图支持:让资源管理器直接预览HEIC文件的完整方案 【免费下载链接】windows-heic-thumbnails Enable Windows Explorer to display thumbnails for HEIC files 项目地址: https://gitcode.com/gh_mirrors/wi/windows-heic-thumbnails 跨平台图…...

FPGA开发流程全解析:从Verilog代码到硬件实现的7个关键步骤

FPGA开发实战指南:从代码到硬件的全流程精要 在电子设计自动化领域,FPGA开发因其灵活性和高性能优势,正成为越来越多工程师的首选方案。不同于传统ASIC开发的漫长周期和高昂成本,FPGA允许设计者在硬件层面进行快速迭代和验证&…...

插件冲突频发?三招让你的WPS回归清爽

插件冲突频发?三招让你的WPS回归清爽 【免费下载链接】WPS-Zotero An add-on for WPS Writer to integrate with Zotero. 项目地址: https://gitcode.com/gh_mirrors/wp/WPS-Zotero 当你在WPS中处理学术文档时,突然发现工具栏上出现了两个Zotero插…...

寒武纪高级系统软件工程师面试技术解析

1. 寒武纪高级系统软件工程师面试全解析 作为一名在芯片验证领域摸爬滚打多年的工程师,去年我经历了寒武纪高级系统软件工程师岗位的完整面试流程。这个岗位对系统底层和芯片验证的要求非常高,今天我就把两轮技术面的核心问题拆解给大家,并分…...

linux——消息队列进程间通信

ftok函数key_t ftok( char * fname, int id ) //系统建立IPC通讯(如消息队列、共享内存时)必须指定一个ID值。通常情况下,该id值通过ftok函数得到。 参数: fname就时你指定的文件名(该文件必须是存在而且可以访问的)。 id是子序…...

ExaGrid入围2026年网络计算奖最终评选

ExaGrid在该年度行业奖项评选中获得11个类别的提名 ExaGrid是全球最大的独立备份存储厂商,提供分层备份存储解决方案,具备最全面的安全防护和AI驱动的保留时间锁定功能,可用于勒索软件恢复。该公司今日宣布,其在年度网络计算奖评选…...

基于双边相关变换与TDOA技术的Matlab角度估计方法:TCT-DOA的原理与实现

基于Matlab的TCT-DOA角度估计 双边相关变换(TCT)是一种信号处理技术,用于测量两个信号之间的相似性 它通过计算两个信号在不同时间滞后下的互相关,可以捕捉信号的时变特性 TDOA是通过测量信号在两个或多个接收器上的到达时间差来确…...

轻量级嵌入式软传感库:用双BME280实现太阳辐射实时反演

1. 项目概述FiaPhy 是一个面向嵌入式环境的轻量级软传感(Soft-Sensing)库,核心实现差分时间导数软传感(Differential Temporal Derivative Soft-Sensing, DTDSS)算法。该库不依赖专用辐射计硬件,而是通过部…...