news 2026/9/5 8:09:16

裸机开发不求人:开源工具链+Skill脚本打造嵌入式全流程体系

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
裸机开发不求人:开源工具链+Skill脚本打造嵌入式全流程体系

写这篇东西的起因,其实挺简单:前阵子一个刚入行的朋友问我,说现在网上全是RTOS、嵌入式Linux、AI边缘计算,怎么还有人写裸机?我当时正好在调试一块MCU板子,手里同时开着厂家IDE、命令行工具链和一个写了大半年的裸机工程,就回了他一句:裸机不是“过时”,是你没把它当成一门可以系统化打磨的Skill。后来我把这句话发到朋友圈,发现评论区炸出一堆同行,有共鸣的,有反驳的,也有问“那你倒是说说这套Skill怎么练”的。所以今天这篇,我就把压箱底的一套东西拿出来聊聊——按我自己这几年的经验,一个嵌入式工程师怎么把裸机开发从“能跑”做到“一条龙”。

我不打算讲那些教科书式的大道理,也不讲厂商SDK里现成的库函数怎么调。我要聊的是另一条路:用开源工具链从底层打通编译、调试、工程架构、自动化脚本,再结合现在的AI辅助手段,把整个裸机开发流程变成一套自己说了算的体系。这套体系一旦建立起来,你换任何一款MCU、任何一家IDE,心里都不会慌。这篇文章会分五块来讲,从工具链选型到工程架构,再到Skill脚本自动化和AI辅助实践,最后给出一条我实测过四个月的入门路线。内容偏实操,篇幅不短,建议先收藏再慢慢看。

1. 裸机开发不是过时,而是嵌入式工程师最值钱的底牌

先聊一个现象:这几年只要一搜“嵌入式学习路线”,满屏都是Linux、驱动、内核移植,好像做单片机就是低端。但你在真正干活的现场跑一圈就会发现,车载ECU、家电控制板、消费电子里的传感器节点、甚至一部分电机驱动,底层跑的都是裸机或者超轻量级调度——原因很简单:成本敏感、资源受限、实时性要求明确。裸机不是被淘汰了,而是退回到它最擅长的阵地。能把裸机代码写好的人,对寄存器、中断、片上外设的理解是实打实的,后面再学RTOS、Linux是在这份底子上做加法。

再说“不求人”这件事。很多时候我们卡住,不是卡在不会写逻辑,而是卡在开发环境。厂商IDE一更新,某个接口变了;某款调试器驱动和系统版本冲突,折腾一下午装不上;许可问题、工程导入问题、交叉编译配置问题。这些坑,如果手里有一套纯开源的工具链,大部分可以直接绕过去。GCC编译,OpenOCD烧录调试,CMake组织工程,VS Code当编辑器,这套组合拳打下来,你手里的MCU就是我说的“裸机编程不求人”的核心底座。

顺便说一句,现在连AI编程助手都开始大批量接入嵌入式开发流程,市面上甚至有“用Claude Code开发MCU工程”的玩法了。但AI写出来的代码如果跑在一套你看不懂、不可控的工程里,那出问题的时候你连排查方向都没有。反过来,如果工程是自己用开源工具搭的,每一层都能读懂,AI就只是加速器,而不是黑盒。这也是为什么我把“Skill一条龙”作为文章标题:裸机开发的技能不只是写寄存器配置,而是从工具链到代码架构到自动化再到AI协作的全流程能力。

2. 编译器到调试器:一套不依赖厂商IDE的开源工具闭环

2.1 工具链选型的三件套:arm-none-eabi-gcc、CMake、OpenOCD

第一步先把编译器选死。目前单片机裸机开发的主流架构还是ARM Cortex-M,对应的开源交叉编译器是arm-none-eabi-gcc。这个工具链由ARM官方维护,支持的MCU型号覆盖了ST、NXP、GD、Nordic等绝大多数厂商,版本稳定性也很重要,我个人建议LTS版本出来之后用一两个季度再切,碰到bug的概率会小很多。安装方式在Windows上用MSYS2比较清爽,Linux上apt或pacman直接装就行,注意别装成arm-linux-gnueabi-gcc,那个是给带操作系统Linux开发用的,裸机项目用会踩坑。

