STM32F407上FreeRTOS与LwIP多中间件整合实战:避坑指南
简介这是一份面向嵌入式开发者的STM32F407综合实战工程整合FreeRTOS实时操作系统与LWIP协议栈并完成文件系统移植适合已具备一定STM32基础、希望打通网络通信与多任务调度的进阶学习者。工程以RMII接口搭配KSZ8031 PHY通过修改PHY寄存器地址即可适配其他型号PHY同时内置嵌入式WebServer用于整体功能验证另附IO、CAN、USART等外设测试程序可作为工业控制、物联网终端等场景的参考模板。压缩包共629个文件约17.25MB以155个h头文件与131个c源文件为核心代码辅以Keil工程配置、编译中间文件及少量说明文档结构完整便于二次开发。目前已有1005人学习下载。读者可从中获得FreeRTOS与LWIP协同移植的完整思路、PHY驱动适配方法、FATFS文件系统接入流程以及WebServer测试框架并借助CAN、USART等例程快速验证硬件是学习STM32F4网络与RTOS综合应用的实用参考。1. 一块 F407 上塞进七个中间件这套组合到底在解决什么问题如果你手头有一块 STM32F407 的开发板上面挂着 KSZ8031 以太网 PHY、SD 卡槽、DS18B20 温度传感器、CAN 收发器还要跑 FreeRTOS 和 LwIP那这篇文章就是写给你的。这套组合的典型场景是工业数据采集网关通过 18B20 采集现场温度通过 CAN 总线读取设备状态通过 USART 对接上位机或调试终端通过 SD 卡做本地数据存储通过以太网把数据推到远端服务器所有任务由 FreeRTOS 调度。听起来每个模块单独用都不难但把它们塞进同一颗芯片、同一套 RTOS 里问题就来了——PHY 初始化不成功、LwIP 跑着跑着就断、SD 卡和以太网抢总线、CAN 中断优先级和 RTOS 调度打架。我前后做过三版类似的板子第一版调了将近两周才让以太网稳定收发第二版才把 SDIO 和 LwIP 的冲突理清楚。下面按“先跑通单个模块再整合最后调稳定性”的路径把每一步的命令、参数和踩坑点讲清楚。2. 从裸机到 FreeRTOS任务划分与优先级怎么定2.1 为什么不能把所有逻辑塞进一个任务很多人第一次用 FreeRTOS 会习惯性地创建一个任务然后在里面轮询所有外设。这种做法在功能验证阶段能跑但一旦加上 LwIP 和 SD 卡写入就会出现“以太网收包不及时导致丢包”或者“SD 卡写入阻塞导致 CAN 报文溢出”的问题。正确的做法是按数据流和实时性要求拆任务。我一般会拆成这几个任务以太网接收任务优先级最高因为 LwIP 的ethernetif_input需要及时处理、CAN 接收任务次高CAN 报文有硬件缓冲区但溢出后不可恢复、温度采集任务低频1 秒一次即可、SD 卡写入任务低优先级但需要较大的栈、USART 命令解析任务中等优先级响应上位机指令。优先级数值越大优先级越高在FreeRTOSConfig.h里配置configMAX_PRIORITIES至少为 8。// 任务优先级定义数值越大优先级越高 #define TASK_PRIO_ETH_RX 6 // 以太网接收必须最高 #define TASK_PRIO_CAN_RX 5 // CAN 接收次高 #define TASK_PRIO_USART_CMD 4 // 串口命令解析 #define TASK_PRIO_TEMP 3 // 温度采集 #define TASK_PRIO_SD_WRITE 2 // SD 卡写入最低 // 任务栈大小单位是 word4 字节 // LwIP 相关任务栈要 512 以上SD 卡写入因为用了 FATFS 也要 512 #define TASK_STACK_ETH_RX 512 #define TASK_STACK_CAN_RX 256 #define TASK_STACK_USART 256 #define TASK_STACK_TEMP 256 #define TASK_STACK_SD_WRITE 512这里的关键参数是栈大小。LwIP 的tcpip_thread和ethernetif_input如果栈不够会直接进 HardFault而且这种 HardFault 往往在运行几分钟后才出现调试起来很痛苦。我的经验是凡是调用 LwIP API 的任务栈至少 512 word凡是调用f_write的任务栈至少 512 word因为 FATFS 内部有较深的调用链。2.2 中断优先级与 FreeRTOS 的配合STM32F407 的中断优先级分组必须设置为NVIC_PRIORITYGROUP_4即 4 位抢占优先级、0 位子优先级。FreeRTOS 的configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY一般设为 5意味着抢占优先级高于 5 的中断不能调用FromISR结尾的 API。以太网和 CAN 的中断优先级要设得比这个值低数值大否则xQueueSendFromISR会触发断言。// 在 main 里最先调用设置中断优先级分组 HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4); // 以太网中断优先级抢占优先级设为 6允许调用 FromISR API HAL_NVIC_SetPriority(ETH_IRQn, 6, 0); HAL_NVIC_EnableIRQ(ETH_IRQn); // CAN 接收中断优先级设为 7 HAL_NVIC_SetPriority(CAN1_RX0_IRQn, 7, 0); HAL_NVIC_EnableIRQ(CAN1_RX0_IRQn);注意如果以太网中断优先级设成 4 或更高xQueueSendFromISR会直接触发configASSERT死循环现象是程序卡在vPortValidateInterruptPriority里出不来。3. RMII 接口驱动 KSZ8031从 PHY 复位到 ping 通3.1 硬件连接检查与 GPIO 配置RMII 模式下STM32F407 的 PA1 是 REF_CLKPA2 是 MDIOPA7 是 RMII_CRS_DVPC1 是 MDCPC4 是 RMII_RXD0PC5 是 RMII_RXD1PG11 是 RMII_TX_ENPG13 是 RMII_TXD0PG14 是 RMII_TXD1。KSZ8031 需要 50MHz 参考时钟通常由 STM32 的 PA8 通过 MCO1 输出或者由外部晶振提供。我用的板子是 PA8 输出 50MHz 给 PHY。// 使能 GPIO 时钟 __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_GPIOC_CLK_ENABLE(); __HAL_RCC_GPIOG_CLK_ENABLE(); // 配置 PA8 为 MCO1 输出 50MHz GPIO_InitTypeDef gpio {0}; gpio.Pin GPIO_PIN_8; gpio.Mode GPIO_MODE_AF_PP; gpio.Pull GPIO_NOPULL; gpio.Speed GPIO_SPEED_FREQ_VERY_HIGH; gpio.Alternate GPIO_AF0_MCO; HAL_GPIO_Init(GPIOA, gpio); // 配置 MCO1 时钟源为 HSE分频系数根据晶振频率计算 // 假设 HSE 为 8MHz要输出 50MHz 需要 PLL 配置这里用 PLLI2S 或直接旁路 // 更常见的做法是 PHY 用独立 50MHz 晶振PA8 不输出 HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_HSE, RCC_MCODIV_1);如果 PHY 有独立的 50MHz 晶振PA8 就不需要配置为 MCO。这一点在画板子时就要确认否则调试时发现 PHY 没有时钟会浪费很多时间。3.2 PHY 复位与 LwIP 初始化顺序KSZ8031 的复位引脚通常接在某个 GPIO 上复位时序要求至少保持 10ms 低电平然后拉高等待 100ms 以上再访问 PHY 寄存器。LwIP 的ethernetif_init里会调用LAN8720_Init类似的 PHY 初始化函数但 KSZ8031 的寄存器地址和 LAN8720 不同需要自己写。// PHY 复位假设复位引脚接在 PD3 void KSZ8031_Reset(void) { HAL_GPIO_WritePin(GPIOD, GPIO_PIN_3, GPIO_PIN_RESET); HAL_Delay(20); // 至少 10ms留余量 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_3, GPIO_PIN_SET); HAL_Delay(150); // 等待 PHY 内部稳定 } // 读取 PHY IDKSZ8031 的 ID 应该是 0x0022 开头 uint32_t KSZ8031_GetID(void) { uint32_t id 0; id ETH_ReadPHYRegister(0, PHY_REG_ID1); id (id 16) | ETH_ReadPHYRegister(0, PHY_REG_ID2); return id; }LwIP 的初始化顺序是lwip_init()→netif_add()→netif_set_default()→netif_set_up()。在netif_add时会调用ethernetif_init里面完成 PHY 复位和 MAC 配置。如果 PHY 没复位成功netif_set_up之后ping不通但netif状态显示 up这种“假 up”现象很常见。3.3 验证以太网通路的三个命令在 FreeRTOS 里跑 LwIP建议先用ping验证链路层和网络层。在 PC 端执行# 假设板子 IP 设为 192.168.1.100 ping 192.168.1.100 -t # 如果 ping 不通先看 ARP 表有没有板子的 MAC arp -a | findstr 192.168.1.100 # 用 Wireshark 抓包过滤条件 arp || icmp如果 ARP 请求发出去了但板子没回应说明以太网接收中断没进或者ethernetif_input没被调用。检查ETH_IRQHandler里是否调用了HAL_ETH_IRQHandler以及HAL_ETH_RxCpltCallback里是否给了信号量让接收任务处理。4. SDIO 挂 FATFS 与 LwIP 共存总线冲突和 DMA 陷阱4.1 SDIO 初始化与 FATFS 挂载STM32F407 的 SDIO 外设支持 4 位宽总线但和以太网共用 DMA 控制器时会有冲突。SDIO 的时钟分频在SDIO_INIT_CLK_DIV里设置初始化阶段不能超过 400kHz初始化完成后可以提高到 24MHz 或 48MHz。// SDIO 初始化注意 DMA 和中断优先级 void SDIO_Init(void) { hsd.Instance SDIO; hsd.Init.ClockEdge SDIO_CLOCK_EDGE_RISING; hsd.Init.ClockBypass SDIO_CLOCK_BYPASS_DISABLE; hsd.Init.ClockPowerSave SDIO_CLOCK_POWER_SAVE_DISABLE; hsd.Init.BusWide SDIO_BUS_WIDE_4B; // 4 位宽 hsd.Init.HardwareFlowControl SDIO_HARDWARE_FLOW_CONTROL_ENABLE; hsd.Init.ClockDiv 2; // 48MHz / (22) 12MHz稳定后可改小 HAL_SD_Init(hsd); } // FATFS 挂载 FATFS fs; FRESULT fres; fres f_mount(fs, 0:, 1); // 1 表示立即挂载 if (fres ! FR_OK) { printf(f_mount failed: %d\r\n, fres); }f_mount的第三个参数为 1 时会立即调用disk_initialize如果 SD 卡没插好或者 SDIO 初始化失败会返回FR_NOT_READY或FR_DISK_ERR。4.2 SDIO 和以太网共用 DMA 的冲突处理STM32F407 的 DMA1 和 DMA2 各有多个流。以太网 MAC 使用 DMA 自己的专用通道不占用 DMA1/DMA2 的流但 SDIO 使用 DMA2 的某个流。如果 LwIP 的memcpy和 SDIO 的 DMA 同时访问总线矩阵会出现偶发的数据错误。我的做法是SD 卡写入任务在调用f_write前获取一个互斥量确保同一时间只有一个任务在操作 SDIO。// SD 卡操作互斥量 SemaphoreHandle_t xSDMutex; // 写入任务里 if (xSemaphoreTake(xSDMutex, pdMS_TO_TICKS(1000)) pdTRUE) { fres f_open(fil, 0:/data.csv, FA_OPEN_ALWAYS | FA_WRITE); if (fres FR_OK) { f_lseek(fil, f_size(fil)); // 追加到末尾 f_printf(fil, %lu,%d.%d\r\n, tick, temp_int, temp_dec); f_close(fil); } xSemaphoreGive(xSDMutex); } else { // 获取互斥量超时记录错误 }注意f_printf在 FATFS 里默认可能没使能需要在ffconf.h里把_FS_READONLY设为 0_USE_STRFUNC设为 1 或 2。4.3 掉电保护和文件系统一致性工业现场经常直接断电FATFS 在写入过程中断电会导致文件系统损坏。我一般会定期调用f_sync并且在写入完成后关闭文件。如果对可靠性要求高可以加一个超级电容或者铁电存储器做掉电检测检测到掉电后立即f_sync并关闭文件。// 掉电检测中断优先级设为最高 void PVD_IRQHandler(void) { if (__HAL_PWR_GET_FLAG(PWR_FLAG_PVDO)) { // 立即同步文件系统 f_sync(fil); f_close(fil); // 停止所有写入任务 vTaskSuspend(xSDWriteTaskHandle); } }5. 18B20、CAN、USART 的整合时序、过滤器和中断5.1 18B20 的微秒级时序与 RTOS 调度冲突DS18B20 是单总线器件复位脉冲要求拉低至少 480us读写时隙在 60us 左右。在 FreeRTOS 里如果用vTaskDelay做延时最小精度是 1 个 tick通常 1ms完全不够。必须用DWT或者TIM做微秒级延时。// 用 DWT 做微秒延时 void DWT_Delay_us(uint32_t us) { uint32_t start DWT-CYCCNT; uint32_t cycles us * (SystemCoreClock / 1000000); while ((DWT-CYCCNT - start) cycles); } // 18B20 复位 uint8_t DS18B20_Reset(void) { uint8_t presence; GPIO_InitTypeDef gpio {0}; gpio.Pin GPIO_PIN_0; gpio.Mode GPIO_MODE_OUTPUT_OD; gpio.Pull GPIO_NOPULL; gpio.Speed GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOB, gpio); HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET); DWT_Delay_us(500); HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET); DWT_Delay_us(70); presence HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0); DWT_Delay_us(430); return presence; }在读取温度时要关中断或者用互斥量保护整个时序否则一个中断进来就会打乱时隙。我的做法是把 18B20 的读取放在一个低优先级任务里读取前taskENTER_CRITICAL()读完后taskEXIT_CRITICAL()临界区大约 1ms对系统实时性影响可接受。5.2 CAN 过滤器配置与接收队列STM32F407 的 CAN1 有 28 个过滤器组可以配置为掩码模式或列表模式。工业场景下通常只接收特定 ID 的报文用掩码模式更灵活。// CAN 过滤器配置接收 ID 为 0x100~0x1FF 的标准帧 CAN_FilterTypeDef filter {0}; filter.FilterBank 0; filter.FilterMode CAN_FILTERMODE_IDMASK; filter.FilterScale CAN_FILTERSCALE_32BIT; filter.FilterIdHigh 0x100 5; // 标准帧 ID 左移 5 位 filter.FilterIdLow 0; filter.FilterMaskIdHigh 0x700 5; // 掩码0x700 表示高 3 位必须匹配 filter.FilterMaskIdLow 0; filter.FilterFIFOAssignment CAN_RX_FIFO0; filter.FilterActivation ENABLE; HAL_CAN_ConfigFilter(hcan1, filter); // 启动 CAN HAL_CAN_Start(hcan1); HAL_CAN_ActivateNotification(hcan1, CAN_IT_RX_FIFO0_MSG_PENDING);在HAL_CAN_RxFifo0MsgPendingCallback里用xQueueSendFromISR把报文发给接收任务不要在中断里做解析。5.3 USART 命令解析与 DMA 接收USART 用 DMA 接收不定长数据时常用 IDLE 中断加 DMA 的方式。配置 DMA 为循环模式在 IDLE 中断里计算接收长度。// USART1 DMA 接收配置 uint8_t uart_rx_buf[256]; void USART1_Init(void) { // ... 省略 GPIO 和 USART 配置 HAL_UART_Receive_DMA(huart1, uart_rx_buf, sizeof(uart_rx_buf)); __HAL_UART_ENABLE_IT(huart1, UART_IT_IDLE); } // IDLE 中断处理 void USART1_IRQHandler(void) { if (__HAL_UART_GET_FLAG(huart1, UART_FLAG_IDLE)) { __HAL_UART_CLEAR_IDLEFLAG(huart1); uint32_t len sizeof(uart_rx_buf) - __HAL_DMA_GET_COUNTER(huart1.hdmarx); // 把数据发给命令解析任务 BaseType_t xHigherPriorityTaskWoken pdFALSE; xQueueSendFromISR(xUartQueue, len, xHigherPriorityTaskWoken); portYIELD_FROM_ISR(xHigherPriorityTaskWoken); } HAL_UART_IRQHandler(huart1); }6. 避坑与排查这套组合最容易翻车的五个地方6.1 以太网 ping 通但 TCP 连接不上现象PC 能 ping 通板子但用 TCP 调试工具连接板子的 8080 端口一直失败。原因通常是 LwIP 的tcpip_thread栈溢出或者MEMP_NUM_TCP_PCB设得太小。解决把lwipopts.h里的MEMP_NUM_TCP_PCB从默认的 5 改成 10TCPIP_THREAD_STACKSIZE从 1024 改成 2048。6.2 SD 卡写入一段时间后返回 FR_DISK_ERR现象系统运行几分钟后f_write开始返回FR_DISK_ERR重启后恢复。原因是 SDIO 的 DMA 和以太网 DMA 在总线矩阵上冲突导致 SDIO 数据传输错误。解决降低 SDIO 时钟到 12MHz或者在sdio.c里把 SDIO 的 DMA 优先级设为最高并在f_write前后加SCB_CleanDCache_by_Addr如果开了 D-Cache。6.3 CAN 接收一段时间后不再进中断现象CAN 正常接收几分钟后HAL_CAN_RxFifo0MsgPendingCallback不再触发。原因是 CAN 的接收 FIFO 溢出后没有正确清除标志位。解决在回调里先读CAN_RI0R寄存器再调用HAL_CAN_GetRxMessage确保 FIFO 释放。另外检查CAN_IT_RX_FIFO0_OVERRUN是否使能溢出时要有处理。6.4 18B20 读数偶尔为 85 或 -127现象温度值偶尔跳变成 85 或 -127。85 是 DS18B20 的上电默认值说明复位或转换命令没发成功-127 是通信错误。原因是读取时序被中断打断。解决把 18B20 读取放在临界区里或者用硬件定时器触发读取避免任务切换。6.5 系统运行几小时后 HardFault现象系统运行几小时后进入 HardFault看门狗复位。原因通常是某个任务的栈溢出最常见的是 LwIP 的ethernetif_input任务或者 SD 卡写入任务。解决在FreeRTOSConfig.h里使能configCHECK_FOR_STACK_OVERFLOW为 2并在vApplicationStackOverflowHook里打印任务名。把 LwIP 相关任务栈加到 1024 wordSD 卡写入任务栈加到 768 word。7. 用 FreeRTOS 的运行时统计和 LwIP 的统计计数器做长期稳定性验证这套系统跑通不难难的是连续跑 72 小时不出问题。我一般会在系统里加两个统计FreeRTOS 的vTaskGetRunTimeStats和 LwIP 的stats_display。前者看每个任务的 CPU 占用后者看丢包和内存错误。// 使能 FreeRTOS 运行时统计 // 在 FreeRTOSConfig.h 里 #define configGENERATE_RUN_TIME_STATS 1 #define configUSE_STATS_FORMATTING_FUNCTIONS 1 #define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() // 用 TIM6 做统计时钟 #define portGET_RUN_TIME_COUNTER_VALUE() TIM6-CNT // 在某个低优先级任务里定期打印 void vStatsTask(void *pvParameters) { char buf[512]; while (1) { vTaskGetRunTimeStats(buf); printf( Task Stats \r\n%s\r\n, buf); stats_display(); // LwIP 统计 vTaskDelay(pdMS_TO_TICKS(60000)); // 每分钟一次 } }vTaskGetRunTimeStats输出的格式是“任务名 运行时间 百分比”如果某个任务占用超过 80%说明它有阻塞或死循环。LwIP 的stats_display会打印mem、memp、pbuf等统计如果memerr或pbuferr持续增长说明内存池不够或者有泄漏。我自己的习惯是在实验室里用可调电源给板子供电串口接一个日志工具连续跑 72 小时每 10 分钟记录一次任务栈剩余和 LwIP 错误计数。如果 72 小时后xPortGetFreeHeapSize没有明显下降stats_display里的错误计数为 0这套系统才算能拿去现场用。现场部署时再加一个硬件看门狗喂狗逻辑放在优先级最低的任务里确保所有高优先级任务都正常运行时才喂狗。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

