LIteOS新鲜支持——Xtensa
0前沿
今天看到LiteOS新增加最组件,特意来学习一下,Xtensa,估计很多人没听过,那就一起看看吧。
1、啥是Xtensa?
首先要说一下Tensilica,Tensilica 是一个迅速成长的公司,公司主要产品是在专业性应用程序微处理器上, 为现今高容量嵌入式系统提供最优良的解决方案。 公司成立于1997年7月。公司创始的几名主要干部与高级经理都学有专精。 其专业技术包括有四个领域: 微处理器构架、 ASIC 与VLSI 设计、 高级软件开发与电子设计自动化(EDA)。 本公司率先研发出世界第一个可以自由装组、 可以弹性扩张的微处理器构架;并提供一个技术支持环境, 让嵌入式系统工程师可以用最少的时间做出性能更好、 集成度更高的单芯片系统。
1998 年后半年, Tensilica 开始与初期顾客密切合作, 到1999 年2 月公开推出标竿产品── 一系列可以自由装组、 可以弹性扩张的处理器产品。
总是,Tensilica是一家IP设计商。
今天的主角Xtensa就是Tensilica公司开发一款处理器。
2、Xtensa有啥特点呢?
通常处理器拥有16个左右通用寄存器用于存储运行时处理器的状态、数据、控制信息,在比较复杂的程序上需要进行频繁的入栈和出栈操作,这种频繁读写内存的栈操作大大降低了程序的性能。为减少栈操作次数,Tensilica的Xtensa架构设计了一种Windows旋转的寄存器管理机制。该机制将逻辑寄存器和物理寄存器分开,在函数调用的时候通过Windows滑动切换逻辑寄存器所映射的物理寄存器,在物理寄存器被使用完毕前均不需要进行入栈和出栈操作,从而提高性能。
Xtensa 的指令集架构类似于 RISC,并对嵌入式应用场合做了多种优化。在移植操作系统时要留意以下几方面:
- 变长指令
- 窗口(window)寄存器
- 处理器的可配置性
- 处理器的可扩展性(可通过 TIE 描述语言为 Xtensa 添加新的指令)
3、滑窗机制
基本实现原理:使用更多的物理AR寄存器组成一个环形的buffer。这些寄存器每4个为一组(pane),WindowStart中的每个比特依次表示该组是否作为逻辑寄存器窗口的起始位置或者被占用。当前的逻辑寄存器的起始位置则用WindowBase状态寄存器来表示。在发生函数调用的时候是通过修改WindowBase寄存器,滑动逻辑寄存器窗口,从而父子函数看到的是不同的物理寄存器,避免了寄存器的压栈和出栈。
以每4个寄存器(pane)为单位,函数调用的时候窗口可以滑动4个,8个或者12个物理寄存器,分别可以用call4,call8,call12指令来实现,而最典型的应用则为call8。
- a0用来保存函数返回地址
- a1保存sp堆栈指针
- a2~a7用来传递函数入参,参数超过6个的时候则需要使用堆栈
- 对调用者函数和被调用函数来说,a0~a7是独立的寄存器,可以自由使用,而a8~a15则为scratch寄存器,随时会被子函数使用,调用者函数如果要使用,则在调用子函数前进行压栈保存。
4、汇编代码
部分底层驱动只能使用汇编语言编写,比如:
- 用户异常处理
- 内核异常处理
- window处理
- 复位处理
例如:
/*
KernelExceptionVector
This implements the kernel exception vector and transfers control to the KernelExceptionHandler.
*/
.section .KernelExceptionVector.text, "ax"
.begin literal_prefix .KernelExceptionVector
_KernelExceptionVector:
wsr.excsave1 a3
movi a3, _KernelExceptionHandler
jx a3
.end literal_prefix
5总结
Xtensa是个神奇的MCU架构,提高一定的效率,但是也是提高MCU的复杂度,也算是一种平衡吧
- 点赞
- 收藏
- 关注作者
评论(0)