第二步是构建系统。很多新人一上来就抵触CMake,觉得Makefile已经够了。但真实工程一旦超过四五个源文件,Makefile的依赖管理就开始折磨人,而且跨平台移植性也差。CMake好在哪儿?它会自动扫描源文件列表、生成依赖关系,还内置了GNU Arm Embedded Toolchain的支持模块。配一个CMakeLists.txt,你就能把编译选项、链接脚本、宏定义全部集中管理,配合VS Code的CMake Tools插件,扩展开箱即用。

然后是烧录和调试。OpenOCD这个项目大家都不陌生,它通过FTDI、CMSIS-DAP这类调试器,把GDB命令翻译成底层JTAG/SWD协议,实现烧录和单步调试。它的Flash编程其实比很多厂商IDE做得更可靠,特别是针对产线自动化这种场景,命令行批量烧录太方便了。

2.2 一个可直接抄作业的CMake工程骨架

我把一个最小可用的CMake工程骨架贴出来,这是我自己项目里精简过的模板,适合Cortex-M0/M3/M4全系列:

cmake_minimum_required(VERSION 3.20) project(baremetal_demo C ASM) set(MCU cortex-m4) set(CPU_FREQ 168000000) set(OPENOCD_CFG "st_nucleo_f4.cfg") set(CMAKE_SYSTEM_NAME Generic) set(CMAKE_SYSTEM_PROCESSOR arm) set(CMAKE_C_COMPILER arm-none-eabi-gcc) set(CMAKE_ASM_COMPILER arm-none-eabi-gcc) set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) add_compile_definitions( STM32F407xx USE_HAL_DRIVER ${MCU} ) add_compile_options( -mcpu=${MCU} -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -O2 -Wall -Werror -ffunction-sections -fdata-sections ) add_link_options( -mcpu=${MCU} -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -Wl,--gc-sections -T${CMAKE_SOURCE_DIR}/linker/stm32f407.ld ) file(GLOB_RECURSE SOURCES "src/*.c" "src/*.s" ) add_executable(${PROJECT_NAME}.elf ${SOURCES}) set_target_properties(${PROJECT_NAME}.elf PROPERTIES SUFFIX ".elf" ) add_custom_command(TARGET ${PROJECT_NAME}.elf POST_BUILD COMMAND arm-none-eabi-objcopy -O ihex ${PROJECT_NAME}.elf ${PROJECT_NAME}.hex COMMAND arm-none-eabi-objcopy -O binary ${PROJECT_NAME}.elf ${PROJECT_NAME}.bin COMMAND arm-none-eabi-size ${PROJECT_NAME}.elf )

解释一下几个容易忽略的关键点:

  • -ffunction-sections-fdata-sections配合链接器的--gc-sections,可以把没有函数用到的段在链接阶段直接丢弃,大幅减小固件体积,属于裸机优化的基础操作。
  • -Wall -Werror我建议一上来就开,特别是工程中期,强制消除警告,很多隐蔽bug在编译期就能发现问题。
  • 编译选项里的-mcpu要和链接脚本里的内存布局匹配。你写cortex-m4但板子其实是cortex-m0,编译能过,跑起来直接HardFault。

烧录就用OpenOCD一条命令:

openocd -f interface/stlink.cfg -f target/stm32f4x.cfg -c "program build/baremetal_demo.elf verify reset exit"

program命令会先擦除再用GDB加载Flash,verify做写入一致性校验,exit跑完自动断开,非常适合集成进CI或一键脚本。如果用的是DAP-Link,把interface/stlink.cfg换成cmsis-dap.cfg就行。

2.3 用库里没有的东西做数据断点:GDB实战

调试是很多裸机新手的盲区,因为厂商IDE把调试封装得太简单了,点一个按钮就全自动,导致大家反而不知道自己手里握的是什么。用OpenOCD + GDB,你能做很多IDE里不方便做的事。

举个例子,产品在运行中出现随机复位的bug,最常见的排查方式是查寄存器,但现场往往没有仿真器,只能靠HardFault分析。我在工程里会默认在启动文件里挂一个HardFault_Handler钩子,把PC、LR、PSR、以及几个核心寄存器的值保存到RAM的固定地址,然后用GDB把这个结构体print出来。这招在解析栈回溯的时候特别有用,因为裸机没有操作系统上下文,栈里的调用链全靠手工推,但配合反汇编可以精确定位是哪一行触发了异常。

