这个架构很简单,里面的xcore 就是它的逻辑核。他们是并行跑的,每个xcore 都有自己一套独立的寄存器组,但是不公开的,用户也没有必要知道。在运行过程中是自动处理的。那么核与核之间用什么通信的,我们叫channel 。就是右侧的xconnect 。
这个channel 很独特,在芯片核与核之间它可以提供达到1Gbps 的通信速率,所有对所有的核来说都是0延时的。还有另外一个独特的地方,就是,如果你板子上有两颗芯片,也可以用xconnect 连起来,而且他们之间的通信速度可以达到500mbps ,也是0延时的。而且这个距离可以几米远!对于软件开发的工程师来讲就相当于拿到一个大的芯片在用,比如,如果用两个8核的芯片,那么就相当于在一个16个核的芯片上做开发。
xmos 芯片的概念就是用软件去实现arm 的芯片的硬件外设(当然是数字的才行),这个听起来好像是fpga ,但是编程语言大部分都是c 和c++ ,有部分xc ,只有十多条的语句,而且xc 的语句都是高阶的语言,类似c++ ,例如:定义一个timmer就用关键字‘timmer’ 。定义一个port 就用‘port'' 。定义核与核通信的管道就用’chanend‘。
那么它如果做到用软件去实现硬件外设的功能呢?例如如果你下载xsoftip 的话会发现里面有很多外设,包括以太网的MAC .它是如何做到的呢?这里还要依赖于它的实时灵活的gpio ,我们来看下面的图:
这个gpio 不是普通的gpio , 每个gpio 都有这5种灵活的功能,而且是独立执行的,不需要cpu 干预的,这个就大大减轻了cpu 的负担,这个跟传统的arm 的芯片去软件模拟外设还是完全不一样的。arm 的芯片去模拟串口的话,要cpu 一直在处理gpio , 还要结合中断响应,处理中断。我们来看一下,xmos 是如何实现uart 的:
这个就是uart 发送数据的函数,波特率是115200 。很简单吧,而且时间非常精准,一定是8.68us 发送一个bit 数据。同时你也可以采用我们的时间分析工具(xta)去分析这个uart 的波形和时间精准度。
总的来说,xmos 是一个实时性的多核mcu ,在实时性方面比传统的mcu 快很多,有下面的数据作为参考:
http://www.xmos.com/download/public/Benchmark-Methods-to-Analyze-Embedded-Processors-and-Systems(X7638A).pdf
M3 Test
Responses Best Average Worst
1 690 739.47 4040
2 690 1495.40 5550
3 690 2426.56 7600
4 690 3542.61 10260
PIC Tests
Responses Best Average Worst
1 1976 2137.69 2196
2 1972 3396.78 4712
3 1976 4691.53 7340
4 1976 5967.98 9856
XMOS Tests
Responses Best Average Worst
1 160 185.01 210
2 160 190.13 220
3 170 191.94 220
4 160 209.21 250
同时xmos 还是一个时间可确定的架构,因为没有中断,不涉及出栈入栈(应该说硬件自己处理了)的动作,所有你的代码执行时间是完全可预测的,例如,你的代码第一行到第100行需要多少时间执行是可以通过开发工具里面的时间分析工具算出来的。大家可以试试看。
那么开发这个xmos 的芯片难不难呢? 它里面怎么用并行运行呢? 其实也不难,我们来看下面的main 函数。
int main()
{
chan c_sof;
chan c_xud_out[NUM_EP_OUT];
chan c_xud_in[NUM_EP_IN];
chan c_aud_ctl;
chan c_mix_out;
#ifdef MIDI
chan c_midi;
#endif
set_port_clock(p_for_mclk_count, clk_audio_mclk);
par {
#if (AUDIO_CLASS==2)
XUD_Manager(c_xud_out, NUM_EP_OUT, c_xud_in, NUM_EP_IN,
c_sof, epTypeTableOut, epTypeTableIn, p_usb_rst,
clk, 1, XUD_SPEED_HS, null);
#else
XUD_Manager(c_xud_out, NUM_EP_OUT, c_xud_in, NUM_EP_IN,
c_sof, epTypeTableOut, epTypeTableIn, p_usb_rst,
clk, 1, XUD_SPEED_FS, null);
#endif
{
thread_speed();
Endpoint0( c_xud_out[0], c_xud_in[0], c_aud_ctl, null, null);
}
{
thread_speed();
buffer(c_xud_out[1], c_xud_in[2], c_xud_in[1],
c_xud_out[2], c_xud_in[3], c_xud_in[4],
c_sof, c_aud_ctl, p_for_mclk_count);
}
{
thread_speed();
decouple(c_mix_out,
#ifdef MIDI
c_midi,
#else
null,
#endif
null);
}
{
thread_speed();
audio(c_mix_out, null, null);
}
#ifdef MIDI
thread_speed();
usb_midi(p_midi_rx, p_midi_tx, clk_midi, c_midi, 0);
#endif
}
return 0;
}
上面的main 函数看起来很熟悉吧,其实跟arm 的开发语言差不多,但其中有一个关键字‘par'' ,不知道大家留意没有,在par 里面的函数都是并行运行的。例如:
par{
{
func(1); //run on core 0
}
{
func(2);//run on core 1
}
.......
}
par里面的大括号每个大括号就在一个核里面跑,有几个大括号就用到几个核。大括号里面你可以有一个函数,也可以写1000行,但是都是顺序执行的了。每个括号与括号之间没有优先级,都是同样的,他们之间通讯就用chanend ,这个上面有讲。 那么每个核的速度有多快呢? 我是不是只用一个核的话就快很多呢? 并不是,每个核的速度最快就是1/4 主频,即使你用一个核也是这个速度。因为:
他们是逻辑核,时钟是平均分配的!
今天就先讲这么多,总的说来,实时性,时间可确定性,灵活性是这个芯片的特点。开发工具有时间分析工具也是新东西,大家可以学学,其次就是加密性能,和代码可动态加载,多层代码支持(因为它是程序存储在外面的spi flash 里面,上电的时候加载进来sram 里面跑)也是不错的优点。缺点就是,要有操作系统的概念去开发,从传统的流水线设计程序到并发性设计,把单任务的代码,分散到多任务,对某些工程师来讲还是有一定挑战性的 。
说了那么多,那么这个芯片的价格怎么样呢? 网上有详细的价格,好像也不贵哦。
Product Name Part Number Cores / Tiles I/O RAM / OTP Unit Pricing
(100 units) Buy
XS1-L4-64 XS1-L4A-64-TQ48-C4 4 / 1 28 64 / 8 US$ 2.95 Contact XMOS Sales
XS1-L4A-64-TQ48-I4 4 / 1 28 64 / 8 US$ 3.69
四个核的芯片,48脚的,公开售价才2.95美金。拿到这个芯片相当于拿到四个cortex-m3的芯片,因为每个核可以跑100mhz ,平均下来一个核才0.74美金不到,很划算。那这个芯片都有谁在用啊?
据说xmos 客户很多,大部分现在都在音频客户,还有车载,全球很有名的汽车也用xmos 做音频的传输(avb),看样子工控,马达控制和工业通信总线也是一大块。
转自 wilson 的博客: http://blog.sina.com.cn/s/blog_4e0ba08f0101derl.html