F28335代码固化Flash全攻略:从RAM调试到独立运行
1. 项目概述为什么要把F28335的代码下载到Flash如果你刚开始接触TI的DSP尤其是像TMS320F28335这类经典的浮点DSP控制器你可能会发现一个现象在CCSCode Composer Studio里默认编译、下载、调试程序好像直接就跑起来了。但如果你拔掉仿真器重新给芯片上电程序就“消失”了一切又回到了起点。这背后的原因就是你正在RAM里调试而程序最终需要“固化”到非易失性的Flash存储器中。简单来说F28335芯片内部有两块主要的内存区域一块是易失性的RAM掉电数据就丢失另一块是非易失性的Flash掉电后数据依然保存。我们开发调试时为了追求极快的下载和调试速度通常会把程序先放到RAM里运行。但产品最终是要独立工作的不能总连着仿真器所以必须把经过验证的代码“烧写”到Flash里。这个过程就是“代码下载到Flash”。这不仅仅是点一下“下载”按钮那么简单。它涉及到编译器链接命令文件.cmd的配置、运行时支持库的切换、以及一套专门的“从Flash引导到RAM运行”的机制。很多新手在这里踩坑比如程序在RAM里跑得好好的一烧进Flash就死机或者根本启动不了。今天我就结合自己这些年调试电机控制、数字电源等项目的经验把F28335代码下载到Flash的完整流程、核心原理和那些容易掉进去的“坑”给你彻底讲明白。2. 核心原理与准备工作理解Flash与RAM的差异在动手操作之前我们必须先搞清楚F28335的存储结构这是所有后续操作的基础。知其然更要知其所以然。2.1 F28335的存储空间映射F28335的存储器采用的是哈佛结构程序和数据空间分开。对于我们开发者而言最需要关注的是以下几个关键区域M0 SARAM (1K x 16位) 这是片上RAM速度最快通常用于存放中断向量表、频繁使用的全局变量或堆栈。掉电丢失。M1 SARAM (1K x 16位) 同样是片上RAM用途与M0类似。L0-L7 SARAM (各4K x 16位共32K) 大容量的片上RAM是程序在RAM中调试时的主要栖身之所也是程序从Flash搬移到RAM运行时的目标区域。掉电丢失。Flash (256K x 16位) 这就是我们今天的主角非易失性存储器。它的容量大但访问速度比RAM慢尤其是在不使能流水线缓存的情况下。程序最终需要固化在这里。OTP (1K x 16位) 一次性可编程存储器通常用于存放需要永久保护且不再更改的数据或代码如加密密钥、唯一ID等。当我们说“在RAM中调试”时是指编译链接器把程序的所有代码段.text、常量段.const等都直接分配到L0-L7这类SARAM中。CCS通过仿真器如XDS100v3, XDS560将程序直接加载到这些RAM地址然后芯片从RAM开始执行。这种方式下载速度极快几乎秒完成调试体验流畅。而“下载到Flash”则意味着链接器要把这些段分配到Flash的地址空间例如0x3F 8000开始的区域。编译生成的可执行文件.out包含了这些地址信息。烧写工具通常是CCS自带的Flash烧写插件或脚本会通过仿真器按照这个地址映射将程序数据写入芯片内部的Flash物理单元中。2.2 关键文件CMD文件的双重角色CMD文件是连接软件你的C代码和硬件芯片内存布局的桥梁。它告诉链接器把哪一段代码或数据放到内存的哪个地址上去。在F28335的开发中你通常会看到两个或更多CMD文件一个用于RAM调试(例如28335_RAM_lnk.cmd) 这个文件里MEMORY部分将程序段PAGE 0和数据段PAGE 1都定义在SARAM如L0L1的地址范围。SECTIONS部分则将.text,.cinit等段分配到这些RAM区域。一个用于Flash固化(例如F28335.cmd或28335_FLASH_lnk.cmd) 这个文件里MEMORY部分的PAGE 0会包含FLASH区域如BEGIN : origin 0x3F8000, length 0x002000SECTIONS部分会将主要的代码段分配到FLASH而将需要快速访问的数据段如.ebss,.stack分配到RAM。注意很多初学者犯的错误就是在编译Flash版本时没有在工程设置中把链接命令文件从RAM的CMD切换到Flash的CMD导致代码还是被链接到了RAM地址烧写后自然无法运行。2.3 工具准备CCS与Flash API库工欲善其事必先利其器。你需要确保环境就绪Code Composer Studio (CCS) 建议使用较新的版本如CCSv10或CCSv11。它们对C2000系列的支持更完善。安装时务必勾选C2000编译器和支持包。C2000ware 这是TI提供的官方外设驱动库、示例代码和实用工具库。从TI官网下载对应你芯片型号F2833x的C2000ware包。里面包含了我们最需要的Flash API库和Flash烧写示例工程。仿真器 确保你的仿真器如XDS100v3, XDS200, XDS560驱动已正确安装并能正常连接和识别到F28335芯片。3. 完整实操流程从工程配置到成功烧写理论铺垫完毕现在我们进入实战环节。我会以一个从零开始的新建工程为例演示如何一步步配置并成功将代码烧写到Flash。3.1 步骤一创建或转换工程基础配置假设你已经有一个在RAM中调试正常的工程。如果还没有可以先创建一个简单的LED闪烁工程进行测试。导入Flash API库在C2000ware安装目录下找到device_support\f2833x\vXXX\examples\cpu1\flash_programming这样的路径。里面会有Flash28335_API_V210.lib这样的库文件版本号可能不同。在你的CCS工程中右键点击工程名 -Add Files...将这个.lib文件添加到工程中。通常我习惯把它放在一个叫lib或driverlib的文件夹里方便管理。同样找到Flash28335_API_V210.h头文件将其所在路径添加到工程的Include Options中。在工程属性 -Build-C2000 Compiler-Include Options里添加。切换链接命令文件在CCS的Project Explorer视图中右键你的工程 -Properties。导航到Build-C2000 Linker-File Search Path。在Include library file or command file as input一栏移除原来的RAM链接文件如28335_RAM_lnk.cmd点击Add选择你的Flash链接文件如F28335.cmd。关键检查点 确保Command File预览框里显示的是Flash CMD文件的完整路径。3.2 步骤二修改主程序与添加烧写引导代码程序不能直接就在Flash地址上运行因为Flash速度慢尤其是初始化代码如.cinit运行时初始化如果放在Flash里执行效率会很低。标准的做法是“从Flash引导拷贝到RAM运行”。复制Flash到RAM运行函数在C2000ware的Flash示例工程中找到一个名为MemCopy或CopyDataFromFlashToRAM的函数。它的作用是在main()函数之前将指定的代码段例如.ramfuncs里面存放着对速度要求极高的函数如中断服务程序从Flash复制到RAM。将这个函数及其相关声明复制到你的工程中。通常你需要自己写一个简化的版本// 假设我们将需要快速运行的函数放在一个叫 .ramfuncs 的段里 #pragma CODE_SECTION(MyFastFunction, .ramfuncs); void MyFastFunction(void) { // 你的快速函数代码例如PWM中断服务函数 } // 在main()函数最开始调用 void main(void) { // 1. 初始化系统控制PLL, 看门狗时钟 InitSysCtrl(); // 2. 复制.ramfuncs段从Flash到RAM // MemCopy(RamfuncsLoadStart, RamfuncsLoadEnd, RamfuncsRunStart); // 上述符号在CMD文件中定义需要根据实际情况调用Flash API或memcpy // 3. 初始化Flash设置等待周期使能流水线缓存 InitFlash(); // 这是Flash API库里的关键函数 // 4. 你的其他初始化GPIO, 中断外设 // ... while(1) { // 主循环 } }调用InitFlash()函数这是至关重要的一步。InitFlash()函数来自我们导入的Flash API库。它的作用是配置Flash存储器的等待状态wait-states和使能流水线模式pipeline。如果不调用它CPU以高速时钟访问Flash时会因为Flash反应慢而导致读取错误程序跑飞或死机。这个函数必须在系统时钟PLL初始化之后任何试图从Flash执行代码的操作之前调用。所以把它放在InitSysCtrl()之后其他初始化之前是最稳妥的。3.3 步骤三编译与生成可烧写文件编译工程点击CCS的编译按钮。确保编译0错误0警告。如果有“section placement fails”之类的链接错误通常是CMD文件配置有问题回去检查MEMORY和SECTIONS的定义确保地址和长度没有冲突或溢出。生成Hex或Bin文件可选但推荐对于量产或脱机烧录我们通常需要生成标准的HexIntel HEX或Bin二进制文件。在工程属性 -Build-C2000 Hex Utility中可以配置输出格式。勾选Enable C2000 Hex Utility。在Output Format中选择intel-hex或binary。指定输出文件名和路径。重新编译后在输出目录通常是Debug或Release文件夹就能找到.hex或.bin文件。3.4 步骤四使用CCS进行Flash烧写这是最后一步也是最容易出问题的一步。连接目标板并上电 确保仿真器连接可靠目标板供电正常。进入Debug模式 点击CCS的Debug按钮虫子图标。CCS会连接芯片加载程序注意此时加载的是.out文件信息用于调试并非烧写。运行Flash烧写工具在CCS的Tools菜单下找到On-Chip Flash或F28xx On-Chip Flash工具。如果没找到可能需要手动安装或从C2000ware中加载。打开工具后界面会显示芯片型号、Flash扇区等信息。配置与擦除选择操作 通常选择Program编程。输入文件 点击Browse选择你刚编译生成的.out文件不是.hex。工具会从.out文件中提取地址和代码信息。擦除选项强烈建议在烧写前先执行擦除。可以选择Erase Sectors擦除用到的扇区或Erase Entire Flash全擦。全擦更干净但耗时稍长。验证选项 勾选Verify after program烧写完成后会自动校验确保数据正确。执行烧写点击Execute或Program按钮。下方控制台会显示擦除、编程、验证的进度和结果。耐心等待 Flash烧写比RAM下载慢得多256K的Flash可能需要几十秒到一分钟这是正常的。复位与运行烧写并验证成功后先点击CCS的Terminate退出调试连接。给目标板完全断电再上电或者按硬件复位键。这一步是必须的目的是让芯片从硬件复位状态开始执行内部的BootROM引导程序从Flash的起始地址0x3F 7FF6开始读取复位向量从而跳转到你的应用程序入口。重新连接调试器点击Run你应该能看到程序在Flash中正常运行了。此时拔掉仿真器重新上电程序也应能独立启动。4. 深度解析CMD文件配置与Boot流程为了让你的理解更透彻我们深入两个最核心的细节。4.1 Flash专用CMD文件详解我们以TI示例中常见的F28335.cmd为例拆解关键部分MEMORY { PAGE 0: /* 程序存储器 */ FLASH : origin 0x3F8000, length 0x002000 /* 第一个8K Flash扇区 */ ... /* 可能还有其他Flash扇区定义 */ RAML0 : origin 0x008000, length 0x000800 /* RAM区域用于运行 */ ... /* 其他RAM */ PAGE 1: /* 数据存储器 */ ... /* 各种数据RAM区域 */ } SECTIONS { /* 将代码段分配到Flash */ .text : FLASH, PAGE 0 .cinit : FLASH, PAGE 0 /* C语言全局变量初始化表 */ .switch : FLASH, PAGE 0 /* switch语句跳转表 */ .reset : FLASH, PAGE 0, TYPE DSECT /* 复位向量特殊处理 */ /* 将需要快速运行的函数段单独定义加载在Flash但运行地址在RAM */ ramfuncs : LOAD FLASH, /* 加载地址Flash */ RUN RAML0, /* 运行地址RAM */ LOAD_START(_RamfuncsLoadStart), LOAD_END(_RamfuncsLoadEnd), RUN_START(_RamfuncsRunStart), PAGE 0 .ramfuncs : ramfuncs, PAGE 0 /* 将变量、堆栈等分配到数据RAM */ .ebss : RAML1, PAGE 1 .stack : RAMM1, PAGE 1 ... /* 其他数据段 */ }关键点解读LOAD和RUN地址分离 这是实现“拷贝到RAM运行”的语法基础。链接器会为ramfuncs段生成两套地址符号_RamfuncsLoadStart/End指向Flash中的存储位置_RamfuncsRunStart指向RAM中的运行位置。你的MemCopy函数就利用这些符号进行数据搬运。.reset段 这个段比较特殊TYPE DSECT表示它是一个“虚拟段”不占用实际的存储空间但它定义了复位向量的目标地址。芯片复位后会跳转到这个地址在Flash中执行。4.2 F28335的Bootloader流程理解芯片上电后的行为对调试启动失败问题至关重要。硬件复位 芯片上电或复位后首先执行固化在芯片内部ROM中的Bootloader程序。检查引导模式 Bootloader会检查GPIO引脚如F28335的GPIO84, GPIO85的电平状态决定从何处引导。常见的模式有跳转到Flash 当引导模式引脚配置为从Flash启动时通常是通过上拉/下拉电阻实现Bootloader会跳转到Flash的起始地址0x3F 7FF6。注意这个地址存放的不是代码而是一个跳转指令LB _c_int00的地址。_c_int00是C运行环境RTS的入口它负责初始化全局变量.cinit、设置堆栈然后调用你的main()函数。其他模式 从SCI、SPI等外设引导或从OTP引导这里不展开。执行用户代码 成功跳转到_c_int00后就进入了你的程序世界。此时CPU开始从Flash中取指执行。如果你的程序开头没有调用InitFlash()CPU可能会以高达150MHz的速度去访问未配置等待状态的Flash导致取指失败程序“跑飞”。5. 常见问题、排查技巧与避坑指南这部分是我多年调试积累的血泪经验希望能帮你节省大量时间。5.1 问题一程序在RAM调试正常烧进Flash后不运行或死机可能原因1未调用InitFlash()或调用时机不对。排查 检查main()函数开头在InitSysCtrl()之后是否立即调用了InitFlash()。确保没有在调用InitFlash()之前执行任何复杂的函数调用或访问大量全局变量这些操作可能隐含了从Flash取代码或数据的行为。解决 将InitFlash();作为main()函数中仅次于系统初始化的第二行代码。可能原因2链接命令文件未切换或配置错误。排查 在CCS中编译后查看生成的map文件.map。在map文件的“MEMORY CONFIGURATION”和“SECTION ALLOCATION MAP”部分检查你的.text、.cinit等关键段是否被分配到了Flash地址如0x3F8000附近而不是RAM地址如0x008000附近。解决 确认工程属性中链接的是Flash CMD文件并检查CMD文件中Flash区域的origin和length定义是否正确没有与其他区域重叠。可能原因3中断向量表未正确重映射或初始化。排查 在RAM调试时中断向量表可能被直接加载到M0 SARAM地址0x000000。但在Flash运行时你需要将向量表拷贝到RAM中并配置PIE向量表指针。查看你的中断初始化代码是否有类似MemCopy(PieVectTableInit, PieVectTable, sizeof(PieVectTable));和InitPieVectTable();的调用。解决 确保在main()中正确初始化PIE向量表并将所有用到的中断服务程序ISR的入口地址赋值给对应的PIE向量。5.2 问题二CCS Flash烧写工具报错错误Error erasing flash或Error programming flash可能原因 芯片锁死、Flash保护、电源不稳定、仿真器连接不良、时钟配置异常导致通信失败。排查与解决检查连接 重新插拔仿真器JTAG口确保接触良好。尝试降低JTAG时钟频率在CCS的Target Configuration里设置。检查电源 用万用表测量芯片核心电压1.9V和IO电压3.3V是否稳定、纹波是否过大。解锁芯片 如果之前烧写过带有代码安全模块CSM密码的程序且密码未知芯片可能被锁。这非常麻烦可能需要通过特定的“密码擦除”流程或者寻求TI官方支持。强烈建议在工程中预留一个不设置密码或使用已知密码的扇区。尝试“擦除-编程-验证”分步进行 不要一键操作。先单独执行“Erase”成功后再“Program”。5.3 问题三程序在Flash中运行速度异常慢可能原因 Flash等待周期设置过小或流水线未使能。排查 检查你调用的InitFlash()函数具体实现。它应该根据你的系统时钟频率SYSCLKOUT来配置Flash控制寄存器的等待状态。例如对于150MHz的时钟通常需要设置较高的等待状态。解决 确保你使用的Flash API库版本与你的芯片型号和CCS编译器版本兼容。也可以直接参考C2000ware中对应你芯片型号的最新示例工程里的Flash初始化代码。5.4 独家避坑技巧调试Flash程序的“笨”办法 当程序在Flash中运行异常但又难以在线调试时因为单步调试会触发Flash访问可以这样做在程序开头、InitFlash()之后立刻点亮一个LEDGPIO输出高电平。如果上电后LED亮说明程序至少执行到了这里问题在后面。如果不亮问题在引导或最开始的初始化。再往后每隔一段功能代码就切换一下LED状态用这种“灯语”来定位死机位置虽然原始但极其有效。map文件是你的好朋友 养成查看map文件的习惯。它能告诉你每个函数、每个变量最终被放在了哪个地址占用了多大空间。这对于排查内存溢出、地址冲突问题至关重要。保留一个RAM链接的工程副本 始终保留一个配置为RAM调试的工程副本。当Flash版本出现诡异问题时切换回RAM版本测试可以快速判断是代码逻辑问题还是Flash配置/引导问题。注意编译优化等级 高等级的编译优化如-O2, -O3可能会对代码进行重排、内联有时会与依赖特定内存布局的启动代码或Flash拷贝代码产生微妙冲突。如果遇到难以解释的问题尝试将优化等级调到低-O0或None进行测试。把代码成功下载到Flash并独立运行是DSP开发从“玩具”走向“产品”的关键一步。这个过程涉及硬件知识、编译器链接原理和芯片启动流程综合性很强。希望这篇笔记能帮你打通任督二脉。记住耐心和细致是调试嵌入式系统最重要的品质每次遇到问题并解决它都是你功力增长的时刻。