还有一个高频需求:观察某个变量何时被意外改写。GDB的硬件断点,也就是watch命令,在MCU上实际会被编译成数据匹配的断点寄存器,当变量的地址被写入时,CPU立即暂停,根本不需要你去猜是哪个模块在动它。类似的排查技巧,写一次能省下一周加班时间。

2.4 开源镜像站的使用技巧

工具链下载偶尔会遇到官网慢的情况,国内用清华、阿里的开源镜像站就能解决。这里的技巧是,不只系统ISO,GNU Arm Toolchain、OpenOCD的Windows安装包、甚至MSYS2的软件包,镜像站都有同步,而且会滚动更新。把源切到镜像站,装完顺手还能省不少时间。

3. 分层架构与状态机思维:把裸机工程从“能用”改造成“好维护”

3.1 为什么裸机项目越改越烂?源头在结构

我见过太多裸机工程,所有功能堆在main.c里,全局变量满天飞,模块之间互相调用,后期加一个功能牵一发动全身。裸机不代表没有架构,恰恰因为缺少操作系统的隔离,架构才更要主动设计。我的习惯是分成四层:

  • BSP层(板级支持包):时钟、GPIO、UART这类底层的初始化,对上提供统一接口,任何板子上电第一件事就是跑这一层。
  • Driver层(外设驱动):EEPROM、传感器、LCD等具体外设的读写逻辑,不关心业务怎么用,只保证单设备功能正确。
  • Module层(功能模块):比如数据采集、按键扫描、打印日志、电源管理,这一层开始出现“逻辑”的味道,通常用状态机实现。
  • App层(业务逻辑):只负责编排Module层,决定什么时间唤醒、什么事件触发什么行为。

分层之后最大的感受是:换一块MCU,BSP和Driver层修改,Module和App层大概率可以原封不动地搬走。我上一份工作就是把一个基于STM32F103的裸机产品,硬生生迁到了GD32F303上,应用层一行没动,只改了BSP和链接脚本,整个迁移花了一周。

3.2 事件驱动加状态机:让代码能“说人话”

裸机的while(1)轮询不是罪,罪的是在循环里直接写阻塞的操作逻辑。比如一个按键消抖逻辑,一开始可能是50ms延时死等,后面还要同时处理OLED刷新和串口接收,延时一改,整个时序全乱。

我的替代方案是用事件驱动加状态机。事件可以是定时器产生的标志位、UART接收完成的中断、外部GPIO的上升沿,全部投递到一个简单的事件队列里;主循环只做一件事:取事件,查表,执行对应的状态处理函数。

打个比方,这就像餐厅后厨:每个订单(事件)进队列,厨师(主循环)不提前做菜,只按订单做,每个订单都有标准操作流程(状态机)。这样做的好处肉眼可见:模块之间的耦合被切成一条单向的流水线,加新需求不需要动整体结构。

一个极简的按键状态机示例:

typedef enum { KEY_IDLE, KEY_DEBOUNCE, KEY_PRESSED, KEY_RELEASE } KeyState; KeyState key_state = KEY_IDLE; uint32_t debounce_tick = 0; void key_scan(void) { uint8_t level = gpio_read(KEY_GPIO_PORT, KEY_PIN); switch (key_state) { case KEY_IDLE: if (level == 0) { key_state = KEY_DEBOUNCE; debounce_tick = get_tick(); } break; case KEY_DEBOUNCE: if (get_tick() - debounce_tick >= 20) { if (level == 0) { key_state = KEY_PRESSED; event_post(EVENT_KEY_LEFT_DOWN); } else { key_state = KEY_IDLE; } } break; case KEY_PRESSED: if (level == 1) { key_state = KEY_RELEASE; } break; case KEY_RELEASE: if (level == 1) { event_post(EVENT_KEY_LEFT_UP); key_state = KEY_IDLE; } break; default: key_state = KEY_IDLE; break; } }

这套东西的实际意义在于:每个分支都对应一个明确的状态,测试时只需要喂不同的输入电平序列,就能穷举出所有轨迹。比那种一个函数里套三四个if判断的写法,可维护性上一个台阶。

