当前位置: 首页 > news >正文

移动网站开发教程下载网页美工设计课程标准

移动网站开发教程下载,网页美工设计课程标准,新网企业邮箱登录入口,剧院网站建设文章目录 什么是Section(节区)输入文件常见节区有哪些?什么是 glue code?.glue_7和.glue_7的作用是什么?链接脚本中的 KEEP 关键字是什么呢作用?链接脚本中的 PROVIDE 关键字是什么呢作用? 上篇文章:ARM 嵌…

文章目录

    • 什么是Section(节区)
      • 输入文件常见节区有哪些?
      • 什么是 glue code?.glue_7和.glue_7的作用是什么?
      • 链接脚本中的 KEEP 关键字是什么呢作用?
      • 链接脚本中的 PROVIDE 关键字是什么呢作用?

上篇文章:ARM 嵌入式 编译系列 7 – ARM GCC 链接脚本详细讲解
下篇文章:ARM 嵌入式 番外篇 编译系列 8 – RT-Thread 编译命令 Scons 详细讲解

什么是Section(节区)

在编程语言中,节区(Section)是对程序的一个逻辑分割,它包含了程序中特定类型的信息。一个完整的程序通常会被分割成几个节区,比如代码节区(.text)、数据节区(.data)和 BSS 节区(.bss)等。

在 GCC 链接脚本中,你可以使用 SECTIONS 命令来定义输出文件中各个节区的位置和顺序。其中,每个节区都用花括号 {} 括起来,并且可以包含多个输入节区和符号。

以下是一个简单的例子:

SECTIONS 
{ .text : { *(.text) } > FLASH .data : { *(.data) } > RAM .bss : { *(.bss) } > RAM 
}

在这个示例中,.text.data.bss输出文件中的节区,而 *(.text)*(.data)*(.bss)输入文件中的节区。> FLASH> RAM 指定了节区应该被放置到哪个内存区域。

需要注意的是,链接器会按照 SECTIONS 命令中节区的顺序来布局输出文件中的节区。所以,如果你需要特定节区在内存中的位置或顺序,请在 SECTIONS 命令中进行指定。

输入文件常见节区有哪些?

在 ARM GCC 链接脚本中,常见的输入文件节区主要包括以下几种:

  • .text:存放代码的节区,通常对应 FLASH 等只读存储区;

  • .rodata:存放只读数据的节区,比如常量字符串、const 声明的变量等,也通常对应 FLASH 等只读存储区;

  • .data:存放已初始化的全局变量和静态变量的节区。此节区的初始化值存储在 FLASH 中,但在程序启动时会被复制到 RAM 中;

  • .bss:存放未初始化的全局变量和静态变量的节区。此节区不占用 FLASH 空间,仅在 RAM 中预留空间;

  • .heap:堆区,用于动态内存分配,如 mallocfree 等;

  • .stack:栈区,用于存放局部变量和函数调用的上下文;

  • .isr_vector:这个节区通常用于存放中断向量表。对于基于 ARM Cortex-M 的微控制器,中断向量表包括了复位向量、异常处理函数和中断处理函数的入口地址等。在程序启动时,CPU 会加载中断向量表到特定的地址,并在中断发生时通过中断向量表跳转到相应的处理函数;

  • .init:这个节区包含了程序的初始化代码。在 C 程序中,全局变量和静态变量的初始化代码通常就在这个节区。此外,如果程序使用了 C++,那么全局对象的构造函数也会被放到这个节区;

  • .fini:这个节区包含了程序的终止代码。在 C 程序中,这个节区通常为空。但如果程序使用了 C++,那么全局对象的析构函数会被放到这个节区。

这些节区在链接脚本中的定义和布局将决定了它们在内存中的位置和大小。并且这些节区的布局需要与 MCU 的内存布局匹配,以确保代码和数据能够被正确地加载和执行。

实际使用的链接脚本中内容设置比较多,如下:

