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字节。

  1. 按照STM32编程手册,STM32启动是从0地址取堆栈指针(MSP),从0x04地址取复位入口的PC指针,还需要设置堆栈地址(2条指令),最后是mian函数loop,所以最小的代码至少是4+4+8+2合计20字节。
  2. 倘若不考虑代码通用性,可以把堆栈地址去掉,合计10字节即可,实际代码只有1条2字节。

0x00地址:MSP值。

0X04地址:reset handler地址,值为0x08

0x08地址:BL . (死循环,thumb指令2字节)

  1. 举例如下:

下面的汇编代码中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文件测试的更多相关文章

  1. 【Linux开发】【DSP开发】利用CCS6.1生成out文件的同时生成bin文件

    [Linux开发][DSP开发]利用CCS6.1生成out文件的同时生成bin文件 标签:[DSP开发] [Linux开发] 尝试在windows上安装的CCS6.1开发AM4378-Linux下的应 ...

  2. STM32学习笔记:【002】BIN文件通过ST-LINK烧录STM32芯片

    以下提供2种下载方式 KEIL编译下载 KEIL 5 在开发中还算是比较强大的一种平台.在开发中通过编译再下载会显得很方便. 尽管这个是老生常谈的问题,但还是在这里补全这个设置步骤 1.点击“魔法棒” ...

  3. centos 如何执行.bin 文件??

    默认下载,或者上传到 linux 上的 .bin 文件都是白色的,不能被执行. 想要用 ./ 命令去执行,需要先给这个 bin 文件赋权限 chmod u+x 文件名(全名称) 执行完成这个命令,可以 ...

  4. 将txt文件数据转成bin文件.

    之前用牛逼的绘图以及分析bmp的像素文件的方法, 整理出汉字编码从: 0x4E00到0x9FA5, (维基上说是9FD5, 完了, 回头再更新吧.) https://en.wikipedia.org/ ...

  5. Keil如何生成bin文件【Keil生成Bin文件的方法】

    使用过Keil的同鞋都知道,现在Keil中默认可以输出.axf的调试文件和可以通过钩选输出的.hex可执行文件,没有bin(二进制)文件的输出选项.可是偏偏某些时候需要或者习惯性的使用.bin文件来进 ...

  6. 创建可执行bin安装文件

    [应用场景] 简化操作,对于有些安装操作而言,需要包含安装脚本和脚本需要的文件两部分,封装成可执行bin文件之后就只有一个安装包了. 代码保护,在很多情况下,我们并不希望用户可以直接接触到代码部分,这 ...

  7. ARM 之一 ELF文件、镜像(Image)文件、可执行文件、对象文件 详解

    [转]https://blog.csdn.net/ZCShouCSDN/article/details/100048461 ELF 文件规范   ELF(Executable and Linking ...

  8. ubuntu下安装bin文件

    从Java官网下载的安装文件,有的只有bin文件,没有.tar.gz文件. ①进入设备终端,通过sudo -s或su回车,切换到管理员用户:②输入管理员密码然后回车:③输入sudo chmod +x ...

  9. PowerShell让系统可以执行.ps1文件

    .ps1文件是PowerShell写好的脚本文件.在Windows系统中,默认情况下是不允许执行.ps1文件的,那么怎么才能让系统允许执行.ps1文件呢? 什么是“.ps1”文件? 这个是PowerS ...

  10. 使用java对执行命令行 或 执行bat文件

    public class Hellotianhao { public static void main(String[] args) throws Exception{ System.out.prin ...

随机推荐

  1. 单调栈应用--视野总和 go版本

    1.视野总和描叙:有n个人站队,所有的人全部向右看,个子高的可以看到个子低的发型,给出每个人的身高,问所有人能看到其他人发现总和是多少.输入:4 3 7 1输出:2解释:个子为4的可以看到个子为3的发 ...

  2. Rfost的自我介绍+软工五问

    自我介绍+软工五问 问题 解答 这个作业属于哪个课程 网工1934-软件工程 这个作业要求在哪里 作业要求 这个作业的目标 让学生对软件工程有个初步的了解,同时掌握基础的markdown语法和博客园的 ...

  3. find . -name "*.php" -execdir grep -nH --color=auto foo {} ';'

    find . -name "*.php" -execdir grep -nH --color=auto foo {} ';'

  4. Sql Server代理作业、定时任务

    需求: 本次需求为每15分钟获取一次思路为,创建结果表,代理作业定时更新数据并存入结果表,后端只需要调用结果表数据数据,如果超期不同的天数则给出不同的提示信息,因为没有触发点,所以用到了本文内容. 右 ...

  5. 统信桌面端专业版开启cron日志,确认定时任务执行情况

    默认没有开启cron日志记录 1. 修改rsyslog vi /etc/rsyslog.conf #将cron前面的注释符去掉 cron.* /var/log/cron.log 排查完毕需关闭,重新注 ...

  6. 常见Dos命令学习

    Dos命令行 打开CMD方法 开始+系统+命令提示符(方便以管理员身份运行) Win+R 输入cmd 打开控制台(最常用) 在任意文件夹下,按住Shift键+鼠标右键点击,选择"在此处打开P ...

  7. class3

    #include<stdio.h> #include<stdlib.h> #include<time.h> #include<windows.h> #d ...

  8. OSPF之路由过载overflower 及GR(Graceful Restart优雅重起)

  9. Spring--AOP简介+入门案例

    AOP简介 面向切面编程:在不惊动原始设计的基础上,进行功能增强 各个要应用该功能的对象叫做连接点,那个功能叫做通知,表面上的代码没有发生变化,私下里发生变化的连接点,会出现切入点,切入点与通知通过切 ...

  10. Windows命令行备份文件

    windows命令行备份文件 0 前言 前段时间,笔者因为在C盘爆满的情况下被windows自动更新了(大概),出现了以下情况: 在试了几种方法后不起作用,无奈下只能重装系统. 在这之前要把之前的一些 ...