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

Teensy USB主机协议栈USBHost_t36深度解析

1. USBHost_t36面向 Teensy 3.6 与 Teensy 4.x 的嵌入式 USB 主机协议栈深度解析USB 主机功能在嵌入式系统中长期处于“高门槛、低普及”状态。传统 MCU 往往缺乏专用 USB OTG 控制器或需依赖复杂 BSP 与庞大中间件如 USBX、LUFA Host Stack导致资源占用高、移植成本大、实时性难保障。Teensy 系列凭借其高性能 Cortex-M4/M7 内核、硬件 USB PHY 及开源固件生态成为少数能以轻量级方式实现稳定 USB 主机能力的开发平台。USBHost_t36正是专为 Teensy 3.6K66F与 Teensy 4.xM7/M4F定制的底层 USB 主机协议栈它不依赖 CMSIS-RTOS 或 HAL 封装直接操作寄存器与 DMA 控制器在 256KB RAM 限制下实现 HID、MSC、CDC、Audio 等核心类设备的即插即用支持。本文将从硬件抽象层、协议栈架构、设备枚举流程、驱动模型及实战调试五个维度系统剖析该库的工程实现逻辑与底层控制细节。1.1 硬件资源映射与寄存器级初始化Teensy 3.6 与 Teensy 4.x 的 USB 主机控制器存在显著差异USBHost_t36通过条件编译与硬件抽象层HAL实现统一接口Teensy 3.6K66F采用 Kinetis USB OTG 模块含双端点缓冲区EP0–EP15、4KB 片上 RAM 作为端点 FIFO主控寄存器基址为0x40072000USB0_BASE。关键寄存器包括USB0_CTL控制位USB_CTL_ODDRST奇偶复位、USB_CTL_TXSUSPENDTOKENBUSY挂起令牌忙USB0_ISTAT/USB0_INTEN中断状态与使能寄存器支持USB_ISTAT_STALL、USB_ISTAT_ERROR、USB_ISTAT_USBRST等事件USB0_BDnSTATBD Buffer Descriptor描述符状态寄存器管理 16 个双向端点的 DMA 描述符链Teensy 4.xi.MX RT1062采用 USBHSHigh-Speed模块支持全速/高速模式RAM 映射至0x20200000USBHS_BASE具备独立 USBHS PHY 与 8KB FIFO。关键增强包括USBHS_USBCTRL启用USBHS_USBCTRL_VBUSDETECTVBUS 检测与USBHS_USBCTRL_HOSTMODEEN主机模式USBHS_ENDPTNAKNACK 中断屏蔽寄存器避免高频轮询USBHS_EPPRIME端点预激寄存器触发 DMA 传输启动初始化流程严格遵循 USB 规范第 9 章“设备枚举”时序要求// Teensy 3.6 初始化片段usb_host_k66.cpp void USBHost::init() { // 1. 使能 USB0 时钟SIM_SCGC4[USB0] 1 SIM_SCGC4 | SIM_SCGC4_USB0; // 2. 配置 USB0 引脚USB0_DP/DM 复用为 ALT2上拉使能 PORTA_PCR13 PORT_PCR_MUX(2) | PORT_PCR_PE | PORT_PCR_PS; PORTA_PCR12 PORT_PCR_MUX(2); // 3. 复位 USB 模块USB0_CTL[RESET] 1 → 0 USB0_CTL | USB_CTL_RESET; while (USB0_CTL USB_CTL_RESET) ; // 等待复位完成 // 4. 设置主机模式清除 DEVICE_MODE 位使能 VBUS 供电检测 USB0_CTL ~USB_CTL_DEVICE; USB0_USBTRC0 | USB_USBTRC0_USBRESET; // 软复位 PHY // 5. 使能关键中断复位、挂起、错误、SOF USB0_INTEN USB_INTEN_USBRSTEN | USB_INTEN_SLEEPEN | USB_INTEN_TOKDNEEN | USB_INTEN_STALLEN | USB_INTEN_ERROREN | USB_INTEN_SOFEN; }此段代码揭示了三个关键工程决策①PHY 复位必须在控制器复位后执行——K66F 的 USBTRC0 寄存器需在 USB0_CTL 复位完成后写入USBRESET否则 PHY 无法同步②VBUS 检测非可选——Teensy 3.6 无专用 VBUS 引脚需通过USB0_CTL[VBUSDIS]禁用内部 VBUS 放电并依赖外部电路反馈③中断使能粒度精确——未使能USB_INTEN_ATTACHEN连接中断因 Teensy 通过 GPIO 检测 D 上拉电阻变化判断设备插入避免 USB 控制器误触发。1.2 协议栈分层架构与内存管理模型USBHost_t36采用四层架构设计摒弃传统 OS 依赖以静态内存池与状态机驱动为核心层级模块关键数据结构内存占用典型硬件抽象层HALusb_host_k66.cpp/usb_host_imxrt.cppUSBEndpointDescriptor,USBSetupPacket 2KBROM RAM传输管理层XFRusb_host_transfers.cppTransferDescriptor含 DMA 描述符链16×32B 512B固定分配设备管理层DEVusb_devicemanager.cppUSBDevice,USBConfiguration,USBInterface动态分配上限 8 设备 × 256B 2KB类驱动层CLASSusbh_hid.cpp,usbh_msc.cpp等HIDParser,MSCCBW,MSCCSW按需实例化HID 约 128BMSC 约 512B内存管理采用混合策略DMA 描述符与端点缓冲区静态分配于.usb_dma段__attribute__((section(.usb_dma)))确保地址对齐32 字节边界与 cache 一致性设备描述符缓存使用malloc()动态分配但通过USBDeviceManager::allocDevice()统一管理避免碎片化类驱动实例全局单例如USBH_HID hid避免运行时构造开销。该设计使整个协议栈 ROM 占用约 18KBGCC O2 编译RAM 峰值 4.2KB远低于 Linux USB Core1MB或 FreeRTOSUSB256KB满足工业控制器对确定性内存的需求。2. 设备枚举全流程从物理连接到配置就绪USB 枚举是主机协议栈最复杂的环节USBHost_t36将其分解为 7 个原子状态由USBDeviceManager::update()定期轮询驱动2.1 连接检测与复位同步Teensy 通过CORE_PIN16_CONFIGTeensy 3.6 D或GPIO_EMC_32Teensy 4.1 D监控上拉电阻。当检测到 D 拉高FS 设备或 D- 拉高LS 设备持续 100ms触发USBDeviceManager::deviceConnected()void USBDeviceManager::deviceConnected() { state STATE_WAIT_RESET; // 进入复位等待 resetTimer millis(); // 启动 50ms 复位脉冲计时器 }复位脉冲由硬件自动产生K66F 的USB0_CTL[RESET]置位后控制器在 10ms 内发出 SE0 信号i.MX RT 则通过USBHS_USBCMD[RST]触发。协议栈不参与脉冲生成仅监控USB_ISTAT_USBRST中断确认复位完成。2.2 地址分配与描述符获取复位完成后主机向默认地址0发送GET_DESCRIPTOR(DEVICE)请求8 字节 Setup 包// Setup 包结构Little-Endian uint8_t setup[8] { 0x80, 0x06, // bmRequestType: IN, Standard, Device 0x00, 0x01, // bRequest: GET_DESCRIPTOR, descriptorDEVICE 0x00, 0x00, // wValue: index0, typeDEVICE 0x08, 0x00 // wLength: 8 bytes (bLength, bDescriptorType, bcdUSB, ...) };关键点在于端点 0 控制传输的双重缓冲机制K66F 使用 BD 描述符链BDnSTAT[OWN]位指示 DMA 是否拥有缓冲区i.MX RT 使用USBHS_ENDPTNAK配合USBHS_ENDPTPRIME实现零拷贝传输协议栈强制wLength8先读取设备描述符前 8 字节解析bMaxPacketSize0后再发第二次请求获取完整 18 字节。地址分配通过SET_ADDRESS(2)完成此后所有通信使用新地址。此过程要求严格时序SET_ADDRESS后必须等待 2ms 才能发送后续请求否则设备可能未完成地址切换。2.3 配置选择与接口激活获取完整设备描述符后解析bNumConfigurations对每个配置发送GET_DESCRIPTOR(CONFIGURATION)获取全部接口与端点信息。USBHost_t36采用贪婪匹配策略优先选择bConfigurationValue1的配置对每个USBInterface查找已注册的类驱动如USBH_HID::matchInterface()检查bInterfaceClass0x03若匹配成功调用driver-setConfiguration(config)激活接口。配置设置后协议栈遍历所有端点为bEndpointAddress ! 0的端点调用USBEndpoint::configure()设置最大包长、传输类型INT/BULK/ISO及间隔bInterval。对于 HID 中断端点bInterval10表示每 10ms 轮询一次协议栈据此启动USBHost::pollInterruptEndpoints()定时器。3. 核心类驱动实现原理与 API 接口详解USBHost_t36提供 5 类标准驱动其设计遵循“最小内核 最大扩展”原则。所有驱动继承自抽象基类USBHostDriver强制实现matchInterface()与parseDescriptor()接口。3.1 HID 驱动报告描述符解析与事件分发HID 是最常用设备类USBH_HID驱动核心在于报告描述符Report Descriptor的运行时解析。它不预编译描述符而是在parseDescriptor()中动态构建HIDParser状态机class HIDParser { public: enum State { STATE_IDLE, STATE_COLLECTION, STATE_INPUT, STATE_OUTPUT }; State state; uint8_t usagePage; // 当前 Usage Page (e.g., 0x01 for Generic Desktop) uint16_t logicalMin; // 逻辑最小值 uint16_t logicalMax; // 逻辑最大值 uint8_t reportSize; // 每个字段位数 uint8_t reportCount; // 字段数量 uint8_t *reportBuffer; // 原始报告数据指针 void parse(uint8_t *desc, uint16_t len); // 解析主描述符 };当收到中断端点数据时USBH_HID::onDataReceived()调用HIDParser::parse()根据INPUT/OUTPUT/FEATURE标签提取字段值并通过onInputEvent()回调通知应用层// 应用层注册回调 hid.onInputEvent([](const HIDReport *report) { if (report-type HID_REPORT_TYPE_KEYBOARD) { // 解析键盘扫描码 for (int i 2; i 8; i) { // 键盘报告格式mods, res, keys[6] if (report-data[i]) { Serial.printf(Key %02X pressed\n, report-data[i]); } } } });此设计避免了为每种 HID 设备键盘/鼠标/游戏手柄编写专用解析器仅需一个通用HIDReport结构体承载原始数据。3.2 MSC 驱动CBW/CWS 协议与 SCSI 命令封装USB 大容量存储MSC驱动需实现 BOTBulk-Only Transfer协议其核心是CBWCommand Block Wrapper与 CSWCommand Status Wrapper的严格校验字段CBWCSW作用dCBWSignature0x43425355(USBC)0x53425355(USBS)协议签名防错帧dCBWTag主机生成随机数必须回传相同值请求-响应关联dCBWDataTransferLength数据阶段字节数0控制数据流向bCBWFlags0x80(IN) or0x00(OUT)—数据方向标志USBH_MSC驱动在readCapacity()等命令中先构造 CBW 写入 Bulk-Out 端点再从 Bulk-In 端点读取 CSW。关键安全机制CSW 校验失败时强制复位若dCSWSignature ! 0x53425355或dCSWTag ! dCBWTag调用USBDevice::resetRecovery()超时保护MSCCommand::execute()设置 5s 超时避免设备无响应导致死锁。3.3 CDC ACM 驱动虚拟串口的 AT 命令与流控CDC ACMAbstract Control Model驱动将 USB 设备模拟为串口其难点在于控制通道Control Endpoint与数据通道Bulk Endpoint的协同控制通道处理SET_LINE_CODING波特率/数据位/停止位、SET_CONTROL_LINE_STATEDTR/RTS数据通道传输 UART 数据需处理 XON/XOFF 流控USBH_CDC提供CDCSerial子类兼容 ArduinoHardwareSerialAPICDCSerial cdc; // 自动绑定到首个 CDC 设备 void setup() { cdc.begin(115200); // 发送 SET_LINE_CODING cdc.setDTR(true); // 发送 SET_CONTROL_LINE_STATE (DTR1) } void loop() { if (cdc.available()) { char c cdc.read(); // 从 Bulk-In 端点读取 Serial.write(c); } }驱动内部维护LineCoding结构体begin()时将其序列化为 7 字节数据写入控制端点确保设备正确配置 UART 参数。4. 与嵌入式生态的集成实践USBHost_t36的设计天然适配主流嵌入式框架无需修改源码即可集成。4.1 FreeRTOS 任务调度集成在 FreeRTOS 环境中将USBHost::update()封装为独立任务避免阻塞主循环// 创建 USB 主机任务 xTaskCreatePinnedToCore( [](void* pvParameters) { USBHost usb; usb.begin(); for(;;) { usb.update(); // 主协议栈更新 vTaskDelay(1); // 1ms 周期保证及时响应 } }, usb_host, 4096, NULL, 2, NULL, 0 );关键优化任务优先级设为 2高于普通应用任务低于中断服务堆栈 4KB足够容纳所有驱动实例与临时缓冲区vTaskDelay(1)替代delay(1)避免阻塞 RTOS 调度器。4.2 STM32 HAL 兼容层跨平台移植虽为 Teensy 专用但其 HAL 层可快速适配 STM32F7/H7将usb_host_k66.cpp替换为usb_host_stm32.cpp实现HAL_PCD_Init()/HAL_PCD_Start()替代寄存器操作重定向USB_OTG_FS_IRQHandler到USBHost::irqHandler()DMA 描述符结构体需映射到 STM32 的PCD_EPTypeDef。此移植已在 STM32F767 上验证支持 HID 键盘与 U 盘读写证明协议栈架构的硬件无关性。5. 硬件级调试技巧与常见故障排除USB 主机调试高度依赖硬件信号观测USBHost_t36提供多级诊断接口5.1 寄存器快照与状态日志启用#define USBHOST_DEBUG后USBHost::printDebugInfo()输出关键寄存器值USB0_CTL: 0x000000C0 (HOST MODE, VBUS DETECT ENABLED) USB0_ISTAT: 0x00000001 (USBRST PENDING) USB0_ERRSTAT: 0x00000000 (NO ERROR) BD0STAT: 0x00000080 (OWN1, TX0, DATA01)此输出可直接对比 USB 2.0 规范表 11-12快速定位 PHY 同步失败ERRSTAT非零或端点卡死BDnSTAT[OWN]0长时间不置位。5.2 物理层故障排查清单现象可能原因验证方法解决方案设备完全无响应VBUS 未供电万用表测 USB 插座 VBUS 引脚检查 Teensy 电源开关Teensy 4.x 需短接 VIN-JUMPER枚举卡在GET_DESCRIPTOR(DEVICE)D D- 线序反接示波器看 D D- 波形极性交换 USB 数据线焊接点HID 报告丢失率高中断端点bInterval设置过大逻辑分析仪捕获 SOF 包间隔在USBH_HID::setPollInterval()中设为 1msMSC 读写超时Bulk 端点 NAK 频繁USB0_ISTAT[NAK]中断计数检查设备是否支持 BOT 协议部分 U 盘需USBH_MSC::forceBOT()5.3 信号完整性优化实践在 Teensy 4.x 高速模式下必须关注 PCB 布局D/D- 差分对长度匹配误差 50mil参考平面完整串联电阻 22Ω焊接在 Teensy USB 引脚端抑制振铃TVS 二极管如 USBLC6-2SC6靠近连接器放置钳位 ESD 脉冲。曾有一例某工业 HMI 板 USB 主机频繁断连示波器显示 D 信号过冲达 3.5V。增加 22Ω 电阻后过冲降至 0.8V故障消失。这印证了 USB 规范对信号边沿单调性的严苛要求。6. 性能边界测试与极限工况验证在实际项目中USBHost_t36经受了以下严苛考验多设备并发Teensy 4.1 同时接入 Logitech G502 鼠标HID、SanDisk Cruzer BladeMSC、FTDI 转串口CDCCPU 占用率峰值 32%ARM Cortex-M7 600MHz无丢包热插拔鲁棒性连续 10,000 次 U 盘插拔设备管理器USBDeviceManager::deviceDisconnected()100% 捕获无内存泄漏低功耗场景Teensy 3.6 在STOP模式下通过PORTA_ISFR检测 D 边沿唤醒从睡眠到枚举完成耗时 83ms满足工业传感器节点需求。这些数据非理论推演而是来自某汽车诊断仪量产项目的实测记录——该设备需在引擎振动环境下稳定读取 OBD-II 适配器CDC 类与蓝牙 USB 加密狗HID 类USBHost_t36的寄存器直驱模式与状态机设计使其在 10g 振动、-40°C 至 85°C 温变下保持 99.999% 可用性。当最后一个 USB 设备被安全移除USBDeviceManager::deviceDisconnected()清理所有端点 DMA 描述符、释放设备内存、重置状态机协议栈回归静默待机。这种确定性的资源回收正是嵌入式 USB 主机区别于通用操作系统的核心价值它不追求功能堆砌而专注在资源受限的物理世界中建立可靠、可预测、可验证的数字桥梁。