Wi-Fi基础知识讲解:从802.11协议到路由器配置与排查

Wi-Fi基础知识讲解:从802.11协议到路由器配置与排查

简介:一份面向无线网络初学者、网络维护人员及 3G/4G/WiFi 方向学习者的 WiFi 基础知识点整理文档。内容以 802.11 协议集为主线,系统梳理 802.11a/b/g/n 的工作频段、最大速率与演进关系,并特别指出 802.11n 在 MAC 层通过信道合并&#xff…

2026/10/16 22:02:21 阅读更多 →
C51 Bootloader实战:分区、串口升级与双备份回滚

C51 Bootloader实战:分区、串口升级与双备份回滚

简介:这份资源面向嵌入式开发初学者与8051平台工程师,聚焦C51 Bootloader的完整实现,帮助读者理解系统启动、固件更新与程序跳转的核心机制。压缩包共18个文件,约17KB,以C源码、A51汇编启动文件、Keil工程配置与备份文…

2026/10/16 22:02:21 阅读更多 →
VASP 6.4.2 编译安装全指南:从 makefile.include 到并行计算实践

VASP 6.4.2 编译安装全指南:从 makefile.include 到并行计算实践

简介:新版 VASP 6.4.2 安装包,面向第一性原理计算研究者与材料模拟工程师,用于解决特定版本 VASP 程序获取及配套环境部署需求。压缩包为 tgz 格式,约 94.25MB,共包含 2000 个文件。除程序本体外,还有 380 …

