rtthread学习笔记系列(2) -- 宏

news2025/1/15 9:13:15

文章目录

  • 2.链接文件
    • 2.0. 参考链接
    • 2.1._stext 和 _etext
    • 2.2. "."与"*符号作用
    • 2.3.`.linkonce` 段
    • 2.4. KEEP
    • 2.5 ENTRY
    • 2.6 PROVIDE
    • 2.7 AT
    • 2.8 SORT
    • 2.9 NOLOAD

  • 源文件路径:https://github.com/wdfk-prog/RT-Thread-Study

2.链接文件

2.0. 参考链接

https://home.cs.colorado.edu/~main/cs1300/doc/gnu/ld_toc.html

2.1._stext 和 _etext

  • stext 和 _etext 符号通常用于表示内核代码段的开始和结束位置。
//定义了一个符号。这个符号的值等于当前的位置计数器(.),也就是 .text 段的起始地址。
_stext = .;
//定义了一个符号。这个符号的值等于当前的位置计数器(.),也就是 .text 段的结束地址。
_etext = .;

2.2. ".“与”*符号作用

SECTIONS
{
  . = 0x10000;
  .text : 
  { 
      *(.text) 
  }
  . = 0x8000000;
  .data : 
  { 
      *(.data) 
  }
  .bss : 
  { 
      *(.bss) 
  }
}
  • 第一行设置了特殊符号’.',这是位置计数器。如果您没有以其他方式指定输出部分的地址(稍后将描述其他方式),则从位置计数器的当前值设置该地址。然后,位置计数器按输出部分的大小递增。在“SECTIONS”命令的开头,位置计数器的值为“0”。
  • ’ *‘是一个通配符,可以匹配任何文件名。表达式 *(.text)表示所有’。所有输入文件中的文本输入节。
段名存储属性内存分配
代码段 .text存放可执行程序的指令,存储态和运行态都有静态
数据段 .data存放已初始化(非零初始化的全局变量和静态局部变量)的数据,存储态和运行态都有静态
bss段 .bss存放未初始化(未初始化或者0初始化的全局变量和静态局部变量)的数据,存储态和运行态都有静态
堆 heap动态分配内存,需要通过malloc手动申请,free手动释放,适合大块内存。容易造成内存泄漏和内存碎片。运行态才有。动态
栈 stack存放函数局部变量和参数以及返回值,函数返回后,由操作系统立即回收。栈空间不大,使用不当容易栈溢出。运行态才有静态

2.3..linkonce

https://ftp.gnu.org/old-gnu/Manuals/gas/html_node/as_102.html

.gnu.linkonce.t是一个链接器区段,用于存放那些只需要链接一次的函数或者符号。区段名称后面通常跟着函数或者符号的名字。关于 linkonce的概念,GCC文档给出的解释是:“某些情况下,编译器为了优化而生成的代码项,不必在每一个包含了相同代码的编译单元中都出现。编译器将这些代码项放在 .linkonce区段中,链接器在链接时只保留一份。”

linkonce区段有几种类型:

  • .gnu.linkonce.b.*(用于未初始化的全局变量);
  • .gnu.linkonce.d.*(用于已初始化的全局变量);
  • .gnu.linkonce.r.*(用于常量数据);
  • .gnu.linkonce.t.*(用于文本,也就是可执行代码)等。

例如,如果你有一个函数 foo,GCC可能将其编译]到 .gnu.linkonce.t.foo区段中,如果链接时发现其它对象文件也有 .gnu.linkonce.t.foo,那么链接器只会保留其中一份。这主要用于C++中的 inline函数或模板函数,通常情况下,每一个使用到这些函数的源文件都会生成一份函数的实例,但是链接时只需要保留一份即可。这样可以减少目标文件的大小,提高链接效率。

2.4. KEEP

当使用链接标记不应该消除的部分。这可以通过在输入节的通配符项周围加上’ KEEP() '来实现不被优化

2.5 ENTRY

程序中执行的第一条指令称为入口点。使用 ENTRY链接描述文件命令来设置入口点。