SECTIONS
{.text :{. = ALIGN(4);_stext = .;KEEP(*(.isr_vector))            /* Startup code */. = ALIGN(4);*(.text)                        /* remaining code */*(.text.*)                      /* remaining code */*(.rodata)                      /* read-only data (constants) */*(.rodata*)*(.glue_7)*(.glue_7t)*(.gnu.linkonce.t*)/* section information for finsh shell */. = ALIGN(4);__fsymtab_start = .;KEEP(*(FSymTab))__fsymtab_end = .;. = ALIGN(4);__vsymtab_start = .;KEEP(*(VSymTab))__vsymtab_end = .;/* section information for initial. */. = ALIGN(4);__rt_init_start = .;KEEP(*(SORT(.rti_fn*)))__rt_init_end = .;. = ALIGN(4);PROVIDE(__ctors_start__ = .);KEEP (*(SORT(.init_array.*)))KEEP (*(.init_array))...

什么是 glue code?.glue_7和.glue_7的作用是什么?

GCC 编译器会自动生成一些代码来处理 ARM 和 Thumb 指令集之间的交互,这些代码通常被称为 “glue code”。在链接脚本中,这些 glue code 通常被放在 .glue_7.glue_7节区中。

  • .glue_7 节区包含了从 ARM 模式到 Thumb 模式的跳转代码;
  • .glue_7t 节区包含了从 Thumb 模式到 ARM 模式的跳转代码。

这些节区中的代码通常会被自动插入到需要进行模式转换的地方。

在链接脚本中,你通常需要将这两个节区放到 .text 节区中,例如:

SECTIONS 
{ .text : { *(.text) *(.glue_7) *(.glue_7t) } > FLASH 
}

在这个示例中,.glue_7.glue_7t 节区被放置在 .text 节区中,这样它们就会被加载到 FLASH 中,并能在程序运行时被执行。

注意 只有在混合使用 ARM 和 Thumb 指令集的情况下,编译器才会生成 glue code。如果你的程序只使用一种指令集,那么就不需要关心这两个节区。

链接脚本中的 KEEP 关键字是什么呢作用?

在 GCC 链接脚本中,KEEP 关键字用于防止某些节区在链接过程中被丢弃。

在链接过程中,如果链接器发现某些节区没有被引用,链接器可能会选择丢弃这些节区以节省空间。但是有些时候,你可能需要保留这些节区,即使它们没有被直接引用。这时,你就可以使用 KEEP 关键字。

KEEP 关键字的语法如下:

KEEP(file section)

file 是输入的文件列表,可以使用通配符。
section 是文件中需要保留的节区列表,也可以使用通配符。

比如说,以下的链接脚本会保留所有输入文件中的 .init.fini 节区:

SECTIONS 
{ .init : { KEEP(*(.init)) } > FLASH .fini : { KEEP(*(.fini)) } > FLASH 
}

在这个示例中,KEEP(*(.init))KEEP(*(.fini)) 分别会保留所有输入文件中的 .init.fini 节区,这些节区在链接过程中不会被丢弃。

链接脚本中的 PROVIDE 关键字是什么呢作用?

见文章:ARM 嵌入式 编译系列 7 – ARM GCC 链接脚本详细讲解

链接脚本中定义了 FSymTabVSymTab.rti_fn 这几个节区,以 .rti_fn 为例,在代码中有很多初始化函数需要按照先后顺序进行执行,编译的时候会统一将这些初始化函数放到某一个节区中,比如 .rti_fn 节区。如下代码是将函数 fn 放到 .rti_fn 节区中,然后根据 level 的值进行排序。

    #if RT_DEBUG_INITstruct rt_init_desc{const char* fn_name;const init_fn_t fn;};#define INIT_EXPORT(fn, level)                                                       \const char __rti_##fn##_name[] = #fn;                                            \RT_USED const struct rt_init_desc __rt_init_desc_##fn RT_SECTION(".rti_fn." level) = \{ __rti_##fn##_name, fn};#else#define INIT_EXPORT(fn, level)                                                       \RT_USED const init_fn_t __rt_init_##fn RT_SECTION(".rti_fn." level) = fn#endif

rt-thread/include/rtdef.h 中实现了如下宏定义来定义初始化函数的执行先后顺序。

/* board init routines will be called in board_init() function */
#define INIT_BOARD_EXPORT(fn)           INIT_EXPORT(fn, "1")/* pre/device/component/env/app init routines will be called in init_thread */
/* components pre-initialization (pure software initilization) */
#define INIT_PREV_EXPORT(fn)            INIT_EXPORT(fn, "2")
/* device initialization */
#define INIT_DEVICE_EXPORT(fn)          INIT_EXPORT(fn, "3")
/* components initialization (dfs, lwip, ...) */
#define INIT_COMPONENT_EXPORT(fn)       INIT_EXPORT(fn, "4")
/* environment initialization (mount disk, ...) */
#define INIT_ENV_EXPORT(fn)             INIT_EXPORT(fn, "5")
/* appliation initialization (rtgui application etc ...) */
#define INIT_APP_EXPORT(fn) 

上篇文章:ARM 嵌入式 编译系列 7 – ARM GCC 链接脚本详细讲解
下篇文章:ARM 嵌入式 番外篇 编译系列 8 – RT-Thread 编译命令 Scons 详细讲解

http://www.yayakq.cn/news/552364/

相关文章:

  • 网站入口首页网站可以做网站广告
  • 想学做网站学什么教程市场调研ppt
  • 我的世界查建筑网站济南建设工程交易中心
  • jsp网站开发 孟浩pdf哪个行业必须做网站
  • 免费网站收录怎么用ps做网站ui
  • 淘宝网站建设设计模板平面广告设计培训
  • 教育网站官网免费行情网站app下载大全
  • 网站虚拟空间购买wordpress什么删留言
  • 常州建设网站代理商做网站哪些好
  • 马来西亚的网站后缀做基础销量的网站
  • 电子商务网站建设考题与答案国外域名网站推荐
  • 外贸企业网站建设方案上饶便宜的网站建设
  • 房产中介做租单用哪个付费网站更好wordpress 显示评论内容
  • 网站设计模板含数据库网站怎么做百度快照logo
  • 建平台网站费用科技 杭州 网站建设
  • 网站链接数怎么做wordpress新手教程
  • 东莞公司建网站要多少费用简述企业建设网站的必要性
  • 网站建设注意要求天津市政建设集团有限公司网站
  • 佛山网站建设哪家好用html建设网站
  • 如何设置网站子域名农家乐网站模板
  • 应用大全网站广州微信营销公司
  • 台州优化网站企业网站推广方案设计
  • 做外贸上什么网站徐水网站建设公司
  • 中山哪家建网站好如何做电商运营推广
  • 360海南地方网站上海松一网站建设
  • 专门做酒店设计的网站买下云服务器怎么做网站
  • 山丹做网站的公司个人备案经营网站备案
  • discuz论坛门户网站模板像淘客基地这样的网站如何做
  • 网站建设实力宣传海报c2c的平台有哪些
  • 学院网站设计说明书网站被百度k是什么意思