ADS这个缩写在工程圈里有点“害人”:网上搜出来的结果,大半是射频微波那套Advanced Design System,可对做嵌入式底层的人来说,ADS首先应该是Arm Developer Suite——ARM公司早年那套集成开发环境。我要聊的,就是它安装过程中那些让人血压升高的坑。
为什么现在还要折腾一个老掉牙的开发套件?原因无非三种:一是老项目指定用ADS 1.2维护,编译器一换整个工程就得返工;二是很多教学和芯片手册至今还是用ADS示例写的;三是想在ARM7/ARM9这类老核上重新学习汇编和底层启动流程。不管哪种,装好它是前提。这篇文章不打算讲太多“为什么”,直接按我实际踩过的坑来写,从环境准备、许可证配置、命令行验证到AXD仿真全走一遍,最后附高频报错速查表,照着操作能省下不少时间。
1. 先搞清楚一个概念:ADS 1.2到底是什么
1.1 工具链组件拆解
Arm Developer Suite不是单一编译器,是一整套嵌入式交叉开发工具集合。ADS 1.2常见组件如下:
| 组件 | 作用 | 备注 |
|---|---|---|
| CodeWarrior IDE | 图形化项目管理、编译、链接入口 | 基于Metrowerks界面,老程序员熟悉的风格 |
| armcc / armcpp | C/C++编译器 | 生成ARM/Thumb指令 |
| armasm | 汇编器 | 支持ARM和Thumb汇编语法 |
| armlink | 链接器 | 生成axf/ELF镜像 |
| armar | 静态库管理工具 | 相当于ARM版的ar |
| fromelf | 镜像格式转换工具 | axf转bin/hex,或反汇编 |
| AXD Debugger | 调试器 | 支持ARMulate软件模拟和JTAG目标调试 |
| ARM Firmware Suite | 底层固件与启动代码 | 老项目中常见 |
这套东西和现在主流的Keil MDK、ARM Compiler 6有着本质区别。ADS的armcc基于旧的ARMCC 2.x/3.x技术,语法、内联汇编、编译选项都是老一套,工程里也全是.mcp项目文件。这就导致“用ADS 1.2建好的老工程,换到新工具链基本等于重写”。
1.2 版本选择:为什么大家默认找ADS 1.2
ADS有1.0、1.1、1.2三个主要版本。实际维护中,1.2用的人最多,因为它修复了大量编译器和调试器bug,对ARM9、XScale等核心的支持也更完善。1.0和1.1的工程拿到1.2下基本能直接编译,但反过来会有问题。
还有一个容易忽略的点:ADS 1.2发布后还有Service Pack补丁包,典型的是SP1和SP2。补丁修复的是编译器优化问题和AXD在某些目标下的连接异常。生产项目建议至少打到SP1以上,否则在特定编译优化等级下,代码行为会和预期不符。
注意:网上流传的“ADS 1.2安装包”版本比较乱,有的不带Service Pack,有的集成好了。安装完成后建议马上确认编译器版本号,版本号不同,很多底层的库行为都不一样。
1.3 为什么这个软件安装起来格外费劲
ADS 1.2是2003年前后的产品,它的设定是基于Windows 2000/XP的使用场景。拿到今天的Win10/Win11上,自然到处碰壁。我归纳了安装坑多的四个根源:
- 系统兼容性差:老的安装程序还在用16位或很老的32位安装逻辑,新版Windows对它的权限控制、路径重定向都和当年完全不同。
- 许可证机制复杂:ADS采用FLEXlm授权管理,既支持节点锁定文件,也支持服务器浮动许可。环境变量一个字母写错,编译器直接罢工。
- 路径敏感:ARM工具链对安装路径、工程路径中的空格和中文非常敏感,默认装的“C:\Program Files\ARM\ADSv1_2”这种路径就经常埋雷。
- 杀毒软件干扰:安装程序要写注册表、释放License服务,杀毒软件偶尔会把关键文件当风险文件处置,导致装一半就失败。
理解了这四条,后面很多诡异问题都不用慌,先往这上面排查就行。
2. 安装前的准备工作,做足能避掉一半以上的坑
2.1 先选一个合适的运行环境
我的核心建议是:如果条件允许,优先在Windows XP虚拟机里装ADS 1.2。VMware Workstation Player是免费的,装个精简版WinXP SP3,再配个共享文件夹,ADS就在虚拟机里跑,工程文件放在共享目录供宿主机编辑。这么做的好处是环境固定,这次装好,以后随便复制虚拟机都行,不会再出现系统更新后突然跑不起来的意外。
如果实在不想上虚拟机,只用Win10/11真机装,也不是完全不行,但要做三件事:安装时用“以管理员身份运行”启动setup.exe;装完之后,对安装目录下的CodeWarrior.exe和AXD.exe右键,在“兼容性”标签里选Windows XP (Service Pack 3),同时勾选“以管理员身份运行此程序”;关闭杀毒软件实时防护,至少等到装完验证通过再开。这里不是绝对的,但按这个顺序操作成功率最高。
2.2 把安装需要的文件提前准备齐全
开工前,先把这几样东西找到放一个目录里,不要边装边找:
- ADS 1.2主安装程序(一般是setup.exe或Autorun.exe)
- Service Pack补丁包(SP1、SP2,建议SP2)
- 许可证文件license.dat,或者许可证服务器地址
- 一份工程模板或示例工程,用于安装后验证
这里我要专门说一下许可证的问题。ADS用的是FLEXlm授权,license.dat是关键文件。如果是正版或以前公司遗留的授权,许可文件里会包含FEATURE行和一行SERVER或HOSTID信息。安装时会用到一个叫“License Installation Wizard”的东西,它支持两种模式:一是直接指定本地的license.dat文件;二是配置远程许可证服务器(指定服务器名和端口)。自己练习用,拿到的是节点锁定许可证(绑定主机MAC或硬盘ID),就选第一种;如果是团队共用浮动许可,就选第二种。
注意:license.dat的路径不能有中文,也尽量别放在桌面。很多人图省事放桌面上,结果环境变量指向的路径带着中文名,编译器读取的时候直接乱码。建议直接放C:\ads_license\license.dat这种纯英文路径。
2.3 动手之前先设置系统环境
安装前还有一个容易忽略的准备工作:先建一个专门的环境变量入口。ADS安装完成后,工具会通过环境变量寻找许可证,最常见的是LM_LICENSE_FILE。这个变量要指向license.dat的完整路径,比如:
LM_LICENSE_FILE = C:\ads_license\license.dat在Windows上设置路径是:右键“此电脑” -> “属性” -> “高级系统设置” -> “环境变量”,在系统变量里新建。老资料里也有提到ARM_LICENSE这个变量的,实际ADS主要认LM_LICENSE_FILE,保险起见两个都设为同样的路径也不冲突。
另外,安装目标路径建议手动改成简单样式,比如C:\ADS1.2,而不要用带空格的默认路径。这样能避掉后来编译时各种makefile路径解析问题。
3. 一步一步安装ADS的实操记录
3.1 解压、运行安装程序时常见的问题
很多网上下载的ADS 1.2都是压缩包或ISO镜像。我的建议是解压到纯英文目录再运行安装程序,不要直接在压缩软件里双击setup.exe。原因很简单:老安装程序对“当前工作目录”要求很高,直接从压缩包内部运行,临时目录一旦带中文或特殊字符,安装步骤就会在中途弹错误。
双击setup.exe后,界面是老式的InstallShield向导。安装过程中会让你勾选组件,我实际生产维护中建议全选,包括ARM Firmware Suite和Debugger相关组件,不要贪图省空间取消某些项。因为这个套件整体是比较老旧的模块化结构,有些组件之间共享头文件和库,少装了后面调用时报错非常难排查。
安装到快要结束时,License Installation Wizard会自动弹出来。这一步是大部分新手最先卡住的地方。
3.2 License安装这一步怎么做才不出错
在License Installation Wizard里,我建议选“Install a license”并手动浏览选到你的license.dat文件。如果选“Configure license server”,则需要填服务器名和端口号,比如server.lab.local:1700。对于多数个人使用场景,用本地文件方式最简单。
选完许可证文件,不要急着点Finish。先检查一下窗口里显示的Feature是否完整。正常的license.dat至少应该包含对编译器、调试器、链接器相关Feature的授权。如果显示的是检测不到特征,或者提示没有权限,多数时候是license.dat里HOSTID和当前机器不匹配。这时候无论怎么重装都没用,必须先解决许可证文件本身的问题。
许可证配置完成之后,建议先确认系统环境变量LM_LICENSE_FILE是否被正确写入了。在命令行窗口执行:
echo %LM_LICENSE_FILE%如果输出为空,说明安装程序没有把许可证路径写进系统环境变量,需要手动补上去。很多“编译器找不到许可证”的报错,根本不是许可证文件坏了,就是环境变量没生效。
3.3 安装完成后的目录与命令行验证
安装完成后,进入安装目录,正常情况下能看到这些子目录:
Bin:armcc、armasm、armlink、fromelf等命令行工具Include:C/C++头文件Lib:ARM C库和DSP库RDI:调试相关组件目录
验证安装是否成功的第一个动作,不是打开IDE,而是先打开命令行,把目录切到Bin目录下,执行:
armcc -E -o nul test.c没有test.c文件的话也没关系,直接执行armcc不带任何参数,看它是否打印出编译器版本和用法。如果命令能正常输出版本信息,说明编译器本体没坏,许可证验证也通过。如果提示找不到许可证或报错FLEXlm相关错误,就先回到上一小节检查环境变量和license.dat路径。
验证工具链以后,再去开始菜单里启动CodeWarrior IDE。如果IDE能正常起来,到这一步,套件的核心部分就已经装好了。
4. 安装完成后,怎么验证整个工具链真的能用
4.1 用命令行工具编译一个Hello工程
图形界面能打开不代表工具链就正常,因为IDE只是壳,真正干活的是armcc、armlink这些命令行工具。我给读者的建议是,先完全用命令行走通一个最小工程。
写一个最简单的C程序hello.c:
#include <stdio.h> int main(void) { printf("Hello, ARM!\n"); return 0; }在Bin目录下依次执行:
armcc -c -g hello.c -o hello.o armlink -o hello.axf hello.o fromelf -text -c hello.axf第一条命令把C代码编译成ARM对象文件hello.o;第二条做链接,生成ELF格式的axf镜像;第三条反汇编,确认生成的指令是不是ARM指令。
这里有个最典型的坑:如果你在命令行里直接敲armcc而系统提示“不是内部或外部命令”,说明Bin目录没有加入PATH环境变量。手动把C:\ADS1.2\Bin追加到Path里,或者每次都在Bin目录下执行命令。老项目维护中,我习惯把Bin目录手动加进PATH,后面批量脚本调用编译器会方便很多。
4.2 在CodeWarrior IDE里建立最小工程
命令行验证通过之后,再打开CodeWarrior验证IDE流程。新建项目时,选择“ARM Executable Image”模板,把hello.c添加到工程里。
新建工程有一个很重要的环节:在“Debug Settings”里确认“Target Settings”的Post-linker选项设置为ARM fromELF。不设置这一项,编译虽然能通过,但不会生成我们需要的Hex/Bin文件,后面如果要烧录或仿真,还会发现镜像格式不对。
设置好之后,直接Build工程。正常会在工程目录下生成hello_data\Release或hello_data\Debug目录,里面有hello.axf。看到这个文件生成,说明IDE层面的编译、链接也没问题。
4.3 用AXD加载镜像并单步执行
IDE能编译之后,最后验证AXD调试器。打开AXD,在Options里Configure Target,选择ARMulate(软件模拟器),这是ARM自家的指令级模拟器,不需要接任何开发板就能跑ARM代码。
配置好目标后,用AXD的File -> Load Image加载刚才生成的hello.axf。加载后按F10单步执行,观察R0-R15寄存器和PC值的变化。能跑起来、能下断点,这个ADS环境就算彻底装好了,后面再怎么折腾工程都心里有底。
这一步还有个常见低级错误:AXD默认可能在加载镜像后光标停在0x00000000,这时候要看反汇编窗口,确认加载到了main函数附近的代码,而不是停在起始地址不动。如果是停在起始地址不动,多半是axf文件生成时没有包含调试符号,回到CodeWarrior的Debug Settings里打开Generate Debug Information再重新编译。
5. 高频报错和排查思路速查表
5.1 启动与兼容性报错
| 报错或现象 | 可能原因 | 处理办法 |
|---|---|---|
| 安装程序双击没反应 | 安装程序与系统兼容性问题 | 右键setup.exe选“兼容性疑难解答”,或用管理员运行 |
| 提示0xc0000135 | 缺少.NET Framework或VC运行库 | 在Windows功能里启用.NET Framework 3.5(含2.0和3.0) |
| 提示0xc000007b | 系统环境DLL位数不匹配 | 检查是否缺少运行库,尝试以XP兼容模式运行 |
| CodeWarrior启动闪退 | 兼容模式或权限问题 | 对exe文件设XP SP3兼容模式,并勾选管理员身份运行 |
| AXD加载镜像卡死 | 软件模拟器配置被改动 | 在Configure Target里重新选择ARMulate.dll |
5.2 License类报错
许可证是这套老工具里最折磨人的模块。常见的FLEXlm错误信息有:
- 提示“Cannot connect to license server system”:许可证服务器连不上。如果你用的是本地文件许可,多半是环境变量没生效或者license.dat路径写错。
- 提示“LICENSE FILE does not support this version”:license.dat版本不对应,需要换对应ADS 1.2的许可。
- 提示“License server system temporarily disabled”:服务器端临时故障,等一下再试,或者本地许可就没这事。
排查License问题有一个固定顺序:先确定是“本地许可文件”还是“服务器许可”;再检查LM_LICENSE_FILE环境变量;再确认许可证文件和安装程序版本匹配;最后看杀毒软件有没有把license.dat隔离掉。
5.3 其他容易忽略的杂项问题
- 安装路径带空格导致make脚本无法解析:这是老一辈ARM工具的老毛病,尽量用C:\ADS1.2这种简短路径。
- 杀毒软件把安装目录下的armcc.exe当风险文件删除:建议安装验证阶段临时关闭实时防护,验证完再恢复。
- 老项目编译报错“unrecognized option”:说明你用ADS 1.2去编了原本给其他编译器写的makefile,检查makefile里的编译选项是否兼容armcc语法。
- 在Win10/11上CodeWarrior界面显示异常:字体和缩放问题,把显示缩放改成100%或设置兼容模式,一般能解决。
我自己处理老嵌入式项目的习惯是:ADS 1.2固定放在一个特定虚拟机里,工程、许可证、共享目录的路径全部用纯英文短路径,任何时候都不要在这些老工具上贪图默认设置的便利。装一次很简单,装好之后稳定用十年才考验前期的工作。