STM32下载ELF文件、最小可执行bin文件测试
1、STM32能下载ELF格式的文件吗?
答:可以。因为所谓的bin文件就是ELF文件的.text代码段。
当然前提是下载工具能识别ELF文件格式,STM32下载ELF文件并不意味着STM32可以把ELF download到Flash上,而是下载工具能从ELF提取到bin文件,下载时通信链路上传输的也只有要bin文件。
例如有elf文件:
$ arm-none-eabi-objdump.exe -s main2.elf main2.elf: file format elf32-littlearm Contents of section .text:
8000000 00100020 09000008 01488546 fee70000 ... .....H.F....
8000010 00100020 ...
Contents of section .ARM.attributes:
0000 41200000 00616561 62690001 16000000 A ...aeabi......
0010 05436f72 7465782d 4d340006 0d074d09 .Cortex-M4....M.
0020 02
arm-none-eabi-objcopy -O binary main2.elf main2.bin, 它生成bin文件为:
address 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 AscII
00000000 00 10 00 20 09 00 00 08 01 48 85 46 fe e7 00 00 ... .....H.F....
00000010 00 10 00 20 ...
使用STM32 cube programmer直接打开elf文件不仅可以预览,还能直接下载ELF文件,看到的数据和上面使用objump生成的bin文件一样的。

在cube programmer里连下载地址都不用设置,若打开的是bin文件,无论Flash还是cube programmer,都是需要手动设置Flash下载地址的。

2、STM32最小的可执行bin文件是多大?
答:10字节。
- 按照STM32编程手册,STM32启动是从0地址取堆栈指针(MSP),从0x04地址取复位入口的PC指针,还需要设置堆栈地址(2条指令),最后是mian函数loop,所以最小的代码至少是4+4+8+2合计20字节。
- 倘若不考虑代码通用性,可以把堆栈地址去掉,合计10字节即可,实际代码只有1条2字节。
0x00地址:MSP值。
0X04地址:reset handler地址,值为0x08
0x08地址:BL . (死循环,thumb指令2字节)
- 举例如下:
下面的汇编代码中0x04地址为PC初始值: 09 00 00 08,即0x08000009,为何是奇数?
答:cortex MCU不可能产生奇数指令,ARM模式4字节对齐低2位是0,Thumb模式2字节对齐低1位是0,所以PC最低位就属于空闲的,而Cortex MCU需要识别当前是ARM模式还是Thumb模式,所以使用PC最低位就能识别这两种模式。
R15是程序计数器,在汇编代码中用PC表示,ARM规定PC最低位LSB用于表示是ARM指令(0)还是Thumb指令(1)。
$ arm-none-eabi-objdump.exe -d main2.elf main2.elf: file format elf32-littlearm Disassembly of section .text: 08000000 <vtable>:
8000000: 00 10 00 20 09 00 00 08 ... .... 08000008 <reset_handler>:
8000008: e7fe b.n 8000008 <reset_handler>
这并不是一个理论demo,而是一个可以执行的程序。
第一步下载:

第二步,执行,由于这个程序没有任何有效的命令,所以无论如何单步都看不到变化,只能看到SP和PC指针已经正确的load了。

简单修改,加一个寄存器做累加计算方便看到效果,每点一次单步寄存器值加1,代码由10字节变为了14字节。
$ arm-none-eabi-objdump.exe -d main2.elf main2.elf: file format elf32-littlearm Disassembly of section .text: 08000000 <vtable>:
8000000: 00 10 00 20 09 00 00 08 ... .... 08000008 <reset_handler>:
8000008: 2000 movs r0, #0 0800000a <main_loop>:
800000a: 3001 adds r0, #1
800000c: e7fd b.n 800000a <main_loop>
第一步:下载
第二步:复位,执行指令
8000000: 00 10 00 20 09 00 00 08
8000008: 2000 movs r0, #0

单步:执行指令 ,累加和循环
0800000a <main_loop>:
800000a: 3001 adds r0, #1
800000c: e7fd b.n 800000a <main_loop>

单步:

单步:

单步

单步:

直接全速run后暂停:

