STM32下载ELF文件、可执行bin文件的最小size测试

这篇具有很好参考价值的文章主要介绍了STM32下载ELF文件、可执行bin文件的最小size测试。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、STM32能下载ELF格式的文件吗?

答:可以。因为所谓的bin文件就是ELF文件的.text代码段和.data数据段。

当然前提是下载工具能识别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文件一样的。

STM32下载ELF文件、可执行bin文件的最小size测试

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

STM32下载ELF文件、可执行bin文件的最小size测试

 

2、STM32最小的可执行bin文件是多大?

答:10字节。

  1. 按照STM32编程手册,STM32启动是从0x0地址取堆栈指针(MSP),从0x04地址取复位入口的PC指针,还需要设置堆栈地址(1或2条指令),最后是mian函数loop,所以最小的代码至少是4+4+4+2合计14字节或4+4+8+2合计18字节。
  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)。

设计代码,直接写汇编

.syntax unified
.cpu cortex-m4
.fpu softvfp
.thumb

// Global memory locations.
.global vtable
.global reset_handler

// The actual vector table.
.type vtable, %object
vtable:
    .word _estack
    .word reset_handler
.size vtable, .-vtable

/*
 * The Reset handler. Called on reset.
 */
.type reset_handler, %function
reset_handler:
    // Set the stack pointer to the end of the stack.
    //LDR  r0, =_estack
    //MOV  sp, r0

    //MOVS r0, #0
    main_loop:
        //ADDS r0, r0, #1
        B    main_loop
.size reset_handler, .-reset_handler

link文件很简单:

_estack = 0x20001000;
SECTIONS
{
. = 0x08000000; /* The starting address of flash */
}

编译生成二进制文件如下:

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,而是一个可以执行的程序。

第一步下载:

STM32下载ELF文件、可执行bin文件的最小size测试

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

STM32下载ELF文件、可执行bin文件的最小size测试

 

简单修改,加一个寄存器做累加计算方便看到效果,每点一次单步寄存器值加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

STM32下载ELF文件、可执行bin文件的最小size测试

 单步:执行指令 ,累加和循环

0800000a <main_loop>:

800000a: 3001 adds r0, #1

800000c: e7fd b.n 800000a <main_loop>

STM32下载ELF文件、可执行bin文件的最小size测试

 单步:

STM32下载ELF文件、可执行bin文件的最小size测试

 单步:

STM32下载ELF文件、可执行bin文件的最小size测试

 单步

STM32下载ELF文件、可执行bin文件的最小size测试

 单步:

STM32下载ELF文件、可执行bin文件的最小size测试

 直接全速run后暂停:

STM32下载ELF文件、可执行bin文件的最小size测试

 

尊重技术原创,转载请注明:https://www.cnblogs.com/pingwen/p/17341740.html文章来源地址https://www.toymoban.com/news/detail-420661.html

