Skip to content
← 返回博客
看 AI 如何操作 J-Link 调试 AUTOSAR MCAL
产品动态

看 AI 如何操作 J-Link 调试 AUTOSAR MCAL

AutoC 新增 gdb-debug。在 NXP S32K3(S32K344)上,AI 可以通过 J-Link + GDB 编译、下载、设断点、单步,看 AUTOSAR MCAL 到底有没有跑起来。

产品动态AutoCAUTOSAR调试

起因

AI 写代码已经不新鲜了。程序跑起来不对,它能不能像嵌入式工程师一样:编译、连调试器、下载代码、设断点、单步、看变量和调用栈,再根据现场改代码?

可以。那么我们就来看看AutoC 配合 gdb-debug 是如何实现全自动调试的。这次目标板是 NXP S32K3(S32K344)

流程很短:

改 MCALbuild_firmwaregdb-connectrestart → 断点 / 单步 → 看变量、寄存器、调用栈 → 再改 → 再验

AI 不再只是对着代码猜。它可以连上开发板,看初始化有没有走进去、某个 Driver 有没有干活、寄存器是不是预期值、程序卡在哪。

链路是:

调试链路

AutoC → GDB Client → J-Link GDB Server → J-Link → MCU

看到这,聪明的小伙伴已经发现,只要是支持GDB方式的调试器,都可以通过AutoC的gdb-debug技能来实现全自动调试。

AI 用的是这几把工具:

工具做什么
build_firmware编译当前固件
gdb-connect起 J-Link GDB Server,device=S32K344,接口 SWD
gdb-command restartReset → Load → Break → Continue
gdb-commandbreak / step / continue / locals / print / registers / backtrace

J-Link 通过 SWD 连接 S32K344

先配置 gdb-debug

打开 设置 → 工程 → 扩展 → GDB Debug,把编译、ELF、GDB Client 和 J-Link GDB Server 的路径填好。

gdb-debug 配置界面

这次 S32K344 工程用到的配置:

配置项示例作用
Build command./build.bat编译当前固件
Working directory留空默认使用工程根目录
Executable (ELF)./build/out/main.elf下载和调试的目标文件
GDB pathD:/NXP/S32DS.3.6.4/S32DS/tools/gdb-arm/arm32-eabi/bin/arm-none-eabi-gdb.exeS32DS 自带的 Arm GDB
GDB target留空由 AutoC 启动并连接 GDB Server
GDB server pathD:/Program Files/SEGGER/JLink/JLinkGDBServerCL.exeJ-Link GDB Server
DeviceS32K344目标芯片
InterfaceSWDS32K3 调试接口

路径按本机安装位置填写。S32K3 使用 SWD;如果已经手动启动 GDB Server,也可以在 GDB target 中填写现有的 host:port

保存并重载后,AutoC 会注册 build_firmwaregdb-connectgdb-command 等调试工具。

编译、连接、下载并运行

改完 MCAL Driver,连续执行:

text
build_firmware
gdb-connect
restart

build_firmware 编译固件:

build_firmware 编译 S32K3 固件

gdb-connect 通过 SWD 连接 S32K344,restart 一次完成 Reset / Load / Break / Continue。GDB Client 会保持常驻,后面的断点、单步和变量检查都在同一会话中完成。

gdb-connect 与 restart

如果编译失败,AI 会分析报错、修改代码并重新编译;修改成功后,再下载并进入下一轮调试。

拿调试 MCAL来举个例子

MCAL 的坑经常不是「编译失败」,而是 编译过了,硬件没按预期工作

现象典型怀疑
Port 初始化了,引脚状态不对SIUL2 PCR、方向、复用
Dio 读写不对Channel 映射、Port 依赖
Can / Spi / Adc / Pwm / Gpt 没起来Init 没走到、时钟、中断
某个 IRQ 进不去向量、优先级、使能位

这些最终都得回到真实 MCU。

设断点、单步、看变量

连上板子后,连续做这三步:

text
break Port_Init
break Can_Init
continue
step
locals
print xxx

先确认 MCAL 初始化有没有走进去,再单步看 Pin 配置和寄存器写入,不对就看当前变量、配置结构和寄存器。常见问题是 Channel 为什么是 0、Status 为什么一直 BUSY、Init 参数是不是配错了。

gdb-command print 查看变量

看调用栈

backtrace

用来判断问题在哪一层。这次在 Uart_SyncSend 上抓到 7 层:mainUart_SyncSendUart_StartSyncSendUart_Ipw_SyncSend → LPUART IP。

Uart_SyncSend 调用栈

实际案例:AI 调试 AUTOSAR MCAL

配置一个串口发送的MCAL,并且发送消息。AutoC已经自动完成了前面的任务,这个不是我们今天关注的重点。

配置串口发送 MCAL 任务

写的第一个版本的代码:

第一个版本的代码

AI开始调试,下载,允许

AI开始调试,下载,允许

AI 发现问题

AI发现问题

AI 修改 MCAL 代码

AI修改 MCAL 代码

最终结果

AI修改 MCAL 代码AI修改 MCAL 代码

从配置,到调试

AutoC 以前主要做 AI 配置 AUTOSAR BSW。配完还差一句:软件到底有没有跑起来?

现在可以接着走:配置 MCAL → 生成代码 → 编译 → 连 J-Link → 调试 → 改代码 → 再验证。

值钱的不是会打几个 GDB 命令,而是能拿板上的结果继续想下一步。复杂的芯片、时序、底层 Driver 还是得靠工程师;编译、下载、断点、单步、看变量和栈,AI 已经能接手。

AI Debug Loop

分享