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启动!

posted @   不才啊kou  阅读(45)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek-R1本地部署如何选择适合你的版本?看这里
· 传国玉玺易主,ai.com竟然跳转到国产AI
· 自己如何在本地电脑从零搭建DeepSeek!手把手教学,快来看看! (建议收藏)
· 我们是如何解决abp身上的几个痛点
· 普通人也能轻松掌握的20个DeepSeek高频提示词(2025版)
点击右上角即可分享
微信分享提示