gcc开发常用命令

  • 生成HoltekBuild.exe程序

    1
    gcc HoltekBuild.c -o HoltekBuild.exe -luser32
  • 编译生成代理程序:生成的是静态文件-直接使用

    1
    gcc proxy.c -o hgcc32.exe -m32 -static -s
  • *复制工具到BIN目录下

    1
    copy /y hgcc32.exe "%DEST_DIR%\hgcc32.exe"

开发需求

一直使用HT-IDE界面开发,想着是否有Linux模式开发,打开IDE的BIN目录发现有HGCC.EXE程序,也就能实现命令行编译。这样后续接入AI或者openclaw等工具都将方便很多。所以就计划深入研究,越深入越发现特别多坑,不知不觉花了差不多两星期才跑通所有编译链接流程!

如果过程中没有AI帮助查问题估计是做不了,哪怕做得了也要花费很多时间精力!基本都是豆包跟Gemini查找答案

官方文档对命令行介绍特别简单,仅HGCC参数说明而已,从文件中看出其仅支持C语言编译成ASM,后续工具说明均无,也可能是官方没有考虑会有人用到命令行开发,问过官方技术支持也是说没有,因此只能够自己摸索。

开发流程

  1. 针对IDE调用每个合泰开发的工具,对其进行拦截转换,例如IDE调用HGCC32程序,则手动写一个HGCC32.EXE程序,然后挟持参数,将原本HGCC32更名为HGCC32_real.exe程序,然后调用。这样就能看到中间传参,就是做个数据转换程序。其他工具类似。

  2. 根据每个工具挟持到的数据进行分析转换,后面就能根据命令提供相应的控制以达到想要的效果。这里挟持的数据还有一个用途,那就是对参数配置可以跟IDE设置一样,这些平时编译基本不会修改到部分。

  3. 根据挟持内容制作测试工具,对每个工具手动测试运行,要保证每个都能达到想要效果

  4. 制作HoltekBuild.exe来接替IDE进行程序编译最后生成MTP等烧录程序

这几个步骤都花费了好长时间,特别是 HASMGCC32 编译汇编代码,因要跟多个参数,很容易就报错!特别是文件传送参数 @”file” 后面跟的路径需要添加双引号。

各类核心工具

HGCC32:将.C文件编译成ASM汇编文件

HASMGCC32:将.ASM汇编文件编译成OBJ跟LST文件

HLINKW32:将.OBJ跟LIB等文件链接成TSK MAP DBG 等文件,同时会提示使用了多少ROM跟RAM的信息

HCODGEN32:将TSK OPT MEM等信息文件拼接成烧录文件 MTP CV等

HoltekBuild:手动写的一套C到MTP烧录文件程序

HoltekChecksum:根据官方内容手写的校验和跟校验码工具,仅对BIN程序部分提供校验数据

HGCC32

这部分是最容易,因为有用户手册

参数说明

参数 含义
-g 产生 debug 信息
O0/-O1/-O2/-O3/-Os 优化参数
-D[=] 宏定义
-I 设定搜寻头文文件的目录 path
-msingle-ram-bank 单个 RAM
-mmulti-ram-bank 多个 RAM(default)
-msingle-rom-bank 单个 ROM
-mmulti-rom-bank 多个 ROM(default)
-fno-builtin 不使用 gcc 内建函数
-mno-tbhp 没有 TBHP
-mtbhp=addr 指定 TBHP 地址 addr(default 为 09H)
-mlong-instruction 扩展指令 MCU

五种优化参数: -O0、 -O1、 -O2、 -O3 和 -Os。编译时只能设置其中的一种来编译。
各个优化等级:

  1. -O0:这个等级 ( 字母“ O”后跟个 0) 关闭所有优化选项,也就是没有设置 -O
    等级时的默认等级。这样就不会优化代码。
  2. -O1:这是最基本的优化等级。编译程序会在不花费太多时间的同时试图生成更 快更小的代码。这些优化是非常基础的,但一般这些任务肯定能顺利完成。
  3. -O2: -O1 的进阶优化。这是较优化的等级, -O2 会比 -O1 启用多一些标记。设置了 -O2 后,编译程序会试图提高代码性能而不会增大体积和大量占用编译时间。
  4. -O3:这是最高的优化等级。用这个选项会延长编译代码的时间,而且有可能会因为这个优化的程度而导致产出的代码会偏离原来的代码,一般不使用该优化等级。
  5. -Os:这个等级用来优化代码尺寸。其中启用了 -O2 中不会增加存储空间占用的代码生成选项。这对于存储空间较小的机器非常有用。

截取到的工程参考数据,对应的是IDE上的设置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[D:\Program Files\Holtek MCU Development Tools\HT-IDE3000V8.x\BIN\hgcc32_v3.70.exe]
[-Wno-main]
[-g]
[-quiet]
[D:\ttt\file1.c]
[-o]
[D:\ttt\OUTPUT\file1.ASM]
[-Wall]
[-Os]
[-D__V3__]
[-D__PBP__=1]
[-DDisable_Bit_Initial]
[-I]
[D:\Program Files\Holtek MCU Development Tools\HT-IDE3000V8.x\INCLUDE_V3]
[-I]
[D:\ttt]
[-mmulti-ram-bank]
[-mmulti-rom-bank]
[-muse-tabrdc]
[-fno-builtin]
[-mlong-instruction]
[-mlimp1=0x4,0x3,0x2]
[-mlimp2=0xe,0xd,0xc]
[-mlitbp=0x9,0x7,0x8]
[-mliacc=5]
[-mlipcl=6]
[-mliintc=16]