相关新闻

多智能体AI如何赋能认知行为疗法:CCD-CBT系统架构与应用解析

多智能体AI如何赋能认知行为疗法:CCD-CBT系统架构与应用解析

1. 项目概述:当认知行为疗法遇上多智能体AI 最近在心理健康与人工智能交叉领域,一个名为“CCD-CBT”的项目引起了我的注意。乍看这个标题,它融合了“CCD”(认知概念化图表)、“CBT”(认知行为疗法&#xff…

2026/10/5 10:43:41 阅读更多 →
PLC高效自学指南:从零到精通的系统性路径与实战方法

PLC高效自学指南:从零到精通的系统性路径与实战方法

1. 项目概述:为什么PLC自学是条可行的路? 看到“PLC高效自学”这个标题,很多朋友可能会想,这东西不是得去工厂跟老师傅学,或者报个培训班才行吗?我自己就是从一个电气“小白”,通过自学这条路走…

2026/10/12 23:05:01 阅读更多 →
Excel VLOOKUP函数深度解析:从核心原理到高效数据匹配实战

Excel VLOOKUP函数深度解析:从核心原理到高效数据匹配实战

1. 从“大海捞针”到“精准定位”:VLOOKUP为何是Excel的“定海神针”如果你在办公室里问,哪个Excel函数最让人又爱又恨,VLOOKUP大概率会高票当选。爱它,是因为它确实能解决工作中最频繁、最头疼的跨表查询问题;恨它&am…

2026/10/15 0:28:06 阅读更多 →

最新新闻

PGD对抗训练:深度学习鲁棒性工程落地核心方法

PGD对抗训练:深度学习鲁棒性工程落地核心方法

1. 项目概述:为什么PGD对抗训练成了深度学习鲁棒性的“试金石”“Towards Deep Learning Models Resistant to Adversarial Attacks (PGD)”——这个标题乍看像一篇论文的副标题,但背后藏着当前工业界模型落地最真实、最棘手的痛点…

2026/10/15 8:27:40 阅读更多 →
图即代码:diagram-design 从零构建可版本控制的架构图

图即代码:diagram-design 从零构建可版本控制的架构图

1. 从“diagram-design”这个标题说起:它到底在解决什么问题第一次看到“diagram-design”这个标题,我脑子里蹦出来的不是某个具体工具,而是一类非常典型的工程需求:把脑子里那张模糊的架构图、流程图、时序图,快速变成…

2026/10/15 8:27:39 阅读更多 →
WebRTC与SIP协议转换网关:声网SDK与FreeSWITCH集成实战

WebRTC与SIP协议转换网关:声网SDK与FreeSWITCH集成实战

1. 项目缘起与整体架构拆解WebRTC 和 SIP 这两个协议栈,一个扎根在浏览器生态,一个统治着传统电话网络,各自都活得挺好,但偏偏在很多企业通信场景里,业务方就是想让浏览器里的用户直接拨通电话网络里的号码&#xff0c…

2026/10/15 8:27:39 阅读更多 →
CuteLogger 集成指南:用 Qt 构建可靠日志系统的核心思路与避坑

CuteLogger 集成指南:用 Qt 构建可靠日志系统的核心思路与避坑

简介:CuteLogger 是一套面向 Qt 开发者的轻量级日志库,用于替代 qDebug 等原生输出,解决多线程工程中日志信息不全、格式不统一、扩展性不足等问题。它几乎能记录文件名、源代码行与函数签名,并通过附加程序机制灵活输出到文件、控…

2026/10/15 8:27:39 阅读更多 →
Nginx高可用集群实战:Keepalived+虚拟IP实现主备自动切换

Nginx高可用集群实战:Keepalived+虚拟IP实现主备自动切换

1. 为什么要搭建Nginx高可用集群1.1 单点故障的现实困境很多人刚开始接触Nginx时,都是在单台服务器上部署,做反向代理、静态资源托管、负载均衡转发。这套玩法在开发环境和中小流量场景下没什么问题,但当它真正扛起生产流量时,一个…

2026/10/15 8:27:39 阅读更多 →
artcraft 项目实战:从创意到成品的流程编排与参数体系设计

artcraft 项目实战:从创意到成品的流程编排与参数体系设计

1. 从“artcraft”这个名字说起:它到底想解决什么问题第一次看到“artcraft”这个项目标题,我的直觉是:这大概率是一个把“艺术创作”和“手工实现”捏合在一起的工具型项目。拆开来看,“art”指向视觉表达、创意生成、审美输出&a…

2026/10/15 8:26:36 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 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/15 0:14:36 阅读更多 →
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/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练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/14 7:53:34 阅读更多 →