设置对象section的另一种方法是使用 pragma section。 通过使用编译指示section,可以通过为整组对象设置编译指示section,轻松地将多个对象定位到用户定义的section中。 该组必须包含在 pragma section 指令中才能正确设置该section和该section的属性:

#pragma section "<name>" [<flags>] [<alignment>]
<objects>
#pragma section

  1. <name>——指定对象(变量、类型或函数)应位于的section的名称。
  2. <flags> ——可以通过该参数设置其他标志。 这些 pragma section的标志可用:

a allocatable. 可定位的,该项总是置位This is always set

B uninitialized 未初始化的

w writable 可写的
x executable 可执行的

s using small addressing  使用小地址

z using absolute addressing 使用绝对寻址

  1. <alignment> ——section的对齐。 它必须是 2 的幂值(例如 1, 2, 4, 8 ...)。 设置标志或编译指示section的对齐是可选的。

默认对齐方式<alignment>取决于定义的数据,而默认标志<flags>是 a 和 w。

要在 pragma section 指令定义的section中分配代码,必须设置 x 标志<flags>。

可执行意味着只有代码将位于此section中,而编译指示section中的所有数据将位于默认数据section中。 没有 x 标志的编译指示section用于分配数据。

如果要将数据放入小的或绝对可寻址的内存区域,对于小型可寻址内存区域使用 .sdata 或者 . sbss 开头,绝对可寻址的内存区域以.zdata. 或 . zbss开头 。 这是告诉链接器将数据放入适当的内存区域的唯一方法。

【注意】代码和数据编译指示可以嵌套。

例子

在这两个示例中,#pragma section“.text”中的所有代码都将放在 .text section中。 命令#pragma section ".data.mysection" 将所有全局未/初始化的数据放在.data.mysection的section中。

例1

#pragma section ".text" ax
#pragma section ".data.mysection" aw
int foo data;
#pragma section
int
foo(void)
{
int i;
...
return (foo data + i);
}
#pragma section

Example 2
#pragma section ".data.mysection" aw
#pragma section ".text" ax
int foo data;
int
foo(void)
{
int i;
...
return (foo data + i);
}
#pragma section
#pragma section

限制

在 1 字节section对齐的section中,整数可能位于奇数地址。 这将导致程序出现故障,因为编译器使用 st .w 和 ld .w 指令来访问整数。 但是 st .w 和 ld .w 指令仅对访问 16 位对齐的内存位置有效。

示例 3

如果您使用也在中断中访问的全局变量,则这些变量的原子加载修改和存储将是必不可少的。 为了解决这个问题,用户应该在一个 4 字节section对齐的绝对可寻址区域中定义这些变量。 在以下示例中,位域 Bits 是通过 #pragma section“.zdata”分配的。 对应于 TriCore EABI,位域的对齐取决于其大小。 如果大小为 4 字节section,则位域的对齐方式为 4 字section。

volatile struct {

unsigned int bit0 :1;
unsigned int bit1 :1;
unsigned int bit2 :1;
unsigned int field :3;
unsigned int dummy :16;

} T Bits;

#pragma section ".zdata" awz
T_Bits Bits;
#pragma section

选项 -funsigned-bitfields 是根据 TriCore EABI 规范默认设置的。

例子

以下示例显示如何使用 pragma section定义变量的section。

1.整型变量 a 位于名为.sdata. relative  的 2 字section对齐section中。 此section是可分配的 (a)、可写的 (w) 和可小寻址的 (s):

请注意该section名称中的前导点。

#pragma section ".sdata.relative" aws 2 //opening pragma section
int a;
#pragma section //closing pragma section

2.在下例中,编译指示section用于定位用户定义section .fastram 中的函数 int foo (void)。

#pragma section ".fastram" ax
int foo (void);
#pragma section

3.在下例子,函数 int foo (void) 和 int bar(void) 位于 .code section。 由于此 pragma section设置了 x 标志,因此除函数外的所有对象都将忽略它。所以变量 a 被定位为common symbol 。

#pragma section ".fastram" ax
int a;
int foo (void);
int bar (void);
#pragma section

4.在此示例中,函数声明包含在没有设置 x 标志的编译指示section中。

此 pragma section仅对变量有效。 变量 a 和 b 位于 .sdata.relative 段中。 函数 int foo(void) 的编译指示section被忽略,该函数位于默认段. text 。

#pragma section ".sdata.relative" aws
int a;
int b;
int foo (void);
#pragma section

5.编译器支持静态变量的编译指示

#pragma section ".sdata.foo" aws
static unsigned short s1;
#pragma section

输入section .sdata.foo 将由默认链接描述文件定位在输出section .sdata 中。

要获取有关 s1 的符号信息,请使用以下命令之一“. tricore-objdump” 显示起始地址、输出section、大小和符号名称。

tricore-objdump --syms test.o | grep s1
tricore-nm -f sysv test.o | grep s1

条目 d 将变量 s1 标记为静态变量。 全局符号用 D 标记。

【注意】静态变量不会显示在链接器的 Mapfile 中。

-Wno-deprecated-pragma-section-name, -Wdeprecated-pragma-section-name

