常规程序选项 - 2023.2 简体中文

Vitis 统一软件平台文档 嵌入式软件开发 (UG1400)

Document ID
UG1400
Release Date
2023-12-13
Version
2023.2 简体中文
-msmall-divides
如果不存在硬件除法器,那么该选项可生成专为小型除法最优化的代码。对于分子和分母介于 0 到 15(含)之间的有符号整数除法,此开关可以提供基于表格查找的超快除法。启用硬件除法器时,此开关无效。
-mxl-gp-opt
如果您的程序包含地址,并且地址中最高有效位部分(上 16 位)中有非零位,那么对该地址执行加载或存储操作需要 2 条指令。

MicroBlaze 处理器 ABI 可以提供 2 个全局小型数据区域,每个区域可以包含最多 64 KB 的数据。这些区域内的任意存储器位置均可使用小型数据区域锚点和 1 个 16 位即时值来访问,只需 1 条指令用于加载或存储小型数据区域即可。此最优化可使用 -mxl-gp-opt 命令行参数开启。在这些区域内可存储大小小于某一阈值的变量,并且可使用较少的指令来对这些变量进行寻址。在链接阶段内会计算这些地址。

重要: 如果当前使用该选项,则必须将其提供给程序构建进程的编译命令和链接命令。未一致使用此开关可能导致编译、链接或运行时错误。
-mno-clearbss
该选项可用于对仿真中使用的程序进行编译。

根据 C 语言标准,未初始化的全局变量分配到 .bss 节中,并且当程序开始执行时,保证这些变量的值为 0。通常这是通过 C 语言启动文件运行循环并在程序开始执行时以 0 值填充 .bss 节来实现的。最优化编译器还会将 C 语言代码中赋值 0 的全局变量分配到 .bss 节。

在仿真环境中,以上两种语言特性可能都属于并非必要的开销。部分仿真器会将整个存储器自动归零。即使在正常环境中,您也可以编写不依赖于初始为 0 的全局变量的 C 语言代码。此开关可用于这些场景。它会导致 C 语言启动文件不以 0 值来初始化 .bss 节。它还会在内部强制禁止编译器在 .bss 节内分配初始为 0 值的全局变量,而是改为将其移至 .data 节。该选项可以为您的应用改善启动时间。请谨慎使用该选项,确保不使用依赖于初始为 0 的全局变量的代码,并确保您的仿真平台不执行存储器的 0 值。

-mxl-stack-check
通过该选项,您可以检查程序运行时是否发生栈上溢。

编译器会在每个函数的序言中插入代码,并将栈指针值与可用存储器进行对比。如果栈指针超出可用内存,那么程序会跳转到子例程 _stack_overflow_exit。该子例程会将 variable _stack_overflow_error 的值设置为 1。

您可以通过在源代码中提供 _stack_overflow_exit 函数充当栈上溢处理程序,以覆盖标准栈上溢处理程序。