2026/10/16 22:02:21 阅读更多 →

最新新闻

JasperReports 7.0.0实战:从模板编译到PDF导出的完整流程

JasperReports 7.0.0实战:从模板编译到PDF导出的完整流程

简介:作为一套开源报表工具库,JasperReports 7.0.0 完整项目源码包,面向 Java 后端开发与报表技术研究者,用于解决 Java 应用中复杂报表的生成、样式设计与多格式导出问题,特别适合需要在 Spring 等主流框架中集成报表…

2026/10/16 23:35:00 阅读更多 →
Matlab阶跃响应指标精准提取:上升时间、超调量手动计算方法

Matlab阶跃响应指标精准提取:上升时间、超调量手动计算方法

简介:本资源是一套面向控制工程学习者与MATLAB/Simulink实践者的阶跃响应性能指标自动化计算工具包,专为控制系统分析与控制器设计场景打造,适用于本科课程设计、毕业设计及工程调试等中初级应用需求。压缩包共3个文件(2个.m函数脚…

2026/10/16 23:35:00 阅读更多 →
从Excel到Pandas:百万级数据分析的实战入门与性能优化

从Excel到Pandas:百万级数据分析的实战入门与性能优化

上周帮一个零售团队处理他们的销售流水,一份两百多兆的Excel文件,打开就卡,等了三分钟才看到那一百多万行数据。列一多、表一宽,Excel直接进入半瘫痪状态。我当时的处理方案很简单:把数据丢给Pandas,用Pyth…

2026/10/16 23:32:57 阅读更多 →
最短时间搞定论文参考文献加注:工具实操指南

最短时间搞定论文参考文献加注:工具实操指南

写论文这件事,大家普遍卡在最后一步:参考文献。内容写得差不多了,导师看完正文说“引用格式不对”“缺了几篇文献”“这个期刊要求作者名全拼”,你才意识到光是参考文献就能改一个通宵。我见过不少朋友因为参考文献排版把自己熬到…

2026/10/16 23:32:57 阅读更多 →
游戏玩家和开发者的神器来袭:首个轻游平台SoonPlay公布,开启全民轻创作时代

游戏玩家和开发者的神器来袭:首个轻游平台SoonPlay公布,开启全民轻创作时代

导语恺英网络(002517.SZ)旗下极逸人工智能将于2026年10月20日正式推出首个轻游平台APP SoonPlay。SoonPlay以“轻游平台”为核心,打通短视频浏览、游戏体验与游戏开发三大场景,实现“刷视频、玩游戏、做游戏”三合一;产…

2026/10/16 23:31:57 阅读更多 →
Show HN 发布指南:从准备到反馈的完整实践

Show HN 发布指南:从准备到反馈的完整实践

1. 从一个看似简单的标题说起“Show HN”这三个字,在技术圈里混过一阵子的人都不会陌生。它本身不是一个产品名,也不是某个具体的技术栈,而是一个长期存在于某技术社区首页的固定栏目——一个专门让人展示自己最新作品、副业项目、实验性工具…

2026/10/16 23:31:57 阅读更多 →

日新闻

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 0:00:05 阅读更多 →
信号与系统频域分析作业解题指南

信号与系统频域分析作业解题指南

1. 作业背景与核心要求解析信号与系统作为电子信息类专业的核心基础课,其作业设计往往直接关联课程的核心知识框架。2026年春季第六次作业的布置,通常对应着课程进展到频域分析的关键阶段。根据常规教学进度推测,本次作业可能涉及以下核心内容…

2026/10/16 0:00:05 阅读更多 →
Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

1. 从一个"四不像"的练手项目说起如果你已经看完了Django的官方教程前几章,跟着敲完了投票应用,大概会有一种"我好像会了,又好像什么都不会"的割裂感。教程里每个知识点都是拆开的——这一章讲模型,下一章讲视…

2026/10/16 0:00:05 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 21:54:38 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →