No.106974 作者:哈佛 邮件:jola2002@163.com ID:29699 登陆:81次 QQ:5822022 -- MSN:jola2005912@hotmail.com 文章数:185篇 最后登陆IP:218.17.158.164 最后登陆:2014/12/16 13:54:00 注册:2005/1/6 19:18:03 财富:1280 发帖时间:2014/7/5 11:49:25 发贴者IP:112.95.12.62 标题:哈佛:XMOS是什么样的芯片 摘要:No.106974XMOS是什么样的芯片 目前为止我知道它是一个多核处理器。是逻辑核,不是真的硬件核心。 但是它在芯片硬件层帮你实现了一个实时性的操作系统,你知道实时性的操作系统是很贵的,类似safertos 商用级别的话要几十k美金。 这个芯片的架构有别与以往所有芯片的架构,不是8051 ,也不是fgpa ,也不是arm 。我们来看一下: 这个架构很简单,里面的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 快很多,有下面的数据作为参考: (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_ ......
>>返回讨论的主题
|