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 ...
随机推荐
- Linux CentOS Docker Asp.net Core MVC 模板项目的部署
本文只是记录 .net core 3.1 项目的基本部署方法,灵活应对不同情况与需求 工具:VS 2019 Linux CentOS 7 x64 Xshell Xftp Docker 安 ...
- 安卓手机qpython使用感觉
我是写C#的,最佳一时兴起,下载了个qpython来玩儿,发现这东西写点简单的爬虫还行,配合sqlite,可以做一些简单的事情,于是乎想写一个有趣的东西,在qpython写一个脚本,去收蚂蚁森林的能量 ...
- 手机设置网络代理后,网络不可用之app-jmeter性能测试
1.检查crt证书是否安装 (手机) 2.Jmeter设置HTTP代理端口和ip与手机设置代理参数一致即可
- Windows安装使用Chocolatey 包软件管理(类似 rpm , yum, brew , apt-get 包管理器工具)
Windows也能像Linux或者Mac那样命令行安装管理软件了,,,真的太方便了 下载安装 使用window powershell 用管理员运行 Set-ExecutionPolicy Bypass ...
- VScode好用插件
1.Anaconda Extension Pack 可以自动补全anaconda包中的属性名称 2.Code Spell Checker 单词拼写检查,非常推荐,有时候会拼错单词,这个不仅可以指出错误 ...
- 解决vue项目中文出现乱码
出现中文乱码的文件以ediplus打开,右上方有点击file选择sall As....另存为 下方有encoding 选择utf-8 ,覆盖以前的文件,就好了.
- springboot后端接收不到前端传来的表单值
为啥接收不到 因为传来的字段值太大了,springboot默认启动依赖tomcat,tomcat默认接收表单值最大为2MB,将server.tomcat.max-http-form-post-size ...
- 7 Free Energies: 7.4 Umbrella Sampling Example
7.4 Umbrella Sampling Example计算丙氨酸二肽 Phi/Psi 旋转的 PMF http://ambermd.org/tutorials/advanced/tutori ...
- [转]C++回调函数
回调函数 回调函数是一个时时听到的概念,比如在windows API编程时遇到的WinProc函数,就是我们编写而由操作系统调用的函数.现在,我们需要慢慢又详细的记录一下这个问题. 库与使用者的问题 ...
- Constant width to height ratio
<div class="constant-width-to-height-ratio"></div> .constant-width-to-height-r ...