本文介绍: 可以看到,在指定地址存储用户需要提前存储数据,加了packed关键字后存储空间明显缩小;》被static修饰局部变量且后续被使用才会占用空间,未被static修饰局部变量就算后续被使用也不会占用数据空间。PS:keil对于未初始化数组元素个数<9时算RW-data元素个数大于8的算ZI-data。》可以看到,对于局部变量,无论是否static修饰,仅仅声明未被使用的变量不会占用数据空间。对固件里面变量函数常量元素的存储空间进行分配的说明文件一个完整的程序代码数据组成;
Q:如何一个变量、某个源文件函数编译阶段就存储在用户指定区域

KEIL环境:.map后缀文件、.sct后缀文件

IAR环境:.map后缀文件、.icf后缀文件

map文件

固件里面变量、函数、常量元素的存储空间进行分配的说明文件

下面看几个变量的不同状态map的存储说明

全局

 》可以看到,全局变量是否占用数据空间取决于后续是否使用这个变量。

局部的

 

 

 》可以看到,对于局部变量,无论是否static修饰,仅仅声明未被使用的变量不会占用数据空间

》被static修饰的局部变量且后续被使用才会占用空间,未被static修饰的局部变量就算后续被使用也不会占用数据空间

PS:keil对于未初始化的数组,元素个数<9时算RW-data元素个数大于8的算ZI-data

 

程序最终生成固件空间大小取决于code、RO(只读数据)、RW(可读写数据)

一个完整的程序代码和数据组成;

1、只定义未使用的全局或局部变量不占用存储空间。

2、被static修饰为全生命周期的局部变量也要后续使用才会占用空间。

3、未进行初始化的数组变量被算做ZI-Data部分

sct/icf文件】

设置RAM、FALSH存储空间的起始地址偏移量

将函数或变量添加用户自定义区域(配合__attribute__ 编译特性使用)

》Keil界面默认分配状态

》IAR界面

__attribute__

__attribute__((__packed__))

__attribute__((at(addr)))

 

可以看到,在指定地址存储了用户需要提前存储的数据,加了packed关键字后存储空间明显缩小;对于结构默认是以4字节对齐方式调整

__attribute__((section(“func_name“)))

__attribute__((aligned(8))) 对齐方式

__attribute__((packed, aligned(8)))

原文地址:https://blog.csdn.net/u012358272/article/details/134640165

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_13529.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注