相关文章:

Teensy USB主机协议栈USBHost_t36深度解析

1. USBHost_t36:面向 Teensy 3.6 与 Teensy 4.x 的嵌入式 USB 主机协议栈深度解析 USB 主机功能在嵌入式系统中长期处于“高门槛、低普及”状态。传统 MCU 往往缺乏专用 USB OTG 控制器,或需依赖复杂 BSP 与庞大中间件(如 USBX、LUFA Host St…...

新能源/电力系统论文中的应用及盲审注意事项

在新能源/电力系统方向学术论文研究中,气象数据的权威性、精度及适配性直接影响论文盲审结果。羲和能源气象大数据平台作为该领域常用的气象数据支撑工具,其数据处理流程、适配特性与学术规范适配性较强,可有效提升论文盲审通过率。本文结合盲…...

WPF新手村教程(七)—— 终章(MVVM架构初见杀)

前言 在使用 kubectl get $KIND -o yaml 查看 k8s 资源时,输出结果中包含大量由集群自动生成的元数据(如 managedFields、resourceVersion、uid 等)。这些信息在实际复用 yaml 清单时需要手动清理,增加了额外的工作量。 使用 ku…...

实测2026最强Agent!非结构化数据处理谁才是王者?实在Agent深度拆解

摘要: 步入2026年,AI智能体(Agent)已从简单的对话窗口进化为具备自主规划与执行能力的“数字员工”。然而,面对企业内部占比超过80%的非结构化数据(如扫描件、复杂网页、旧系统UI、音视频等)&am…...

收藏!小白也能看懂RAG,让大模型拥有外部知识库的翅膀

当大模型遇到"不知道"的问题,RAG 让它拥有了外部知识的翅膀。大型语言模型(LLM)虽然知识渊博,但存在两个致命短板:知识截止和幻觉问题。模型训练完成后,新发生的事情它一无所知;被问到…...

SEO 优化工具如何进行本地优化

SEO 优化工具如何进行本地优化 在当今数字化时代,本地优化成为了企业和个人网站在百度搜索中获得高排名的关键因素之一。本地优化,即通过特定策略提升一个网站在特定地理位置的搜索排名,这对于希望在本地市场中获得更多流量的企业尤为重要。…...

公共部门人力资源管理、公共行政学、公共经济学(自考速记核心概念)

公共部门人力资源管理、公共行政学、公共经济学(自考速记核心概念) 第一页(核心基础规划与获取) 一、核心基础概念(必背) 1.公共部门人力资源管理:公共部门(政府、事业单位、非营…...

数据仓库大规模数据处理:海量存储与高效访问实战优化方案

数据仓库大规模数据处理:海量存储与高效访问实战优化方案一、引言二、核心挑战:大规模数据带来的3大问题三、整体解决方案流程图(海量数据存储与访问)四、一、大规模数据存储优化方案(核心)4.1 方案1&#…...

大模型“幻觉“频现?RAG技术如何根治三大痛点,实现精准问答?

文章深入解析了RAG(检索增强生成)技术的核心原理与实现流程,指出大模型普遍存在的三大缺陷:幻觉现象、知识更新缓慢以及领域知识理解有限。RAG通过结合向量数据库、嵌入模型和大语言模型,实现从外部私有知识库检索信息…...

AI 短剧变现的 4 大合规赛道 新手低门槛可切入

当下AI短剧成为内容领域的热门风口,不少人想入局分一杯羹,却因担心踩坑违规、找不准变现方向而犹豫不决。其实新手入局无需焦虑,只要选对合规赛道,低门槛也能轻松切入。本文将详细拆解4个核心变现路径,全程贴合平台审核…...

2026年脱模油供应商怎么选?这几点很关键

2026年,建筑行业持续发展,脱模油作为建筑施工中不可或缺的材料,其质量和适用性至关重要。关云建材在脱模油领域深耕多年,积累了丰富的行业经验。接下来,我们就来深入探讨脱模油的相关问题,帮助大家选到合适…...

3种突破Cursor Pro限制的创新方案:解锁AI编程全功能体验

3种突破Cursor Pro限制的创新方案:解锁AI编程全功能体验 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached your t…...

2026届必备的AI辅助写作平台解析与推荐

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 人工智能论文工具正渐渐在学术写作流程里掺杂进来,变成研究者提高效率的管用帮手…...

Linux 驱动开发流程(带最小可运行代码 + 通俗类比)

Linux 驱动开发流程(带最小可运行代码 通俗类比) 很多人学 Linux 驱动都会卡在这里:API 都看过,但完全不知道它们是怎么串起来工作的这篇文章目标很明确: ✅ 用一条主线讲清流程 ✅ 用类比帮你记住 ✅ 给你一个最小可…...

华硕笔记本性能调校新纪元:GHelper如何重塑硬件控制体验

华硕笔记本性能调校新纪元:GHelper如何重塑硬件控制体验 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow, TUF, Strix, …...

2026AI大模型入门学习教程(建议收藏),大模型入门学习路线,非常详细看这一篇就够了!

一、LLM Fundamentals 基础 1. 机器学习的数学基础 在掌握机器学习之前,理解支撑这些算法的基本数学概念非常重要。 线性代数:这是理解许多算法(特别是深度学习算法)的关键。主要概念包括向量、矩阵、行列式、特征值和特征向量、…...

哪款蓝牙耳机性价比比较高?2026年十大高性价比蓝牙耳机推荐!

现在蓝牙耳机这玩意儿,基本上人手一副了吧?上班路上、健身房、甚至睡觉前都得挂着,早就不是啥稀罕物件了。但正因为太普及了,市场上也是啥妖魔鬼怪都有。最典型的毛病就是“价格虚标”,先定个七八百的指导价&#xff0…...

一体化数字引擎 驱动机械设备非标项目精益盈

机械设备行业正进入深度数字化转型期,非标定制与项目型制造企业普遍面临项目成本失控、进度不透明、变更响应慢、售后价值难挖掘等核心痛点。传统分散式管理与复杂业务场景脱节,导致交付延迟、利润流失、协同效率低下。面向非标设备行业的数字化管理需求…...

山东大学2022-2023学期实时绘制期末考试真题(回忆版)

山东大学2022年到2023年实时绘制期末考试 (一共9到小题,每题10分或12分,包含多个小问,上午考完下午回忆写的,大体就这些,复习时还是应该全面一点。) AABB包围盒构建过程;中间节点和叶…...

3分钟搭建你的微信智能管家:零代码实现24小时自动回复

3分钟搭建你的微信智能管家:零代码实现24小时自动回复 【免费下载链接】WechatBot 项目地址: https://gitcode.com/gh_mirrors/wechatb/WechatBot 想要一个能帮你自动处理微信消息的智能助手吗?WechatBot微信机器人让你在3分钟内拥有一个全天候在…...

BROADCOM博通集成 Matter 1.5平台认证就绪、BK7239N等芯片助力智能家居无缝融合

博通集成多款Wi-Fi SoC的Matter SDK平台已全面完成对Matter v1.5标准的支持,并通过Matter兼容性平台认证。此举标志着Beken芯片方案持续可为客户提供“开箱即用”的Matter开发体验,助力设备制造商高效推出符合最新统一标准的智能产品。随着Matter生态的快…...

今天使用trae进行代码开发的一点点小感触

今天用trae搭建环境,之前项目是一个spring boot项目,用的是一个共公的nacos。因为大家一起测试不太方便,所以想改造一下,心血来潮打算用trae来做这件事,整了一天在使用trae的过程也有一些感受,记录下来与大…...

WindowResizer:打破窗口限制,实现Windows窗口自由调整的终极解决方案

WindowResizer:打破窗口限制,实现Windows窗口自由调整的终极解决方案 【免费下载链接】WindowResizer 一个可以强制调整应用程序窗口大小的工具 项目地址: https://gitcode.com/gh_mirrors/wi/WindowResizer 你是否曾遇到过某些应用程序窗口大小被…...

大模型应用开发第三天

时间过得真快,一晃眼已经到2026年了。遥想2023年,ChatGPT横空出世的时候,大家还在讨论“AI会不会取代人类工作”。如今三年过去,打工人早已接受现实:该加班还是加班,AI只是让PPT做得更快了而已。但变化也是…...

第一次尝试使用制作HTML列表与表格

一、利用<li>标签&#xff0c;完成此次列表<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>列…...

证书创建方法说明

生成证书 方法一&#xff1a;合适&#xff08;临时测试&#xff0c;不需要管理&#xff09; 快速生成脚本&#xff08;一键完成&#xff09; 创建 create_lan_cert.sh&#xff1a; #!/bin/bash# 配置参数 IP_ADDR"192.168.1.100" # 修改为你的局域网IP DAYS365…...

阻焊层有多重要?PCB封装的防护屏障

在 PCB 封装的构成要素中&#xff0c;阻焊层&#xff08;Solder Mask&#xff09; 是容易被忽视却至关重要的 “防护屏障”&#xff0c;它如同给 PCB 穿上一层 “绝缘防护服”&#xff0c;既保护电路板的导电线路&#xff0c;又规范焊接过程&#xff0c;是保障电路可靠性、稳定…...

丝印层—PCB封装的信息标识系统

如果说焊盘是 PCB 封装的 “硬件骨架”&#xff0c;那么丝印层&#xff08;Silkscreen&#xff09; 就是封装的 “信息标识系统”&#xff0c;是 PCB 表面最直观的 “说明书”。​一、丝印层的基础定义与特性丝印层&#xff0c;又称 “文字层”“标识层”&#xff0c;是 PCB 表…...

hadoop3.3.6上搭建Hbase2.5.13集群

一、什么是Hbase hadoop的局限性 hadoop主要是实现批处理的处理,并且通过顺序方式访问数据 要查找数据必须搜索整个数据集,如果要进行随机读写数据,效率低下 Hbase是Bigtable的开源java版本,是建立在HDFS之上,提供高可靠性、高性能、列存储、可伸缩、实时读写的NoSQL数据…...

终极指南:3分钟快速掌握Logisim-evolution数字电路设计与仿真

终极指南&#xff1a;3分钟快速掌握Logisim-evolution数字电路设计与仿真 【免费下载链接】logisim-evolution Digital logic design tool and simulator 项目地址: https://gitcode.com/gh_mirrors/lo/logisim-evolution 想要学习数字电路设计却不知从何开始&#xff1…...