嵌入式C语言--Pragma Section与Map文件

嵌入式C语言–Pragma Section与Map文件

嵌入式C语言--Pragma Section与Map文件

  • 嵌入式C语言--Pragma Section与Map文件
    • 一. Pragma修饰符
    • 二. Map文件
      • 1)什么是map文件
      • 2)map文件的构成
      • 3)常用的段映射地址
      • 4)map文件生成
    • 三. Section修饰符
      • 1)定义
      • 2)作用

一. Pragma修饰符

#pragma命令的作用: 是设定编译器的状态或者是指示编译器完成一些特定的动作
它是一个预编译指令,它的格式: #pragma 参数
#pragma once保证头文件被编译一次,
#pragma hdrstop表示预编译头文件到此为止,后面的头文件不进行预编译
#pragma resource “.dfm“ 表示把.dfm文件中的资源加入工程.
#pragma warning(disable:4507) 不显示4507警告信息.
#pragma warning(once:4385) : 4385号警告信息仅报告一次;
#pragma warning(error:164) : 把164号警告信息作为一个错误
#pragma pack(n) 从这开始对后面的结构成员进行对齐,既如果结构成员1的大小<n则将成员1扩大到n个大小;  
如果成员1的大小>n则使用成员1的大小.
#pragma comment(lib, “aaa.lib”)添加链接库
#pragma warning( push ) : 保存所有警告信息的现有的警告状态

二. Map文件

1)什么是map文件

map文件是软件编译后产生的有关所有程序、数据及IO空间的一种映射文件。
通过map文件可以知道函数大小,入口地址等一些重要信息。
Map文件可以理解成为它就是程序的地图。

2)map文件的构成

map文件大概分为文件头、内存配置、段映射、全局符号四部分。
段映射部分与cmd文件中的SECTION指令关联,在该部分程序中所有的段实际映射的起始地址与实际长度均有详细说明。可以具体到程序中PROGMA指定的段和各个单独文件产生的obj文件。

3)常用的段映射地址

Section放置位置说明
RO-data位于FLASH中指除了内联数据(inline data)之外的常量数据
RW-data位于RAM中指可读写(RW)、已初始化的变量数据
Rozdata位于RAM中指未初始化(ZI)的变量数据

4)map文件生成

编译后产生,在编译完生成mot文件的同时,生成一个同名的map文件。
在这里插入图片描述

三. Section修饰符

1)定义

使用section关键字可以将我们指定的结构体或变量放入到我们自定义的输入段中
同时函数也可以放到我们自定义的输入段当中。

2)作用

对代码的安全校验、扩展移植都会有很好的效果。
小型项目、独立开发看不出效果,但对复杂的多人合作的项目,合适的关键字对代码的稳定性和架构是锦上添花的。

将函数放入到my_fun这个段当中。
将变量aaa放入到my_val这个段当中。

int __attribute__((section("my_val"))) aaa; 
int __attribute__((section("my_fun"))) test1(int a,int b) 
{ 
return (a+b); 
}

不同编译器对section属性的定义略有差异,但效果相同、在这里可以了解一下。

#if defined(__CC_ARM) || defined(__CLANG_ARM)      		 /* ARM Compiler */
#define SECTION(x)    __attribute__((section(x)))
#elif defined (__IAR_SYSTEMS_ICC__)                     		/* for IAR Compiler */
#define SECTION(x)     @ x
#elif defined (__GNUC__) 					/* GNU GCC Compiler */ 
#define SECTION(x) __attribute__((section(x)))
・・・

在map当中的Section。
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/22457.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HAL_UART_IRQHandler(UART_HandleTypeDef *huart)分析

//接收没错误&#xff1a;执行UART_Receive_IT(huart) //接收有错误&#xff1a;执行UART_Receive_IT(huart)、HAL_UART_ErrorCallback(huart) void HAL_UART_IRQHandler(UART_HandleTypeDef *huart) {uint32_t isrflags READ_REG(huart->Instance->SR);uint32_t cr1…

java项目部署脚本

一、java项目部署脚本示例 在Java项目中&#xff0c;部署脚本通常依赖于项目的构建工具&#xff08;如Maven或Gradle&#xff09;以及部署环境&#xff08;如Docker、Tomcat、Kubernetes等&#xff09;。以下是一个基于Maven和Shell脚本的Java项目部署示例&#xff0c;假设我们…

8*8LED点阵点亮一个点

#include<reg51.h> typedef unsigned int u16; //对系统默认数据进行重定义 typedef unsigned char u8; //定义74HC595控制管脚 sbit SRCLKP3^6; //移位寄存器时钟输入 sbit RCLKP3^5; //存储寄存器时钟输入 sbit SERP3^4; //串…

SpaceX: 太空火箭自主精准着陆

本文是根据Lars Blackmore在16年的一篇公开论文翻译而来&#xff0c;虽然有些早而且是科普文章&#xff0c;但是可以初见一些SpaceX火箭着陆的细节&#xff0c;后面我会对spaceX landing control 技术主管MIT博士期间研究火箭控制算法的论文进行讲解&#xff0c;敬请期待。 Lar…

Linux系统常用命令

Linux 系统常用命令 1、文件操作2、目录操作 1、文件操作 创建文件&#xff1a; touch 文件名 创建文件并编辑&#xff1a;vim 文件名 查看文件全部内容&#xff1a;cat 文件名 带行号查看文件内容&#xff1a; cat -n file 查看文件内容并监视内容更新&#xff1a; 以翻页形…

【电机】步进电机相关指标

一 静态指标&#xff1a; 相数&#xff1a;线圈的组数&#xff0c;两相步进电机步距角一般为 1.8&#xff0c;三相的步进电机步距角为 1.2&#xff0c;相数越多步距角越小。 步距角&#xff1a;一个脉冲信号所对应的电机转动的角度&#xff0c;这个步距角他不一定是电机实际工…