3.3 通用中间件:环形缓冲、软件定时器、断言系统

连续写了几个项目之后,我会把一些通用的东西沉淀成中间件,放进每个裸机工程当基础库。三个最常用的:

  • 环形缓冲区:UART接收、DMA传输、日志输出都离不开它。裸机上特别注意缓冲区长度用2的幂,idx & (size - 1)代替求余,性能差好几倍。
  • 软件定时器:基于SysTick的tick递增,配合一个回调链表实现毫秒级的任务调度。不用RTOS的原因,有时候真的是因为不想多开销那几KB RAM,但时间管理还是要有的。
  • 断言系统:裸机上断言别直接丢assert,而是定义成宏,失败时把文件名、行号、寄存器现场写进Flash的日志区,方便产线溯源。

这三个中间件的代码量不大,但直接决定了后续项目的开发速度。我通常在github上维护自己的开源源码仓库,每个中间件一个目录,用统一的接口风格,新项目拉下来直接复用。如果某个仓库地址迟迟没有同步,自己的git服务可别切来切去,稳定优先。

3.4 关于“嵌入式八股文”的一点点看法

很多论坛把嵌入式面试题调侃成“八股文”,什么指针数组和数组指针的区别、volatile的作用、大小端判断。说句公道话,如果面试官只靠背题判断能力,那是面试官的问题;但如果你能把“volatile就是告诉编译器这东西必须在每次访问时读内存,不要优化进寄存器”结合到自己项目里的标志位使用来解释,那这些基础反而是你综合能力的证明。裸机编程尤其看重底层功底,因为所有运行时的怪异现象,最后都能归结到C语言规范、编译器行为和硬件时序这三者的交叉点上。

4. Skill脚本:让EDA工具链也接入自动化流水线

4.1 为什么嵌入式工程师要碰Skill

聊完MCU软件本身,我想把视野拉宽一点。一个完整的嵌入式硬件产品,除了固件,还有原理图和PCB。你在做样板调试时,如果PCB上有个引脚网络对不上,或者封装画错了一个pad,整个项目都要等改板。Cadence的Allegro在硬件领域用得非常广泛,而它的二次开发接口叫Skill,是一门类Lisp脚本语言。坦白说,很多固件工程师不关心这层,但做硬件和做固件的人如果能配合起来,把EDA的重复劳动用脚本自动化,产线交付速度完全是两回事。这也是标题里“Skill一条龙”的另一层含义。

4.2 Skill的实际场景:自动生成BOM、批量检查封装

Skill能做的事情非常多。最典型的是自动提取原理图中的器件清单,按照“位号、型号、封装、数量、备注”的字段排好序导出CSV。手动作的话,每个项目出BOM要花小半天,用脚本几秒钟,而且不会漏掉任何替代料。还有一个场景是封装批量检查:检查所有电容电阻的封装命名是否和BOM一致,异形焊盘是否漏了钢网层,这些用Skill遍历数据库对象就能完成。

我提供一个最简脚本的伪代码逻辑,帮大家理解它是怎么工作的:

; 获取原理图中所有元件 components = axlDBGetDesign()->components foreach(comp components printf("%s %s %s\n" comp.refdes comp.value comp.symbolName) )

这只是一个入门示例。实际上Skill还可以调用Allegro的菜单、绘制图形、生成报告,在大型硬件团队里甚至有专门的EDA自动化工程师岗位。但嵌入式工程师掌握一点Skill,最大的价值不是把脚本写成产品,而是在协作中和硬件工程师用一个“语言”说话,双方都能能预判对方的设计约束。

4.3 用Skill给固件“反向供数”

我特别想分享一个把Skill和固件开发结合起来的做法:原理图上的网络命名和MCU引脚分配,由Skill脚本从Cadence的数据库里导出,自动生成一个pinout.h文件,直接include进固件工程。这样PCB上改了一个网络连接,固件侧的宏定义也随之更新,从根源上杜绝了“板子和代码引脚对不上”的经典事故。

当然,这一套东西和前面的CMake、OpenOCD体系是互补的关系,Skill服务于硬件链路,GCC服务于软件链路,两条链在一个项目日程里交汇。做“一条龙”,说穿了就是不让任何一条链成为瓶颈。

5. 我把AI编程助手用进了裸机工程:实测效果与审查底线