到了这里,关于STM32下载ELF文件、可执行bin文件的最小size测试的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【ARM 嵌入式 编译系列 10 -- GCC 编译缩减可执行文件 elf 文件大小】

    请阅读 【ARM GCC 编译专栏导读】 上篇文章:ARM 嵌入式 编译系列 9-- GCC 编译符号表(Symbol Table)的详细介绍 下篇文章:ARM 嵌入式 编译系列 10.1 – GCC 编译缩减可执行文件 elf 文件大小 在开发过程总,总是希望编译出来的可执行文件尽量小,因为这样可以节省更多的磁盘空间

    2024年02月09日
    浏览(31)
  • .out .elf .bin

    .out 和 .elf 是两种计算机可执行文件格式,都是用来保存编译过后的程序代码的。 .out 格式是早期 Unix 系统使用的可执行文件格式,是一种简单的格式。不支持许多现代系统的特性,如动态链接库和符号表等。 .elf 格式是扩展的可执行文件格式,它支持多种平台,并且比 .ou

    2024年02月08日
    浏览(36)
  • 关于STM32生成Bin文件,出现Error: Q0122E: Could not open file问题小结

    目录 1.出现这一个问题的主要表现为,编译器找不到该文件的路径。 2.注意         解决方法1:添加绝对路径:          2.解决方法2:直接添加                          C:Keil_v5ARMARMCCbinfromelf.exe这个文件路径要修改成自己Keil文件夹的路径位置。 在绝对路径

    2024年01月25日
    浏览(43)
  • STM32最小系统板上所有电路的认识和学习。(晶振电路(电容的作用),复位电路,下载端口,供电电路)

    在STM32最小系统板上,系统电路包括以下内容: 外部晶体振荡电路:用于提供系统时钟。 电源电路:包括5V稳压芯片和3.3V稳压芯片,用于提供芯片和外围器件所需的电压。 复位电路:包括复位电路和手动复位按键,用于确保系统的可靠启动。 调试接口:包括SWD调试接口和

    2023年04月19日
    浏览(34)
  • STM32-IAP基本原理及应用 | ICP、IAP程序下载流程 | 程序执行流程 | 配置IAP到STM32F4xxx

    ①在线编程(ICP,In-Circuit Programming) :通过JTAG/SWD协议或者系统加载程序(Bootloader, 串口 )下载用户应用程序到微控制器中。 ②在程序中编程(IAP,In Application Programming) :通过任何一种通信接口(如IO端口,USB,CAN,UART,I2C,SPI等)下载程序或者应用数据到存储器中( 需要在此前通过在线编

    2024年02月07日
    浏览(32)
  • 使用USB转TTL下载器将固件烧写到STM32F103C8T6最小系统板中

    ch340驱动下载地址: https://www.wch.cn/download/CH341SER_EXE.html mcuisp下载地址: 百度云盘资源: 链接:https://pan.baidu.com/s/1TuecWD0T1HTMkEpobuesFw 提取码:visk Flymcu下载地址: 百度云盘资源 链接:https://pan.baidu.com/s/1VxMUZFOVvpAf-L_YbATMag 提取码:fasf usb转TTL下载器的跳线帽接3V3 开发板BOOT0跳线

    2024年01月18日
    浏览(36)
  • STM32 keil如何下载STM32芯片F1/F4固件库 .pack文件

    1.用keil打开STM32F407的程序,结果提示下面的问题,就是没有安装固件库 2.然后去keil官网下载对应的固件库,官网地址:https://www.keil.com/ 3.然后选中对应的芯片类型,譬如我这个就是STM32F407IGTx 4.双击下面的图标,即.pack可以直接点击安装,并且目录直接默认是keil安装的目录。

    2024年02月13日
    浏览(30)
  • ESP32 bin文件生成及多个bin文件合并指南

    在ESP32开发过程中,对于我们实际的开发人员来说,将程序烧录进入ESP32内不是什么复杂的事情,直接输入 idf.py flash 指令即可实现,但是当我们开发完成之后,如何将对应的bin文件提供给测试人员进行相应的测试,以及如何提供bin文件给到产线进行生产呢? 通常将工程文件直

    2024年02月09日
    浏览(45)
  • stm32h7中RTC的BCD模式与BIN模式

    BCD(Binary-Coded Decimal)和BIN(Binary)是两种不同的数字表示格式。 BCD格式: BCD是一种用二进制编码表示十进制数字的格式。在BCD格式中,每个十进制数位使用4位二进制数来表示,范围从0到9。例如,数字5在BCD格式中表示为0101,数字9表示为1001。这种编码方式使得BCD数值的每

    2024年01月23日
    浏览(32)
  • STM32最小系统详解

    最小系统主要包括:主芯片,时钟电路,复位电路,电源电路,程序下载口,扩展接口等部分组成。 1.1 芯片启动模式 1)用户闪存 = 芯片内置的Flash。 2)SRAM = 芯片内置的RAM区,就是内存啦。 3)系统存储器 = 芯片内部一块特定的区域,芯片出厂时在这个区域预置了一段Boot

    2024年02月09日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包