Tasking 编译器是嵌入式系统开发中广泛使用的专业编译器,尤其在汽车电子、工业控制等领域。本文档深入分析 Tasking 编译器的优化选项,重点关注不同优化技术的工作原理和效果,帮助开发者理解优化原理并制定有效的优化策略。
备注:逐步会分享汽车工具链的知识手册,欢迎大家一起交流学习:
如果tasking遇到问题请联系我们:
support@softor.com.cn
tianpengbo@softor.com.cn
Tasking 编译器提供了丰富的优化选项,每个选项都针对特定的代码模式或硬件特性进行优化。以下是主要优化选项的分类:
|
|
|
|
|
|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Tasking 编译器的优化选项使用 + 或 - 前缀来启用或禁用特定优化:
+option:启用该优化选项-option:禁用该优化选项例如:
+inline:启用自动函数内联-unroll:禁用循环展开Tasking 编译器提供了几个预定义的优化级别,每个级别对应一组优化选项的组合:
|
|
|
|
|
|---|---|---|---|
|
|
|
|
Alias for -OaCEFGIKLMNOPRSUVWY,-predict |
|
|
|
|
Alias for -OaCefgIKLMNOPRSUVWy,+predict |
|
|
|
|
Alias for -OacefgIkMnoprsUvwy,+predict |
|
|
|
|
Alias for -Oacefgiklmnoprsuvwy,+predict |
从 -O0 到 -O3,启用的优化选项逐渐增加:
源代码:
int add(int a, int b) {
return a + b;
}
int main() {
int x = 5;
int y = 10;
int z = add(x, y);
return z;
}
优化效果:
适用场景:
源代码:
int sum(int arr[]) {
int total = 0;
for (int i = 0; i < 4; i++) {
total += arr[i];
}
return total;
}
优化效果:
适用场景:
源代码:
int abs(int x) {
if (x < 0) {
return -x;
} else {
return x;
}
}
优化效果:
适用场景:
源代码:
int calculate() {
const int a = 5;
int b = 10;
return a + b;
}
优化效果:
适用场景:
源代码:
int sum_array(int arr[], int n) {
int total = 0;
for (int i = 0; i < n; i++) {
total += arr[i];
}
return total;
}
优化效果:
适用场景:
源代码:
int example(int x) {
x = x + 0;
return x;
}
优化效果:
适用场景:
源代码:
void multiply_array(int a[], int b[], int result[], int n) {
for (int i = 0; i < n; i++) {
result[i] = a[i] * b[i];
}
}
优化效果:
适用场景:
源代码:
int complex_expression(int x) {
return x * 2 + x * 3;
}
优化效果:
适用场景:
不同的优化选项对调试能力有不同程度的影响,以下是主要优化选项对调试的影响分析:
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-O0 或 -O1 优化级别,保留完整的调试信息性能优先场景:
-O3 优化级别+inline、+unroll、+simd、+pipeline 等激进优化代码大小优先场景:
-O2 优化级别+compact,禁用 +inline、+unroll 等增加代码大小的优化安全关键场景:
-O1 优化级别-inline、-loop、-unroll+coalesce、+cse、+expression实时系统场景:
-O2 优化级别-pipeline、-predict+unroll、+loop场景:嵌入式电机控制系统,对实时性要求高,内存受限
优化策略:
-O2 作为基础优化级别+simd 优化向量计算+unroll 优化小循环+inline 控制代码大小结果:
场景:环境监测系统,需要处理大量传感器数据
优化策略:
-O3 优化级别+simd 并行处理传感器数据+inline 优化频繁调用的处理函数+cse 优化重复计算结果:
场景:汽车安全系统,需要符合 ISO 26262 ASIL B 要求
优化策略:
-O1 优化级别-inline + -loop + -unroll+coalesce + +cse + +expression结果:
场景:低成本嵌入式设备,Flash 空间有限
优化策略:
-O2 优化级别+compact 代码压缩+inline、+unroll 等增加代码大小的优化+coalesce、+cse 等不增加代码大小的优化结果:
#ifdef DEBUG
// 调试版本:禁用优化
#pragma optimize 0
#else
// 发布版本:启用优化
#pragma optimize 2
#endif
// 对特定函数禁用优化
#pragma optimize 0
void critical_function() {
// 需要精确调试的代码
}
#pragma optimize 2
// 对特定代码段禁用优化
void function() {
// 优化代码
#pragma optimize = 0
// 需要精确调试的代码段
#pragma optimize = 2
// 优化代码
}
-g 选项生成调试符号-O0 开始,逐步增加优化级别,定位导致问题的优化选项|
|
|
|
|
|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-O0 级别作为性能基准-O1、-O2、-O3 级别的性能|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-O0 或 -O1 进行开发和调试Tasking 编译器提供了丰富的优化选项,允许开发者根据具体需求在性能、代码大小和调试能力之间取得平衡。通过理解每个优化选项的工作原理、性能影响和调试影响,开发者可以制定有效的优化策略,充分发挥硬件潜力,同时保持代码的可维护性和可靠性。
在实际应用中,建议采用渐进式优化方法:从基础优化级别开始,逐步启用特定的优化选项,同时密切关注性能变化和调试能力的影响。通过持续的测试和评估,找到最适合特定应用场景的优化组合,实现性能与可靠性的最佳平衡。
通过本文档的分析,开发者可以更深入地理解 Tasking 编译器的优化技术,从而做出更加明智的优化决策,为嵌入式系统开发提供有力支持。
如果tasking遇到使用优化等问题请联系我们:
support@softor.com.cn
tianpengbo@softor.com.cn
作者:tianpengbo / 田朋博。大家如果在项目中遇到相关技术问题,欢迎联系我交流。
support@softor.com.cn
tianpengbo@softor.com.cn
作者:tianpengbo / 田朋博。大家如果在项目中遇到相关技术问题,欢迎联系我交流。
support@softor.com.cn
tianpengbo@softor.com.cn