目录
1.概述
2.限定符对于代码的影响
3.小结
1.概述
上文TC3xx分析--如何提高系统运行效率(1)-CSDN博客讲解了Tasking中lsl的某些关键定义,简述了Tricore寻址模式,接下来我们继续看,不同memory限定符对于代码的影响。
2.限定符对于代码的影响
上篇文章我们发现了利用不同限定符将变量发到不用的section里,但是变量的地址始终没有变化,那这到底有什么用呢?
编译出来的C代码最终会以汇编形式展示给机器,因此我们来看看不同限定符下对于代码的影响。
1)添加__near限定符,编译得到的结构,代码如下:
uint32 __near example_x ;
uint32 __near example_y;
void main(void)
{example_x = 3;example_y=example_x+2;
}
得到汇编代码如下
解释如下:
- 将立即数3赋给寄存器D15
- 将D15的值直接赋给变量(x)
- 立即数3赋给寄存器D15
- D15和2相加
- 将D15的值直接赋给变量(y)
统计拢共5条指令完成x=3,y=x+2这个操作;
2)添加__far限定符,得到如下
uint32 __far example_x ;
uint32 __far example_y;
void main(void)
{example_x = 3;example_y=example_x+2;
}
汇编代码如下:
解释如下:
x的赋值:
- 将0x7000给到地址寄存器A15高16bit,低位补0,这时候A15 = 0x70000000
- 加载有效地址到A15,因为x地址为0x70000004,故A15 = 0x70000004
- 将数据3移至D15;
- 将D15赋给A15指向的地址
y的赋值
- 将0x7000给到地址寄存器A15高16bit,低位补0,这时候A15 = 0x70000000
- 加载有效地址到A15,因为y地址为0x70000008,故A15 = 0x70000008
- 将数据3移至D15,并加2;
- 将D15赋给A15指向的地址
总计9条指令,咋一看仅仅节省了4条指令,但从统计角度来看,效率提升了44.44%,Flash消耗更少了。
同样两行C代码,仅仅因为寻址方式的不同,汇编指令差异如此之大 ,从而影响系统运行效率。
3.小结
现在MCU的性能越来越强大,导致我在使用上越来越随意,对于这种特别底层的知识非常匮乏,直到遇到了系统优化问题,才会去从这些角度来考虑。总结下来,在系统性能优化时要注意:
- 构建memory限定符使用场景以优化代码执行效率;
- 多使用靠近CPU的memory,例如ARM TCM、Tricore DSPR、PSPR;
- DCache数据一致性问题
通过调试汇编代码,也更进一步了解了Tricore内核的运行原理;接下来,思考如何将这些理论引入到工程代码中。
就酱!