makefile在编译后输出STM32的Flash RAM占用情况的方法
知乎 - STM32 GCC工程编译后输出FLASH RAM使用占比的方法 里面这个方法看得我血压飙升,本身代码很不直观,写起来要反斜杠,还留了两行没用的代码,还有各种依赖命令,subst和bc在我的Debian上都没有,可能是用的WSL的原因。为了让这个小脚本有更好的兼容性,我用在makefile里面引入python脚本的方法完成了这个工作。
Python方法
以下文件保存在make/free_elf.py
import subprocess
import sys
gcc_elf_size = sys.argv[1]
elf_file = sys.argv[2]
flash_size = int(sys.argv[3])
mem_size = int(sys.argv[4])
text, data, bss = map(lambda x: int(x), # subprocess 返回的是str,计算要转为int
subprocess.run([gcc_elf_size, elf_file], text=True, capture_output=True)
.stdout.splitlines()[1].split()[0:3]) # 第2行,第1~3列的内容
flash_used = (text + data) / (flash_size * 1024) * 100
mem_used = (data + bss) / (mem_size * 1024) * 100
print('-------------------------------------------------------------')
print(f'Flash: {text + data} / {flash_size * 1024} bytes, {flash_used:.2f}% used (.text + .data)')
print(f'SRAM: {data + bss} / {mem_size * 1024} bytes, {mem_used:.2f}% used (.data + .bss)')
makefile中使用例(截取部分)
FLASH_SIZE := 512
MEM_SIZE := 64
TEL_PATH := ./
sizedummy: $(ELF_FILE)
@echo 'Invoking: Print Size'
$(TC32_COMPILER_PATH)tc32-elf-size -t $(ELF_FILE)
@python3 $(TEL_PATH)make/free_elf.py $(TC32_COMPILER_PATH)tc32-elf-size $(ELF_FILE) $(FLASH_SIZE) $(MEM_SIZE)
@echo 'Finished building: $@'
@echo ' '
其实我这个不是STM32,是TLSR8359,挂STM32的羊头看的人多一点😋。在我的makefile里面sizedummy这个目标是在编译完成后收尾调用的,实际使用需要自己把这段脚本附加到合适的位置并且修改变量。
效果如下
邪门方法
那有没有不创建新的py文件的方法?有的兄弟有的。
下面代码也是截取部分,相关变量需要修改使用。
sizedummy: $(ELF_FILE)
@echo 'Invoking: Print Size'
$(TC32_COMPILER_PATH)tc32-elf-size -t $(ELF_FILE)
@python3 -c "import subprocess; text, data, bss = map(lambda x: int(x), \
subprocess.run(['$(TC32_COMPILER_PATH)tc32-elf-size', '$(ELF_FILE)'], text=True, capture_output=True)\
.stdout.splitlines()[1].split()[0:3]);\
flash_used = (text + data) / ($(FLASH_SIZE) * 1024) * 100;\
mem_used = (data + bss) / ($(MEM_SIZE) * 1024) * 100;\
print('-'*50);\
print(f'Flash: {text + data} / {$(FLASH_SIZE) * 1024} bytes, {flash_used:.2f}% used (.text + .data)');\
print(f'SRAM: {data + bss} / {$(MEM_SIZE) * 1024} bytes, {mem_used:.2f}% used (.data + .bss)')"
@echo 'Finished building: $@'
@echo ' '
走的弯路
本身我也是才入门makefile,makefile里面变量是$(var)
,这在shell里面是获取命令返回值用的。这两个玩意混写在一个文件里面,右脑bashshell左脑makefile,左右脑互博,感觉脑袋痒痒的,可能是尖尖开始发育了。
shell本身不支持小数计算,我又不想依赖bc计算百分比,于是使用了如flash_used = (text + data) * 1000 / ($(FLASH_SIZE) * 1024) * 100
分子乘以1000,结果的显示用shell的变量切片方法${flash_used:0:2}.${flashed_used:-2:0}%
。然后发现对于1%和超过100%没法正常显示,如输入 123 预期显示 1.23% 会显示为 12.23% 。shell的变量切片只能从左向右切,不能从右向左切。要实现原本的目的需要写一堆又臭又长的分支语句。于是我直接del删了,PyCharm启动!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek-R1本地部署如何选择适合你的版本?看这里
· 传国玉玺易主,ai.com竟然跳转到国产AI
· 自己如何在本地电脑从零搭建DeepSeek!手把手教学,快来看看! (建议收藏)
· 我们是如何解决abp身上的几个痛点
· 普通人也能轻松掌握的20个DeepSeek高频提示词(2025版)