微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 请问stm32用MDK生成的bin文件大小是否一定是4字节的倍数?

请问stm32用MDK生成的bin文件大小是否一定是4字节的倍数?

时间:10-02 整理:3721RD 点击:
如题,谢谢!
是否因为stm32是32位的CPU生成的bin就一定是4字节的倍数?
初学入门对深层的原理还不太清楚,请前辈指教。谢谢

有个叫Thumb的指令集。

今天上午又研究了一下,cortex-m3 m4来说,使用的是thumb2指令集,那么32位和16位的指令都有,
又查了下bin的组成
ARM映像文件的组成
            所谓ARM映像文件就是指烧录到ROM中的bin文件,也称为image文件。以下用Image文件来称呼它。
            Image文件包含了RO和RW数据。之所以Image文件不包含ZI数据,是因为ZI数据都是0,没必要包含,只要程序运行之前将ZI数据所在的区域一律清零即可。包含进去反而浪费存储空间。
            Q:为什么Image中必须包含RO和RW?
            A:因为RO中的指令和常量以及RW中初始化过的变量是不能像ZI那样“无中生有”的。
想起来由于const类型的数据也要写到flash,那么我想bin的大小就很难说了吧

语法格式:AREA 段名{,属性 1}{,属性 2}……
AREA 命令指示汇编程序汇编一个新的代码段或数据段。段是独立的、指定的、不可见的代
码或数据块,它们由链接程序处理。
段名:可以为段选择任何段名。但是,以一个数字开始的名称必须包含在竖杠号内,否则会
产生一个缺失段名错误。例如,|1_DataArea|。
有些名称是习惯性的名称。例如:|.text|用于表示由 C 编译程序产生的代码段,或用于以某
种方式与 C 库关联的代码段。
属性字段表示该代码段(或数据段)的相关属性,多个属性用逗号分隔。常用的属性如下:
——CODE 属性:用于定义代码段,默认为 READONLY。
——DATA 属性:用于定义数据段,默认为 READWRITE。
——READONLY 属性:指定本段为只读,代码段默认为 READONLY。
——READWRITE 属性:指定本段为可读可写,数据段的默认属性为 READWRITE。
——ALIGN 属性:使用方式为 ALIGN 表达式。在默认时,ELF(可执行连接文件)的代码
段和数据段是按字对齐的,表达式的取值范围为 0~31,相应的对齐方式为 2 表达式次方。
——NOINIT 属性:表示数据段是未初始化的或初始化为零。其只包含零初始化的空间保留
命令 SPACE 或 DCB、DCD、DCDU、DCQ、DCQU、DCW 或 DCWU。可以决定在链接时
AREA 是未初始化的还是零初始化的。
一个汇编语言程序至少要包含一个段,当程序太长时,也可以将程序分为多个代码段和数据

注意上边给你贴的那段中,align指明对齐方式。可以了解下编译和链接的具体细节,甚至反汇编,winhex查看二进制文件等。然后恭喜你就又掉进一个坑

果然是个大坑。话说我汇编还没怎么学,也不打算现在学。
话说我的问题是生成的bin文件的大小的问题,
我昨天测了一下,const类型增加1个字节或增加4个字节都是占用4字节的flash,
增加一个16位的汇编指令,或增加2条16位的汇编指令,flash也都是占用4字节,
我现在就想知道bin文件大小是否一定是4字节的倍数。
你的意思是align对齐方式会影响bin文件的对齐方式吗?

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top