写一下部分用法
1. Clang(编译器前端)
目标与语言
| 参数 |
说明 |
--target=mcs251-unknown-none |
目标(必选;裸机无 OS) |
-std=c2x |
C23;-std=c11 亦常用 |
-fmcs251-keil |
Keil 语法:启用 bit 关键字(typedef bit BOOL 等)。 |
-O0 / -O1 / -O2 |
优化档。 |
内存模型
| 参数 |
说明 |
-Xclang -mcs251-memory-contract=1,2,32,8,1 |
可换用 -mcs251-memory-model=xsmall,见映射表 |
五元组字段:(TransportVersion, ASLayoutVersion, AS0Bits, Placement, ExecutionContract)
-mcs251-memory-model= |
元组 |
AS0Bits |
Placement |
| tiny |
1,2,16,1,1 |
16 |
1 |
| xtiny |
1,2,16,8,1 |
16 |
8 |
| small |
1,2,32,1,1 |
32 |
1 |
| xsmall(默认) |
1,2,32,8,1 |
32 |
8 |
| large |
1,2,32,3,1 |
32 |
3 |
文件头与诊断
| 参数 |
说明 |
-resource-dir <dir> |
默认指向 lib/clang/24 |
-Werror=unknown-attributes |
必开,错误机制还没做完 |
-Wall -Wextra |
常规 |
输出形态
| 参数 |
说明 |
-S -emit-llvm <src> -o <.ll> |
输出LLVM IR中间语言 |
-c |
直接出 .o |
2. llc(编译器后端)
MCS251 专属
| 参数 |
说明 |
-mtriple=mcs251 |
目标指令集(等价 --mtriple) |
-mcs251-memory-contract=1,2,32,8,1 |
必须与 clang 侧一致 |
-mcs251-memory-model=<tiny|xtiny|small|xsmall|large> |
模型名入口(效果与 -mcs251-memory-contract等同;二选一) |
-mcs251-object-format=elf |
输出 ELF 文件 |
通用
| 参数 |
说明 |
-filetype=obj |
输出 .o 文件 |
3. ld.lld(链接器,-flavor mcs251)
ld.lld -flavor mcs251 [布局参数] [输出参数] <.o …按依赖顺序…> <crt-*.o> -o <.elf>
区域布局(--area-start=<区>=<地址>)
| 区 |
语义 |
HOME=0xff0000 |
保留基址 |
VECS=0xff0003 |
向量区 |
BOOT=0xff0500 |
启动区 |
CSEG=0xfe0400 |
代码窗起点(按 EEPROM=1K 预留推导) |
XINIT=0xfff400 |
xdata 初始化地址 |
XDATA_INIT=0xfff600 |
同上第二段 |
XSEG=0x010000 |
片上 XDATA 窗起点(12K128: 0x010000-0x011FFF) |
窗口与容量
| 参数 |
说明 |
--edata-end=0x0fff |
EDATA 上界(12K128 内部 4KB:0x000000-0x000FFF) |
--xdata-size=0x2000 |
XDATA 容量(12K128 片上 8K) 默认布局;越界会触发 XDATA capacity … exceeds --xdata-size |
--flash-base=0xfe0400 |
ROM 基址(必须与烧录时 EEPROM 预留一致) |
--flash-size=0x1fc00 |
ROM 大小 |
输出与选项
| 参数 |
说明 |
-o <file> |
输出 ELF |
--map=<file> |
全量 map |
--map-json=<file> |
map 的 JSON 形态 |
--keep-symbols |
使用 keep-symbols 语法 |
--placement-report=<file> |
报告(placement report text v1 字节格式) |
--verify-placement |
链接器自验证 |
4. llvm-objcopy(格式处理)
| 参数 |
说明 |
-O ihex <.elf> <.hex> |
转换为 Intel-HEX |
--dump-section .mcs251.load.0=<bin> |
转换为 静态指令 |
-O binary --only-section=.text <exe> <bin> |
提取编译器版本信息 |