5.1 从VSCode里跑起来的MCU工程助手

热搜词里有一个“vscode集成claude code 开发嵌入式mcu代码工程”,这条我之前仔细研究过,也实际用了半年多。现在的AI编程助手进步很大,特别是对C语言的理解,已经不只是“补全if else”的程度,而是能根据上下文推断外设寄存器、生成驱动框架。我常用的流程是:先在VSCode里开一个裸机工程,让AI助手阅读一下main.cstm32f4xx_hal_conf.h,然后让它生成一段UART中断收发 + 环形缓冲区的代码框架。几分钟内得到的代码骨架基本能直接编译。

但这里我要泼一盆冷水:AI生成的代码,越是“看起来合理底层”的地方越要警惕。比如它生成一个GPIO_InitStruct,可能会漏掉某款芯片独有的复用功能和上下拉配置;也可能对时钟分频的计算有误,导致波特率偏差。把AI当成一个非常熟悉C语言语法、但对“你这块具体板子”一无所知的实习生,这是最安全的定位。

5.2 一条我反复验证的AI协作流程

目前的协作流程我总结为:AI写方案,人工定边界。具体说分五步:

  • 让AI列出实现某个外设驱动的全部步骤,这一步用来验证思路。
  • 将寄存器手册第X页的框图和关键位定义粘贴给AI,让它基于手册写代码。
  • 对生成的代码做Code Review,重点是非标准写法、强转指针、延时循环这类问题。
  • 把编译器的-Wall -Werror开起来,用机器卡掉AI可能踩中的大部分坑。
  • 加上断言和日志,在板子上实测行为,不要相信AI“差不多就行”的注释。

实测下来,这套流程能把裸机驱动开发的时间压缩30%以上,而且因为每一步都有人审,代码质量并不会下滑。

5.3 开源项目与AI:有节制地“抄”

GitHub上有很多优秀的裸机开源项目,比如各类Bootloader、USB协议栈、LVGL在MCU上的移植范例。AI辅助学习时,这些项目是很好的语料,但也要注意重心不在于“复制粘贴提交”,而在于读懂人家的工程组织和边界条件。我见过有人把开源库里大量无用文件原样拉进自己的项目,整个目录结构乱成一团。真正应该抄的是架构思路,然后用自己的分层方式重新实现一遍,这个过程对Skill的成长帮助才是最大的。

6. 从雏形到“一条龙”:四个月实战学习路线与踩坑记录

6.1 四个月时间线,按周推进

裸机编程的Skill体系确实需要连续性投入。我把个人验证过的一条四个月路线图放在这里,适合有一些C语言基础、但还没系统接触过裸机的读者:

  • 第1-2周:安装并跑通arm-none-eabi-gcc + OpenOCD + VSCode的最小工程,点亮板载LED。这一步的意义不是“点灯”本身,而是确保你手里有一套完全可控的编译、烧录链路。
  • 第3-6周:逐个学习GPIO、UART、SPI、I2C、定时器,每个外设写一个小的驱动模块,并统一封装成BSP接口。每学一个,就在自己的docs目录里记录寄存器关键位和调试遇到的问题。
  • 第7-10周:搭建分层架构,把你的外设驱动接入事件驱动和状态机框架,跑一个多模块协作的Demo,例如按键调光加串口打印。这一阶段重点是重构,不要怕改代码。
  • 第11-14周:引入中间件库(环形缓冲、软件定时器、断言),把前面积累的代码打包成自己的基础库,并尝试移植到另一颗不同厂商的MCU上。移植动作会把架构设计的优劣彻底暴露出来。
  • 第15-16周:试用AI助手辅助生成一个复杂驱动模块(比如SDRAM或LCD初始化),同时学一点Skill脚本,把Cadence数据库里的BOM或引脚导出流程自动化,体验一下“软硬协同一条龙”的感觉。

6.2 几个绕不开的坑

第一,工具链版本不匹配。OpenOCD的老版本可能不支持某些新出的MCU型号,GCC编译器选择过新版本也偶尔出现链接脚本兼容性问题。遇到奇怪问题先看版本,再查几个开源仓库的issue,大概率有答案。