有几种方法可以设置入口点。链接器将依次尝试以下方法来设置入口点,当其中一个方法成功时停止:

  • the `-e’ entry command-line option;
  • the ENTRY(symbol) command in a linker script;
  • the value of the symbol start, if defined;
  • the address of the first byte of the .text'section, if present;
  • The address 0.

2.6 PROVIDE

PROVIDE(__dtors_end__ = .);
  • 只有在引用但未定义的情况下,才能使用提供 PROVIDE关键字来定义符号;如果 __dtors_end__已经被定义,那么 PROVIDE语句将被忽略。这对于为某些符号提供默认值很有用。这在考虑构造函数和析构函数列表符号(如’ CTOR_LIST ')时尤为重要,因为这些符号通常被定义为通用符号。

2.7 AT

AT关键字用于指定节(section)在内存中的加载地址。这个地址是物理地址,与链接地址(即节在输出文件中的位置)可能不同。

例如,在 .data : AT (_sidata)这行代码中,.data节将被加载到内存的 _sidata地址处。这通常用于ROM到RAM的复制操作,其中 _sidata是在ROM中存储的初始化数据的开始地址。

2.8 SORT

在链接脚本中,SORT的作用是对输入的部分进行排序。在你的代码中,SORT(.dtors.)和 (.dtors)被用来收集所有的析构函数(destructors)。

SORT(.dtors.*)会把所有以.dtors.开头的部分按照字母顺序排序。这在某些情况下是有用的,例如当你想要按照某种特定的顺序执行析构函数时。

  • (.dtors)则会把所有以.dtors开头的部分收集起来,但不进行排序。

这两个指令通常一起使用,以确保所有的析构函数都被正确地收集和排序。在你的代码中,析构函数被放在__dtors_start__和__dtors_end__之间,这样在程序结束时,运行时系统就知道从哪里开始调用析构函数,以及在哪里结束。这是一种常见的在C++中管理全局和静态对象生命周期的方法

2.9 NOLOAD

  • .RxDecripSection.TxDecripSection.RxArraySection都被设置为 NOLOAD,这意味着在程序执行时,它们不会被加载到内存中。这通常用于DMA操作,其中硬件需要知道数据的物理地址,而不是由MMU管理的虚拟地址。通常用于DMA配置,例如以太网

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

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

相关文章

服务器数据恢复—EMC存储POOL中数据卷被删除的数据恢复案例

服务器数据恢复环境&故障: EMC Unity 400存储连接了2台硬盘柜。2台硬盘柜上一共有21块硬盘(520字节)。21块盘组建了2组RAID6:一组有11块硬盘,一组有10块硬盘。 在存储运行过程中,管理员误操作删除了 2组…

python 轮廓 获取环形区域

目录 效果图: 代码: 效果图: 代码: import cv2 import numpy as np# 读取图像 image cv2.imread(rE:\project\jijia\tools_jijia\img_tools\ground_mask.jpg, cv2.IMREAD_GRAYSCALE) # 二值化图像 # 二值化图像 _, binary cv…

使用 WPF 和 C# 将纹理应用于三角形

此示例展示了如何将纹理应用于三角形,以使场景比覆盖纯色的场景更逼真。以下是为三角形添加纹理的基本步骤。 创建一个MeshGeometry3D对象。像往常一样定义三角形的点和法线。通过向网格的TextureCoordinates集合添加值来设置三角形的纹理坐标。创建一个使用想要显示的纹理的 …

算法妙妙屋-------2..回溯的奇妙律动

回溯算法是一种用于系统性地搜索和解决问题的算法,它以深度优先搜索(DFS)为基础,用来探索所有可能的解决方案。通过递归地尝试候选解并在必要时回退(即“回溯”),它能够高效地解决许多涉及组合、…

如何在Jupyter中快速切换Anaconda里不同的虚拟环境

目录 介绍 操作步骤 1. 选择环境,安装内核 2. 注册内核 3. 完工。 视频教程 介绍 很多网友在使用Jupyter的时候会遇到各种各样的问题,其中一个比较麻烦的问题就是我在Anaconda有多个Python的环境里面,如何让jupyter快速切换不同的Pyt…

《自动驾驶与机器人中的SLAM技术》ch9:自动驾驶车辆的离线地图构建

目录 1 点云建图的流程 2 前端实现 2.1 前端流程 2.2 前端结果 3 后端位姿图优化与异常值剔除 3.1 两阶段优化流程 3.2 优化结果 ① 第一阶段优化结果 ② 第二阶段优化结果 4 回环检测 4.1 回环检测流程 ① 遍历第一阶段优化轨迹中的关键帧。 ② 并发计算候选回环对…

2025/1/12 复习JS

我乞求你别再虚度光阴 ▶ 空心 --------------------------------------------------------------------------------------------------------------------------------- 摘自哔哩哔哩听课笔记。 01 上篇&#xff1a;核心语法 1.基于页面效果的操作 <!DOCTYPE html>…

初学stm32 --- II2C_AT24C02,向EEPROM中读写数据

目录 IIC总线协议介绍 IIC总线结构图 IIC协议时序 1. ACK&#xff08;Acknowledge&#xff09; 2. NACK&#xff08;Not Acknowledge&#xff09; IO口模拟II2C协议 发送起始信号&#xff1a; 发送停止信号&#xff1a; 检测应答信号&#xff1a; 发送应答信号&#x…

Angular-生命周期及钩子函数

什么是生命周期 Angular 创建和渲染组件及其子组件&#xff0c;当它们绑定的属性发生变化时检查它们&#xff0c;并在从 DOM 中移除它之前销毁它们。生命周期函数通俗的讲就是组件创建、组件更新、组件销毁的时候会触发的一系列的方法。当 Angular 使用构造函数新建一个组件或…

vue(五)基础语法--循环遍历指令

目录 简单数据的处理&#xff08;常用&#xff09; 复杂数据&#xff08;json数据&#xff09; v-for 与对象 通过key管理状态 Key的来源 这一节类同于vue&#xff08;四&#xff09;基础语法--条件渲染-CSDN博客 &#xff0c;本质都是那些基础语句语法的实现。 简单介绍 …

【全套】基于分类算法的学业警示预测信息管理系统

【全套】基于分类算法的学业警示预测信息管理系统 【摘 要】 随着网络技术的发展基于分类算法的学业警示预测信息管理系统是一种新的管理方式&#xff0c;同时也是现代学业预测信息管理的基础&#xff0c;利用互联网的时代与实际情况相结合来改变过去传统的学业预测信息管理中…

解决线程安全问题,Lock锁,死锁以及如何避免,线程的通信和线程池

如何解决线程安全问题 当多个线程共享一个资源时&#xff0c;则可能出现线程安全问题。 java中解决线程安全的方式有三种 第一种: 同步代码块 第二种: 同步方法 第三种: Lock 同步代码块 synchronized(锁对象){ 需要同步的代码。 } synchronized 同步的意思 锁对象可以是任…

源码编译安装httpd 2.4,提供系统服务管理脚本并测试(两种方法实现)

方法一&#xff1a;使用 systemd 服务文件 sudo yum install gcc make autoconf apr-devel apr-util-devel pcre-devel 1.下载源码 wget https://archive.apache.org/dist/httpd/httpd-2.4.46.tar.gz 2.解压源码 tar -xzf httpd-2.4.46.tar.gz 如果没有安装tar 记得先安装…

基于微信小程序的智能停车场管理系统设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

LabVIEW驱动电机实现样品自动搜索

利用LabVIEW控制电机驱动相机在XY平面上进行扫描&#xff0c;以检测样品位置。样品最初可能位于相机视野范围之外&#xff0c;需要实现自动搜索样品位置并完成精确定位扫描的功能。该系统需具有以下特点&#xff1a; 高效搜索&#xff1a;能够快速确定样品位置&#xff0c;缩短…

excel 整理表格,分割一列变成多列数据

数据准备 对于很多系统页面的数据是没有办法下载的。 这里用表格数据来举例。随便做数据的准备。想要看excel部分的可以把这里跳过&#xff0c;从数据准备完成开始看。 需要一点前端基础知识&#xff0c;但不多&#xff08;不会也行&#xff09;。 把鼠标放在你想要拿到本地的…

MAC AndroidStudio模拟器无网络

先确认PC端是正常访问网络的&#xff1b; 模拟器端修改Wifi设置&#xff1a;设置 - 网络和互联网 - WALN设置 按照上图修改&#xff1b; IP设置&#xff1a;从DHCP修改为静态&#xff0c;IP地址&#xff1a;10.0.2.16 &#xff0c;网关&#xff1a;10.0.2.2 &#xff0c; DNS…

【Linux系统】Ext系列磁盘文件系统一

0. 从快递系统引入文件系统 理解文件系统&#xff1a;菜鸟驿站的类比 在日常生活中&#xff0c;我们常常会使用到快递服务来寄送和接收包裹。这个过程虽然看似简单&#xff0c;但背后却有着一套复杂而有序的管理系统在支撑。今天&#xff0c;我们将通过一个类比——将文件系统…

1Hive概览

1Hive概览 1hive简介2hive架构3hive与Hadoop的关系4hive与传统数据库对比5hive的数据存储 1hive简介 Hive是基于Hadoop的一个数据仓库工具&#xff0c;可以将结构化的数据文件映射为一张数据库表&#xff0c;并提供类SQL查询功能。 其本质是将SQL转换为MapReduce/Spark的任务进…

Elasticsearch入门学习

Elasticsearch是什么 Elasticsearch 是一个基于 Apache Lucene 构建的分布式搜索和分析引擎、可扩展的数据存储和矢量数据库。 它针对生产规模工作负载的速度和相关性进行了优化。 使用 Elasticsearch 近乎实时地搜索、索引、存储和分析各种形状和大小的数据。 特点 分布式&a…