HASMGCC32

这部分相对难一些,因为要传入文件数据

对每个ASM文件生成对应的OBJ和LST文件

难点:这里最难的点在于要带IDE句柄参数 “/HIDE=” ,也是 proxy 代理中遇到第一个难题!它需要接收来自 HASMGCC32 编译结果,同时反馈给IDE界面,这里做一个双向绑定即可!不过好在它仅接收而不用发送命令给HASMGCC32,开始以为需要双向通讯,后来监听从IDE下发的数据是没有,最终才确定它仅做为HASMGCC32结果接收!后面其他几个也是如此,这里做好后边就基本一致!

这还存在一个巨大的坑:环境问题,IDE3000界面编译没问题,但使用自己编译的 HoltekBuild.exe 运行一直都会提示 **Error (A4005):找不到文件’’**,后边HoltekBuild.exe再展开

参数说明

1
2
3
4
5
6
7
8
usage: HASM [options] source, object, listing
option:
/chip=chip-name
/dsymbol=value
/iinclude-path
/nolist
/z debug information
/h /?

HLINKW32

连接器是将OBJ和LIB等链接起来生成目标TSK和CV

这里基本跟HASMGCC32一样格式,只是文件格式不同,它需要将所有相关的OBJ和LIB列出来

基本文件格式参考

1
2
3
4
5
6
7
8
9
10
[DEBUG @FILE] 内容开始:
"D:\ttt\OUTPUT\startup1_l.OBJ"+
"D:\ttt\OUTPUT\file1.OBJ"+
"D:\ttt\OUTPUT\file2.OBJ",
"D:\ttt\OUTPUT\ttt.TSK",
"D:\ttt\OUTPUT\ttt.MAP",
"D:\ttt\OUTPUT\ttt.DBG",
"LIBHOLTEKGCC.LIB"+
"v3_lmrmc.lib";
[DEBUG @FILE] 内容结束

基本参数参考

1
/HIDE=01240e28 /MCU=BS66F360C /NOLOGO /CVER=V3.70 /OptimizeParam=16 /Stack=12 /LInsVarOpt /EEPROM=80 /TBHP=9

生成的内容就是IDE列出的结果

1
2
3
4
5
6
7
8
9
10
ROM Total Size :		16384 [4000h]
Total Used : 13 [000Dh]
Total Remain : 16371 [3FF3h]
Total Percentage : 0%
RAM Total Size : 1024 [0400h]
Total Used : 6 [0006h]
Total Remain : 1018 [03FAh]
Total Percentage : 0%

HLINK : 程序的开始执行点在程序段'@code'(地址0)。定义在'D:\ttt\OUTPUT\file1.OBJ' 文件中

HCODGEN32

烧录文件生成器,生成 MTP CV文件
对比IDE提示如下:

1
2
建立 'D:\ttt\OUTPUT\ttt.CV' 文档...
建立 'D:\ttt\OUTPUT\ttt.MTP' 文档...

HoltekBuild

构建编译器这就是替代 IDE3000 编译器的工具,根据IDE参数手写的程序,完成从编译到链接和生成整个过程,这也是最终目的!

这里遇到最麻烦的事情就是一直失败,明明参数设置跟IDE都一样,但就提示 Error (A4005):找不到文件’’ ,一直在查命令语句和强制每个步骤测试,一直都是这个结果!卡了差不多三天,仔细将所有参数调成跟IDE一模一样,还特地使用对比代码查看,一模一样的参数结果却不行,连python都用上也是一样!

后来将问题抛给 Gemini 分析,多次验证后才怀疑是环境问题,因为IDE设置了环境而exe没有!

获取当前环境参数 将参数对比发现 HoltekBuild.exe 根本就没任何环境,后续填补环境内就OK!

1
2
3
4
5
6
extern char **environ;
FILE *fEnv = fopen("D:\\ide_env.txt", "w");
for (char **env = environ; *env; ++env) {
fprintf(fEnv, "%s\n", *env);
}
fclose(fEnv);

HoltekChecksum

校验码生成写在了 HoltekBuild 生成bin文件后校验,先写了代码,配置没写,配置和EEP数据需要解析MTP才能得到!

1
2
3
4
5
6
7
uint16_t calc_holtek_checksum(const uint8_t *data, uint32_t len)
{
uint16_t sum = 0;
for (uint32_t i = 0; i < len; i++)
sum += data[i];
return sum;
}

总结

这些工具做好,后续就可以根据功能选择调用编译,直接使用网页都可完成任务,甚至于方便接入小龙虾!
而且不仅仅针对合泰编译器,对于任务调用的exe程序文件都可以使用同样方法
对 Windows 下窗口和任务句柄进一步了解,句柄可以理解为不同进程之间的信息交互,甚至可以简单理解为函数指针!


相关链接(侵删)


=================我是分割线=================

欢迎到公众号来唠嗑: