知乎 - STM32 GCC工程编译后输出FLASH RAM使用占比的方法 里面这个方法看得我血压飙升,本身代码很不直观,写起来要反斜杠,还留了两行没用的代码,还有各种依赖命令,subst和bc在我的Debian上都没有,可能是用的WSL的原因。为了让这个小脚本有更好的兼容性,我用在makefile里面引入python脚本的方法完成了这个工作。
Python方法
以下文件保存在make/free_elf.py
import subprocess
import sysgcc_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,计算要转为intsubprocess.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 := 64TEL_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里面是获取命令返回值用的。这两个玩意混写在一个文件里面,左脑反驳右脑,感觉脑袋痒痒的,可能是尖尖开始发育了。
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启动!