谈谈我们的平台,北大众志小本(MPRC)。在没有开发板和FPGA资源紧缺的情况下,我们唯一的选择:北大小本。
我们的目标产品是基于国产嵌入式架构Unicore的Android平板电脑。
(unicore是北大开发出来的国产嵌入式架构,相当于arm,power pc ,mips等。说句实话,没人能保证我们的pad出来后会有市场份额,而且我们的核是unicore,系统是2.1;算了,这个不能说太多。毕竟是国家项目,作为小罗罗的我们只负责做好自己的事。)
为了今后目标产品的开发,我们先积累开发经验。
google的android源码是基于arm,而我们的核是unicore架构的。我们有自己的指令集,有自己的编译器。这个就为android的移植工作带来了不少的麻烦。bionic中c库的实现,系统调用等等, 反正与架构相关的代码都得该。当然,这部分工作是北大自己做的。我们拿到编译好的二进制文件就行了。dalivik中解释器指令我们也得用unicore的汇编来实现,这部分工作本来是由复旦负责的。不太放心,我们自己也去移植了dalvik,目前还在测试中。至少这两部分工作,对于Arm 平台的移植人员来说不用考虑。另外,前期我们在图形那一块搞得很纠结,例如surfaceflinger和libpixflinger很多内嵌汇编,arm写的晦涩难懂,移植起来很麻烦或者说工作量很大。只能用c实现,这样图形性能我们和Arm的就差一个档次。(还好后来有硬件加速)
223 void ARMAssembler::MLA(int cc, int s, 224 int Rd, int Rm, int Rs, int Rn) { 225 if (Rd == Rm) { int t = Rm; Rm=Rs; Rs=t; } 226 LOG_FATAL_IF(Rd==Rm, "MLA(r%u,r%u,r%u,r%u)", Rd,Rm,Rs,Rn); 227 *mPC++ = (cc<<28) | (1<<21) | (s<<20) | 228 (Rd<<16) | (Rn<<12) | (Rs<<8) | 0x90 | Rm; 229 } 230 void ARMAssembler::MUL(int cc, int s, 231 int Rd, int Rm, int Rs) { 232 if (Rd == Rm) { int t = Rm; Rm=Rs; Rs=t; } 233 LOG_FATAL_IF(Rd==Rm, "MUL(r%u,r%u,r%u)", Rd,Rm,Rs); 234 *mPC++ = (cc<<28) | (s<<20) | (Rd<<16) | (Rs<<8) | 0x90 | Rm;
在前期的工作中,我们一遇到ARM的汇编就头疼。还好现在那部分工作都解决了,或者说不能解决的都不了了之了。
当然,我们小组有一个技术强人,这会让团队少走很多弯路。
搞了几个月,我们的最小系统终于跑起来了,但是效果没法看。