1. 杰理AC79开发环境改造实战
作为一名长期从事物联网终端开发的工程师,最近在使用杰理AC79芯片开发智能硬件时,发现官方SDK的工程结构存在一些影响开发效率的问题。特别是demo_DevKitBoard这个基础工程,虽然功能完整,但每次编译烧录都需要频繁切换目录,调试信息查看也不够直观。经过实际项目验证,我总结出一套基于VSCode的工程改造方案,将开发效率提升了至少30%。
这个改造方案主要解决三个痛点:一是编译环境配置繁琐,二是烧录流程不够便捷,三是调试输出查看困难。通过调整批处理文件位置、优化Makefile配置以及增强调试功能,最终实现了在工程根目录下"一键编译、一键烧录、实时调试"的流畅开发体验。下面我就把这套方案的实现细节完整分享给大家。
2. 工程结构与改造规划
2.1 SDK目录结构解析
杰理AC79的SDK采用典型的嵌入式项目分层结构,我们先看下关键目录的作用:
code复制SDK_ROOT
├── .vscode/ # VSCode工程配置
├── apps/
│ └── apps/demo/demo_DevKitBoard # 我们的目标工程
├── cpu/ # 芯片底层驱动
├── include_lib/ # 公共头文件
├── lib/ # 预编译库文件
├── sdk_tools/ # 开发工具链
├── tools/ # 实用工具脚本
├── Makefile # 顶层构建文件
└── winmk.bat # Windows环境配置
这种结构虽然清晰,但存在一个明显问题:编译和烧录工具分散在不同目录,开发时需要不断切换工作路径。比如要编译得先进入apps目录,烧录又要切换到cpu子目录,非常影响效率。
2.2 demo_DevKitBoard工程重点
我们的改造对象demo_DevKitBoard包含以下核心文件:
c复制demo_DevKitBoard/
├── board/wl82/DevKitBoard.c // 硬件引脚定义
├── include/app_config.h // 功能模块开关
├── app_main.c // 主业务逻辑
这个工程默认支持多种外设驱动,包括GPIO、PWM、I2C等常用接口。但在原始结构中,每次修改代码后都需要执行多步操作才能看到效果,这对快速迭代非常不利。
3. 关键改造步骤详解
3.1 环境配置批处理优化
原始winmk.bat位于.vscode目录,每次打开新终端都需要手动执行,且要指定完整路径。我的改造方案是:
- 将winmk.bat移动到SDK根目录
- 修改内容为自包含路径:
bat复制@echo off
SET "SCRIPT_PATH=%~dp0"
SET "PATH=%SCRIPT_PATH%\tools\utils;%PATH%"
IF NOT "%1"=="" make "%1" -j %NUMBER_OF_PROCESSORS%
这个改动带来了两个好处:
- 在任何子目录下都可以直接调用../winmk.bat
- 支持参数透传,如
winmk clean可直接执行清理
实际测试发现,路径中的空格会导致问题,所以要用引号包裹变量。这是很多教程不会提到的细节。
3.2 烧录流程简化方案
原版download.bat深藏在cpu/wl82/tools目录,烧录步骤繁琐。改造方法:
- 在根目录创建新的download.bat
- 内容简化为:
bat复制@echo off
pushd cpu\wl82\tools && download.bat && popd
这个技巧利用了pushd/popd保存路径状态,实现了:
- 保持当前终端路径不变
- 内部调用实际烧录脚本
- 烧录完成自动返回原目录
实测下来,每次烧录节省了至少3次cd命令操作,在频繁调试时效率提升明显。
3.3 Makefile智能改造
原始Makefile将所有demo工程并列处理,每次编译都要输入完整目标名。我的优化策略:
makefile复制.PHONY: all clean ac791n_demo_demo_devkitboard clean_ac791n_demo_demo_devkitboard
all: ac791n_demo_demo_devkitboard
@cmd /c echo +ALL DONE
clean: clean_ac791n_demo_demo_devkitboard
@cmd /c echo +CLEAN DONE
关键修改点:
- 将demo_DevKitBoard设为默认编译目标
- 对应的clean操作也设为默认
- 保留其他工程目标但不设为默认
这样改造后,日常开发只需要:
make编译当前工程make clean清理工程make ac791n_demo_demo_hello编译其他工程(需要时)
4. 开发环境深度优化
4.1 调试输出增强配置
杰理AC79支持USB虚拟串口输出调试信息,但默认关闭。开启方法:
- 修改apps/common/debug/debug_user.c:
c复制#define CONFIG_USB_DEBUG_ENABLE
#define CONFIG_DEBUG_ENABLE
#define DEBUG_TAG "MAIN"
- 在代码中使用打印宏:
c复制log_info("System init done, version:%s", sys_version);
- VSCode安装Serial Monitor插件,配置115200波特率
注意:打印内容不宜过多,否则会影响实时性。关键节点打印即可。
4.2 VSCode工程配置技巧
在.vscode/settings.json中添加以下配置可提升体验:
json复制{
"C_Cpp.default.includePath": [
"${workspaceFolder}/include_lib",
"${workspaceFolder}/cpu/wl82/include"
],
"files.exclude": {
"**/.git": true,
"**/.svn": true,
"**/.hg": true,
"**/CVS": true,
"**/.DS_Store": true,
"**/*.o": true,
"**/*.d": true
}
}
这些配置实现了:
- 自动补全包含所有SDK头文件
- 隐藏中间编译文件
- 保持工程界面整洁
5. 实战问题排查指南
5.1 常见编译错误解决
-
找不到头文件
- 检查winmk.bat是否已执行
- 确认include路径在VSCode中配置正确
-
链接失败
- 清理工程后重新编译(make clean && make)
- 检查lib目录是否存在对应库文件
-
烧录超时
- 确认开发板已连接且进入烧录模式
- 检查USB线是否接触良好
5.2 调试技巧实录
-
打印不输出
- 确认CONFIG_USB_DEBUG_ENABLE已定义
- 检查串口终端波特率设置
- 查看开发板USB枚举是否正常
-
实时调试方法
- 在关键函数入口/出口添加打印
- 使用log_hexdump()打印二进制数据
- 重要变量添加watchpoint监控
-
性能优化建议
- 减少调试打印频率
- 关键路径禁用打印
- 使用条件编译控制调试代码
经过这些改造后,我的开发效率得到了显著提升。现在只需在VSCode中打开终端,依次执行winmk、make、download.bat就能完成完整开发流程,配合Serial Monitor实时查看调试信息,真正实现了嵌入式开发的"编码-编译-烧录-调试"闭环。