STM32
Contents
MDK背后的命令·
编译
链接
生成可执行文件
引言
Keil MDK是常用的嵌入式集成开发环境(Integrated Development Environment),使用IDE,很容易操作,点点鼠标就可完成:
- 添加文件
- 指定文件路径(头文件路径、库文件路径)
- 指定链接库
- 编译、链接
- 下载、调试
那么每次点击MDK后会执行什么命令?
1 MDK背后的命令
勾选生成批处理文件.bat ,使用文本编辑器打开:
工程名:led_c ;C文件:main.c 、uart.c ;汇编文件:start.s 。
SET PATH=E:\MDK\ARM\ARMCC\Bin
SET CPU_TYPE=STM32F103RC
SET CPU_VENDOR=STMicroelectronics
SET UV2_TARGET=led_c
SET CPU_CLOCK=0x007A1200
"E:\MDK\ARM\ARMCC\Bin\ArmCC" --Via ".\objects\main.__i"
"E:\MDK\ARM\ARMCC\Bin\ArmAsm" --Via ".\objects\start._ia"
"E:\MDK\ARM\ARMCC\Bin\ArmCC" --Via ".\objects\uart.__i"
"E:\MDK\ARM\ARMCC\Bin\ArmLink" --Via ".\Objects\led_c.lnp"
"E:\MDK\ARM\ARMCC\Bin\fromelf.exe" ".\Objects\led_c.axf" --i32combined --output ".\Objects\led_c.hex"
fromelf --bin --output=led.bin Objects\led_c.axf
fromelf --text -a -c --output=led.dis Objects\led_c.axf
"E:\MDK\ARM\ARMCC\Bin\ArmCC" :armcc编译器,编译C文件。"E:\MDK\ARM\ARMCC\Bin\ArmAsm" :armasm编译器,编译汇编文件。"E:\MDK\ARM\ARMCC\Bin\ArmLink.exe" :链接目标文件"E:\MDK\ARM\ARMCC\Bin\fromelf.exe" :生成axf、hex等可执行文件
最后两条是在user 中添加的生成bin文件和dis反汇编文件的命令:
注意:勾选了create batch file 后,不管文件是否修改,每次点击单编译都会全部编译。
E:\MDK\ARM\ARMCC\Bin 目录下可以看到这些编译工具:
git bash here 后输入./xxx.exe -h 可查看命令信息,如./armar.exe -h :
关于各编译工具的命令使用参考:[转]keil编译链接过程以及ARMCC、ARMASM、FROMELF、ARMLINK、ARMAR的使用
1.1 编译
1.1.1 编译C文件
打开uart.__i 文件:
--c99 --gnu -c --cpu Cortex-M3 -g -O0 --apcs=interwork --split_sections -I .\drivers
-IE:\MDK\ARM-pack\Keil\STM32F1xx_DFP\2.2.0\Device\Include
-IE:\MDK\ARM\CMSIS\Include
-D__UVISION_VERSION="533" -DSTM32F10X_HD
-o .\objects\uart.o --omf_browse .\objects\uart.crf --depend .\objects\uart.d "drivers\uart.c"
使用"E:\MDK\ARM\ARMCC\Bin\ArmCC" 命令编译(uart.__i 中的内容复制到命令后,但需要整理成一行,中间用空格隔开):
"E:\MDK\ARM\ARMCC\Bin\ArmCC" --c99 --gnu -c --cpu Cortex-M3 -g -O0 --apcs=interwork --split_sections -I .\drivers -IE:\MDK\ARM-pack\Keil\STM32F1xx_DFP\2.2.0\Device\Include -IE:\MDK\ARM\CMSIS\Include -D__UVISION_VERSION="533" -DSTM32F10X_HD -o .\objects\uart.o --omf_browse .\objects\uart.crf --depend .\objects\uart.d "drivers\uart.c"
或者直接执行"E:\MDK\ARM\ARMCC\Bin\ArmCC" --Via ".\objects\uart.__i" 即可
使用cmd切换到工程所在文件夹或用git bash here 编译:
这些命令也可以在C/C++中看到:
--c99 --gnu -c --cpu Cortex-M3 -g -O0 --apcs=interwork --split_sections -I ./drivers
-IE:/MDK/ARM-pack/Keil/STM32F1xx_DFP/2.2.0/Device/Include
-IE:/MDK/ARM/CMSIS/Include
-D__UVISION_VERSION="533" -DSTM32F10X_HD
-o .\Objects\*.o --omf_browse .\Objects\*.crf --depend .\Objects\*.d
将其中的*. 通配符替换生成需要编译源文件的名称,然后在末尾追加文件相对路径,如:"drivers\uart.c" ,然后在前面加上"E:\MDK\ARM\ARMCC\Bin\ArmCC" 命令编译即可(依然需要整理成一行,中间用空格隔开)。
使用git bash编译main.c 时却出现以下错误:
main.c 依赖于uart.c ,这里显示找不到uart.h ,但是使用Windows的cmd执行上述命令却没问题,奇怪~
在ArmCC命令后面加上main.__i 的路径后才得以解决:
"E:\MDK\ARM\ARMCC\Bin\ArmCC" --Via ".\objects\main.__i"
1.1.2 编译汇编文件
打开start._ia 文件:
--cpu Cortex-M3 -g --apcs=interwork
-IE:\MDK\ARM-pack\Keil\STM32F1xx_DFP\2.2.0\Device\Include
-IE:\MDK\ARM\CMSIS\Include
--pd "__UVISION_VERSION SETA 533" --pd "STM32F10X_HD SETA 1"
--list .\listings\start.lst --xref -o .\objects\start.o --depend .\objects\start.d "start.s"
使用"E:\MDK\ARM\ARMCC\Bin\ArmAsm" 命令编译:
"E:\MDK\ARM\ARMCC\Bin\ArmAsm" --cpu Cortex-M3 -g --apcs=interwork -IE:\MDK\ARM-pack\Keil\STM32F1xx_DFP\2.2.0\Device\Include -IE:\MDK\ARM\CMSIS\Include --pd "__UVISION_VERSION SETA 533" --pd "STM32F10X_HD SETA 1" --list .\listings\start.lst --xref -o .\objects\start.o --depend .\objects\start.d "start.s"
或者直接执行"E:\MDK\ARM\ARMCC\Bin\ArmAsm" --Via ".\objects\start._ia"
汇编文件编译没有输出log信息,没报错即视作编译成功。
这些命令也可以在Asm中看到:
--cpu Cortex-M3 -g --apcs=interwork
-I E:\MDK\ARM-pack\Keil\STM32F1xx_DFP\2.2.0\Device\Include
-I E:\MDK\ARM\CMSIS\Include
--pd "__UVISION_VERSION SETA 533" --pd "STM32F10X_HD SETA 1" --list ".\Listings\*.lst" --xref -o "*.o" --depend "*.d"
使用方法与编译C文件一样。如果汇编文件与工程在同一目录下则无需在末尾添加其路径:
1.2 链接
打开led_c.lnp 文件:
--cpu Cortex-M3
".\objects\main.o"
".\objects\start.o"
".\objects\uart.o"
--strict --scatter ".\Objects\led_c.sct"
--entry Reset_Handler --summary_stderr --info summarysizes --map --load_addr_map_info --xref --callgraph --symbols
--info sizes --info totals --info unused --info veneers
--list ".\Listings\led_c.map" -o .\Objects\led_c.axf
使用"E:\MDK\ARM\ARMCC\Bin\ArmLink" 命令链接:
"E:\MDK\ARM\ARMCC\Bin\ArmLink" --cpu Cortex-M3 ".\objects\main.o" ".\objects\start.o" ".\objects\uart.o" --strict --scatter ".\Objects\led_c.sct" --entry Reset_Handler --summary_stderr --info summarysizes --map --load_addr_map_info --xref --callgraph --symbols --info sizes --info totals --info unused --info veneers --list ".\Listings\led_c.map" -o .\Objects\led_c.axf
或者直接执行"E:\MDK\ARM\ARMCC\Bin\ArmLink" --Via ".\Objects\led_c.lnp"
输出结果与MDK一致:
这些命令也可以在Linker中看到:
--cpu Cortex-M3 *.o
--strict --scatter ".\Objects\led_c.sct"
--entry Reset_Handler --summary_stderr --info summarysizes --map --xref --callgraph --symbols
--info sizes --info totals --info unused --info veneers
--list ".\Listings\led_c.map"
-o .\Objects\led_c.axf
1.3 生成可执行文件
"E:\MDK\ARM\ARMCC\Bin\ArmLink" --Via ".\Objects\led_c.lnp"
"E:\MDK\ARM\ARMCC\Bin\fromelf.exe" ".\Objects\led_c.axf" --i32combined --output ".\Objects\led_c.hex"
fromelf --bin --output=led.bin Objects\led_c.axf
fromelf --text -a -c --output=led.dis Objects\led_c.axf
ArmLink 与fromelf.exe 需同时执行(否则失败),最后生成:
- led_c.axf
- led_c.hex
- led.bin
- led.dis
END
|