STM32下载ELF文件、最小可执行bin文件测试的更多相关文章
- 【Linux开发】【DSP开发】利用CCS6.1生成out文件的同时生成bin文件
[Linux开发][DSP开发]利用CCS6.1生成out文件的同时生成bin文件 标签:[DSP开发] [Linux开发] 尝试在windows上安装的CCS6.1开发AM4378-Linux下的应 ...
- STM32学习笔记:【002】BIN文件通过ST-LINK烧录STM32芯片
以下提供2种下载方式 KEIL编译下载 KEIL 5 在开发中还算是比较强大的一种平台.在开发中通过编译再下载会显得很方便. 尽管这个是老生常谈的问题,但还是在这里补全这个设置步骤 1.点击“魔法棒” ...
- centos 如何执行.bin 文件??
默认下载,或者上传到 linux 上的 .bin 文件都是白色的,不能被执行. 想要用 ./ 命令去执行,需要先给这个 bin 文件赋权限 chmod u+x 文件名(全名称) 执行完成这个命令,可以 ...
- 将txt文件数据转成bin文件.
之前用牛逼的绘图以及分析bmp的像素文件的方法, 整理出汉字编码从: 0x4E00到0x9FA5, (维基上说是9FD5, 完了, 回头再更新吧.) https://en.wikipedia.org/ ...
- Keil如何生成bin文件【Keil生成Bin文件的方法】
使用过Keil的同鞋都知道,现在Keil中默认可以输出.axf的调试文件和可以通过钩选输出的.hex可执行文件,没有bin(二进制)文件的输出选项.可是偏偏某些时候需要或者习惯性的使用.bin文件来进 ...
- 创建可执行bin安装文件
[应用场景] 简化操作,对于有些安装操作而言,需要包含安装脚本和脚本需要的文件两部分,封装成可执行bin文件之后就只有一个安装包了. 代码保护,在很多情况下,我们并不希望用户可以直接接触到代码部分,这 ...
- ARM 之一 ELF文件、镜像(Image)文件、可执行文件、对象文件 详解
[转]https://blog.csdn.net/ZCShouCSDN/article/details/100048461 ELF 文件规范 ELF(Executable and Linking ...
- ubuntu下安装bin文件
从Java官网下载的安装文件,有的只有bin文件,没有.tar.gz文件. ①进入设备终端,通过sudo -s或su回车,切换到管理员用户:②输入管理员密码然后回车:③输入sudo chmod +x ...
- PowerShell让系统可以执行.ps1文件
.ps1文件是PowerShell写好的脚本文件.在Windows系统中,默认情况下是不允许执行.ps1文件的,那么怎么才能让系统允许执行.ps1文件呢? 什么是“.ps1”文件? 这个是PowerS ...
- 使用java对执行命令行 或 执行bat文件
public class Hellotianhao { public static void main(String[] args) throws Exception{ System.out.prin ...
随机推荐
- [C#]协变Covariance案例
协变参考代码1: using System; using System.Collections.Generic; using System.Linq; namespace CovarianceSoOn ...
- python 连接蓝牙设备并接收数据
python 连接蓝牙设备 原始内容 # %% from binascii import hexlify import struct from bluepy.btle import Scanner, ...
- 调用webservice校时
先调用网络获取网络时间 namespace Utility{ /// <summary> /// 网络时间 /// </summary> publ ...
- 关系类处理专题之创建关系类|RelationShipClass
/// <summary> /// 存在于数据库中的数据集中 /// </summary> /// <param name="mdbPath"> ...
- rabbit.bat server启动闪退,rabbitmq (ArgumentError) argument error,rabbitmq页面无法开启解决方案
步骤1:下载rabbitmq-plugins rabbitmq-plugins enable rabbitmq_managemen 步骤2:rabbitmq-service移除服务 rabbitmq- ...
- 实验九 团队作业6:团队项目编码与Alpha冲刺
项目 内容 课程班级博客链接 2018级卓越班 这个作业要求链接 实验九-团队作业6 团队名称 零基础619 团队成员分工描述 任务1:荣娟,鑫任务2:亚楠,桂婷任务3:亚楠,桂婷任务4:荣娟,鑫任务 ...
- (转载)一篇文章详解python的字符编码问题
一篇文章详解python的字符编码问题 一:什么是编码 将明文转换为计算机可以识别的编码文本称为"编码".反之从计算机可识别的编码文本转回为明文为"解码". ...
- base64压缩
1 /** * 压缩图片 * base64 : 图片base64字符串 * w : 图片宽高最大值 * callback : 回调函数 * quality : 压缩系数0-1之间, 默认0.92 * ...
- Docker教程、架构、资源
一.Docker教程 Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源.Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中 ...
- 基于深度学习的农作物叶片病害检测系统(UI界面+YOLOv5+训练数据集)
摘要:农作物叶片病害检测系统用于智能检测常见农作物叶片病害情况,自动化标注.记录和保存病害位置和类型,辅助作物病害防治以增加产值.本文详细介绍基于YOLOv5深度学习模型的农作物叶片病害检测系统,在介 ...