makefile在编译后输出STM32的Flash RAM占用情况的方法

news/2025/1/31 9:00:06/文章来源:https://www.cnblogs.com/lzakou/p/18695631

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/877234.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

您的干净代码可能是别人的技术债务

您的干净代码可能是别人的技术债务 为什么软件模式必须适应团队规模,以及如何正确操作。 大卫罗德纳斯 博士由作者生成 在软件开发中,我们面临着一个奇怪的悖论:对于一个团队来说,使代码更干净、更易维护、更优雅的架构决策,可能会让另一个团队觉得更复杂、更僵化、更麻烦…

读算法简史:从美索不达米亚到人工智能时代02古老的算法

苏美尔文字起源于湿黏土陶筹,楔形文字记录了苏美尔语,促进社会发展。阿卡德、巴比伦帝国相继统治,文字变迁。19世纪欧洲考古学家破译文字。美索不达米亚算法复杂,包括六十进制和毕达哥拉斯定理。埃及数学留存少,欧几里得算法著名。1. 苏美尔 1.1. 位于苏美尔地区的乌鲁克,…

计量经济学——空间计量概述(十八)

img { display: block; margin-left: auto; margin-right: auto } table { margin-left: auto; margin-right: auto } 空间计量经济学(Spatial Econometrics)创新性地解决了经典计量方法在空间数据分析中的局限性,研究地理观测值之间的相互关系。近年来,在人文社会科学的“…

经济经济学——空间计量概述(十八)

img { display: block; margin-left: auto; margin-right: auto } table { margin-left: auto; margin-right: auto } 空间计量经济学(Spatial Econometrics)创新性地解决了经典计量方法在空间数据分析中的局限性,研究地理观测值之间的相互关系。近年来,在人文社会科学的“…

Cisco NX-OS System Software - ACI 16.1(2g)F - 适用于 ACI 模式下的 Nexus 9000 系列交换机系统软件

Cisco NX-OS System Software - ACI 16.1(2g)F - 适用于 ACI 模式下的 Nexus 9000 系列交换机系统软件Cisco NX-OS System Software - ACI 16.1(2g)F 适用于 ACI 模式下的 Cisco Nexus 9000 系列交换机系统软件 请访问原文链接:https://sysin.org/blog/cisco-aci-16/ 查看最新…

Cisco APIC 6.1(2g)F - 应用策略基础设施控制器

Cisco APIC 6.1(2g)F - 应用策略基础设施控制器Cisco APIC 6.1(2g)F - 应用策略基础设施控制器 Application Policy Infrastructure Controller (APIC) 请访问原文链接:https://sysin.org/blog/cisco-apic-6/ 查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org思科…

Python多线程爬取亚马逊商品数据

前言 新年快乐 1.环境准备 使用miniconda为亚马逊创建一个新环境,防止feapder和其他包冲突(比如scrapy)。 # 创建一个新的 Conda 环境: conda create -n python_feapder python=3.12# 查看已创建的环境 conda info --envs# 激活环境 conda activate python_feapder# 安装所…

Debug: debugger失效排查

MarkTime: 2024-11-24 19:25:17 LogTime: 2024-11-24 19:25:17记一次 debugger 断点失效原因的排查版本说明Chrome: 131.0.6778.86 Vue: 3.2.27结论检查 是否启用了 谷歌浏览器 的 自定义排除规则, 并把 node_modules 给排除了 检查 前端项目配置文件eslint 是否有覆盖规则, 使…

Debug: 前端发送请求参数传递null, 后端转换实体类对应变量自动注入默认值

MarkTime: 2024-11-18 16:19:47 LogTime: 2024-11-25 01:26:05实体类属性未正确定义原因导致: ​ 基础数据类型未被初始化, 会对对应变量赋予默认值(int: 0; boolean: false;...) ​ 包装类型允许存储null, 不会进行默认值赋予, 实体类中如果需要设置默认值需要自行指定(privat…

Vue: 项目映射到外网后, 前端打包配置调整

Mark Time: 2024-11-15 15:55:34 Log Time: 2024-11-24 16:00:00小项目, 记录下前端打包的debug过程(配置文件有做部分删减, 看个结构就好)说明 版本说明项目前后端分离axios: 0.24.0node: 14.18.0npm: 6.14.15vue: 3.2.27webpack: 4.46.0webpack-bundle-analyzer: 4.8.0背景说…

Pyton多线程爬取亚马逊商品数据

前言 新年快乐 1.环境准备 使用miniconda为亚马逊创建一个新环境,防止feapder和其他包冲突(比如scrapy)。 # 创建一个新的 Conda 环境: conda create -n python_feapder python=3.12# 查看已创建的环境 conda info --envs# 激活环境 conda activate python_feapder# 安装所…

独立开发经验谈:如何通过 Docker 让潜在客户快速体验你的系统

如果你的产品是和我的在线客服系统一样,100% 允许用户私有化部署的,那你一定要使用 Docker 技术,让用户能够快速体验到你的系统,以及能够在生产环境中非常轻松的把你的产品用起来。我在业余时间开发了一款自己的独立产品:升讯威在线客服与营销系统。陆陆续续开发了几年,从…