第二,调试器驱动问题。Windows上ST-Link的驱动和WinUSB驱动有冲突时,OpenOCD会报权限错误。这种问题最干脆的解决办法是更新zadig里的驱动设置,别在厂商IDE和OpenOCD之间来回切换,尽量统一。

第三,查看源码做对比。有时同一款MCU的HAL库在不同版本间接口有变化,AI写出的代码往往是“平均了多个版本”的风格,编译问题最多。我只把索引查准,函数签名对照最新头文件确认一遍,基本就能规避。

6.3 找项目练手的方向

学习裸机最大的阻碍是“没有真实项目需求”。这部分我建议用一些开源社区的活动来补,比如给某个开源硬件项目提交PR、参加一些电子设计类的比赛、或者在自己常用开发板上复刻一个“迷你版”功能。身边有人指导的话,进步速度更快。找不到人带,也可以把别人开源项目的实现原理搞懂,再像做实验一样,在裸机上手工复现一轮。我自己当年就是这么练过来的,之后再去翻各种嵌入式软件设计的书,很多抽象概念一下就通了。

7. 写在最后:关于“不求人”,我说点心里话

我见过不少同行把“不求人”理解成“什么都要自己造轮子”,这我不同意。软件行业走到今天,轮子的数量早就多到没人能一个人全造完。我理解的“不求人”是:出了编译错误,你能从工具链的log里读出真正的失败点;烧录失败,你能从OpenOCD的输出里定位到电压时序还是驱动冲突;代码跑飞,你有一套自己的调试手段把它揪出来。这些能力组合起来,你才不会在任何一个环境切换的关卡被卡住,也不会因为某个IDE退出了历史舞台而恐慌。

在我自己带过的几个人里,凡是按这套思路走下来的,不管最终是做MCU还是转Linux,基本功都相当扎实。裸机编程看起来“旧”,但它教会你的,恰恰是计算机系统最底层也是最不会过时的那些事:内存、外设、中断、时序、以及面对运行现场时那种抽丝剥茧的耐心。以上这些经验和踩坑,希望能帮到正在这条路上摸索的你。后面我还会继续更新关于Skill脚本和AI辅助的具体案例,咱们实战里见。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/5 8:07:41

苏州中小厂选ERP总踩坑?这份选型清单收好

最近在苏州、昆山跑了很多工厂,老板们问得最多的一句:“市面上ERP那么多,我到底该选哪个?” 说实话,选 ERP 不是买衣服——不是越贵越好,也不是名气越大越对。苏州的中小生产企业,10 人的加工作…

作者头像 李华
网站建设 2026/9/5 8:05:19

公司开了十年,你沉淀下了什么?

公司开了十年,你回头盘点过吗。厂房会旧,设备会淘汰,账上的钱起起落落,这些都不一定能陪你走到下一个十年。真正能留下来的,是那些一直相信你、反复找你做生意的客户。不管什么行业,客户都是一家公司最核心…

作者头像 李华
网站建设 2026/9/5 8:03:12

《接入 10 个大模型后,我是怎么把重复代码砍掉的》

大模型越来越多,开发者真正缺的可能不是模型,而是一个统一入口 这两年做 AI 应用,有一个非常明显的变化: 以前做一个 AI 功能,选一个模型,申请一个 API Key,接进去基本就可以开始开发。 现在却完…

作者头像 李华
网站建设 2026/9/5 8:02:16

吃透CAN底层原理与UDS诊断协议:从一帧报文到刷写流程的实战指南

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

作者头像 李华
网站建设 2026/9/5 8:01:55

2026年人工智能、电子工程与信息科学国际会议(AEIS 2026)

2026 International Conference on Artificial Intelligence, Electronic Engineering, and Information Science一、大会信息会议名称:2026年人工智能、电子工程与信息科学国际会议 会议简称:AEIS 2026 收录检索:提交Ei Compendex,CPCI,CNKI…

作者头像 李华
网站建设 2026/9/5 8:01:29

Springboot3+MyBatis_Plus学习项目(一)

从零创建后端项目,实现CRUD接口 目标:从零创建后端项目,实现用户 CRUD 接口 环境:JDK17、Maven、IDEA、MySQL8、SpringBoot3 一、创建 SpringBoot 项目 IDEA 新建项目 1.文件 → 新建 → 项目,选择 Spring Initiali…

作者头像 李华