选型 -Wdeprecated-pragma-section-name默认是置位的,如果section name没有被引号括起来,它会发出警告。

选项-Wno-deprecated-pragma-section-name 将允许使用旧语法并迁移遗留代码。

#pragma section .foodata aw
short z = 1;
#pragma section

Pragma section相关推荐

  1. VC中的宏 (#define) 与预处理 (#if/#ifdef/#pragma) 的使用方法总结。

    C/C++ 预定义宏 例子:C/C++ 预定义宏的取值 C/C++ 预定义宏用途:诊断与调试输出 CRT 的诊断与调试输出:assert, _ASSERT/_ASSERTE, _RPTn/_RPTFn ...

  2. #pragma预处理命令

    #pragma可以说是C++中最复杂的预处理指令了,下面是最常用的几个#pragma指令: #pragma comment(lib,"XXX.lib") 表示链接XXX.lib这个 ...

  3. #pragma用法详解

    #pragma预处理命令 #pragma可以说是C++中最复杂的预处理指令了,下面是最常用的几个#pragma指令: #pragma comment(lib,"XXX.lib") ...

  4. html页面中漂浮物怎么实现,html的section标签是什么怎么用了

    cross-section是什么意思 cross-section的意思:横断面,剖面(图);(原子)核(被撞)截面. cross-section 英 [ˈkrɒs sekʃn] 美 [ˈkrɔːs s ...

  5. 智能车竞赛技术报告 | 节能信标组 - 重庆大学- 赛博坦汽车人联盟

    简 介: 本文以第十六届全国大学生智能车竞赛为背景,介绍了智能赛车控制系统 的软硬件结构和开发流程.该比赛采用自主设计的车模和硬件,使用LCC谐振电路接收无线充电能量并存储在超级电容组中,以英飞凌的T ...

  6. 智能车竞赛技术报告 | 电磁越野组 - 哈尔滨工业大学 - 紫丁香三队

    简 介: 本文详细介绍了我们为了十六届全国大学生智能车大赛室外越野组准备的车模.车模采用Infineon公司的TC377芯片作为控制器,通过电感采集数据,并离线训练神经网络,后使用nnom部署到单片机 ...

  7. 智能车竞赛技术报告 | 节能信标组组 - 内蒙古大学创业学院 - 骄阳一队

    简 介: 本文以第十六届全国大学生智能汽车竞赛为背景,介绍了节能信标组智能车设计方案.智能车系统采用自制车模,以英飞凌公司的TC264微控制器作为核心控制器,智能车利用差速获取当前赛车的车身姿态,由车 ...

  8. 英飞凌AI越野组入门教程

    逐飞科技 2021-02-03 Wednesday   该学习教程由英飞凌委托"逐飞科技"探索.验证并完成教程编写,现在公开发布给所有电磁越野组的参赛同学参考使用,如果同学们试图采 ...

  9. (十二)进一步掌握STVD/COSMIC

    如何分配变量到指定的地址 举例: unsigned char temp_A@0x00; //定义无符号变量temp_A,强制其地址为0x00 unsigned char temp_B@0x100; / ...

最新文章

  1. 一次HP 阵列卡排障
  2. 从零单排学Redis【铂金二】
  3. 实现一个正则表达式引擎in Python(二)
  4. SpringBoot集成Cache缓存(Redis缓存,RedisTemplate方式)
  5. java excel 数据有效性_poi操作excel设置数据有效性
  6. 数据堂智能语音数据库,让客服更智能
  7. vscode之npm不是内部活外部命令
  8. 编写Linux Shell脚本的最佳实践
  9. 同网段的VLAN隔离
  10. GoComb.com搜索引擎问世:改进搜索体验
  11. android工程角度相机,anglecam角度相机软件下载
  12. 小学生python编程教程-极度舒适的全套 Python 入门教程,小学生看了也能学会
  13. 【从本人QQ空间迁移】业务知识通俗理解
  14. iOS疯狂详解之启动分层引导动画
  15. oracle 计算 符号优先级,oracle 表达式运算符优先级
  16. 一元多项式计算器C语言实现
  17. qlv如何转换为mp4格式?怎样将qlv转换成mp4格式?
  18. 极光推送Cordova插件适配Capacitor
  19. android横向瀑布流布局,GitHub - wikison/android_waterfall: Android版的瀑布流布局
  20. 【TOP期刊推荐】JCR1区网络计算类重点SCI期刊征稿中~

热门文章

  1. 启动vue项目出现的错误合集
  2. 皮革行业分销渠道管理系统有效缩短供销链,提升渠道运营收益
  3. PCL入门系列 —— PassThrough 直通滤波、点云裁剪
  4. 全网首发:OpenJDK如何支持字体的kerning及BUG号
  5. ASP.NET 复习资料
  6. 字符输出流 (Write)
  7. lsdyna如何设置set中的node_list_为 Windows PowerShell 设置 User Alias (命令别名)
  8. ToF相机从Camera2 API中获取DEPTH16格式深度图
  9. zynq linux tf卡系统升级,zynq之TF卡写入常见问题
  10. 男人。。。女人。。。经典语录