OpenEuler华为欧拉系统安装—从零开始,小白也能学会

介绍 openEuler&#xff08;欧拉&#xff09;是一款开源操作系统。 当前openEuler内核源于Linux&#xff0c;支持鲲鹏及其它多种处理器&#xff0c; 能够充分释放计算芯片的潜能&#xff0c;是由全球开源贡献者构建的高效、 稳定、安全的开源操作系统&#xff0c;适用于数据库…

JVM运行数据区-Java堆

Java堆 堆区&#xff08;Heap区&#xff09;是JVM运行时数据区占用内存最大的一块区域&#xff0c;每一个JVM进程只存在一个堆区&#xff0c;它在JVM启动时被创建&#xff0c;JVM规范中规定堆区可以是物理上不连续的内存&#xff0c;但必须是逻辑上连续的内存。 1、堆区是线程…

Java面试题-基础

Java面试题-基础 1、Java语言有哪些特点&#xff1f;2、面向对象和面向过程的区别是什么&#xff1f;3、说说标识符的命名规则&#xff1f;4、说说Java八种基本数据类型的大小以及他们的封装类&#xff1f;5、instanceof关键字有什么作用&#xff1f;6、自动装箱与自动拆箱是什…

「网络编程」基于 UDP 协议实现回显服务器

&#x1f387;个人主页&#xff1a;Ice_Sugar_7 &#x1f387;所属专栏&#xff1a;计网 &#x1f387;欢迎点赞收藏加关注哦&#xff01; 实现回显服务器 &#x1f349;socket api&#x1f349;回显服务器&#x1f34c;实现&#x1f95d;服务器&#x1f95d;客户端 &#x1f3…

纯血鸿蒙实战开发—如何添加顶部tab页面

1.Tabs组件 Tabs组件的页面组成包含两个部分&#xff0c;分别是TabContent和TabBar。TabContent是内容页&#xff0c;TabBar是导航页签栏. 根据不同的导航类型&#xff0c;布局会有区别&#xff0c;可以分为底部导航、顶部导航、侧边导航&#xff0c;其导航栏分别位于底部、顶…

react基础学习 JSX

JSX的测试网站 Babel Babel 可以测试代码的效果 JSX实现map列表 注意 key不一样&#xff08;使用遍历的时候&#xff09; 简单条件渲染 复杂条件渲染 绑定事件 function App() {const colorse (e)>{console.log("测试点击",e);}const colorse1 (name)>{…

代码随想录训练营第六十天 | 84.柱状图中最大的矩形

84.柱状图中最大的矩形 题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 文档讲解&#xff1a;代码随想录 视频讲解&#xff1a;单调栈&#xff0c;又一次经典来袭&#xff01; LeetCode&#xff1a;84.柱状图中最大的矩形_哔哩哔哩_bilibili 状态&#xff1a;未…

地理信息科学中的大数据挑战

在信息化爆炸的时代&#xff0c;地理信息科学&#xff08;GIScience&#xff09;正经历着前所未有的变革&#xff0c;其中&#xff0c;地理空间大数据的涌现为科学研究与应用带来了前所未有的机遇与挑战。作为地理信息与遥感领域的探索者&#xff0c;本文旨在深入剖析地理空间大…

揭秘HubSpot集客营销:如何吸引并转化全球潜在客户

随着全球数字化浪潮的推进&#xff0c;企业出海已经成为许多公司扩大市场、增加品牌曝光度的重要战略。HubSpot集客营销作为一种以客户为中心、数据驱动的营销策略&#xff0c;为企业在海外市场的成功提供了强有力的支持。作为HubSpot亚太地区的合作伙伴&#xff0c;NetFarmer将…

[AIGC] 自定义Spring Boot中BigDecimal的序列化方式

在很多场景下&#xff0c;我们需要对BigDecimal类型的数据进行特殊处理&#xff0c;比如保留三位小数。Spring Boot使用Jackson作为默认的JSON序列化工具&#xff0c;我们可以通过自定义Jackson的序列化器&#xff08;Serializer&#xff09;来实现&#xff0c;下面将详细介绍实…

力扣2730.找到最长的半重复子字符串

力扣2730.找到最长的半重复子字符串 找到相邻的相同字母后same 再双指针找到前一组相同字母位置 class Solution {public:int longestSemiRepetitiveSubstring(string s) {int res1,n s.size(),same0;for(int i1,j0;i<n;i){if(s[i] s[i-1] && same > 1)for…

godot的安装和使用 1

今天是第一节&#xff0c;因此呢先做godot的安装&#xff0c;其实很简单 godot官网&#xff1a;https://godotengine.org/ 进入官网&#xff0c; 安装好之后呢&#xff0c;会有两个文件 打开第一个就是可视化界面的&#xff0c;进入后是这个样子 说明安装成功了

【ArcGIS微课1000例】0115:字段数据类型案例详解

文章目录 一、ArcGIS数据类型概述二、案例1. 数字2. 文本3. 日期4. BLOB5. 对象标识符6. 全局标识符一、ArcGIS数据类型概述 创建要素类和表时,需要为各字段选择数据类型。可用的类型包括多种数字类型、文本类型、日期类型、二进制大对象 (BLOB) 或全局唯一标识符 (GUID)。选…

python高级面试题

1. Python 中的 GIL (Global Interpreter Lock) 是什么? 解答: Python 的 GIL 是全局解释器锁,限制了在 CPython 解释器中同时执行多个线程。GIL 确保在任意时刻只有一个线程执行 Python 字节码。这是为了保护访问 Python 对象的内部数据结构免受并发问题的影响。尽管 GIL 会…