[通用 MCU]

TC3xx分析--如何提高系统运行效率(2)

[复制链接]
592|1
手机看帖
扫描二维码
随时随地手机跟帖
tpgf|  楼主 | 2024-6-7 12:11 | 显示全部楼层 |阅读模式
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;
}
得到汇编代码如下

218286662885733b79.png

解释如下:

将立即数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;
}
汇编代码如下:

3459366628861866b6.png


解释如下:

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内核的运行原理;接下来,思考如何将这些理论引入到工程代码中。
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/djkeyzx/article/details/139297404

596446662886628897.png

使用特权

评论回复
gouguoccc| | 2024-6-10 22:54 | 显示全部楼层
我晕,又是转载贴子啊。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1591

主题

14584

帖子

10

粉丝